「校招季」校招的准备 And 复习的知识点
基本流程
校招的套路基本都是宣讲会 — 笔试 — 技术一面 — 技术二面(大公司会到技术三面乃至终面)。
校招信息获取渠道
- 各大微信公众号(搜索「城市名+校招」)
- 校招网站(搜索「企业名+校招」)可以找到企业的校招信息。
- 第三方招聘网站。这里我推荐「海投网」,宣讲会信息十分全。
注:不建议选择「海投」的方式,这种耗费大量时间精力的方式, 投入产出比可能比较低。根据自己的兴趣,公司的规模,公司的发展前景等,有选择性地投递简历。一个人的精力是有限的,把精力投入在优选出来的公司上,效果可能更优。
找准岗位方向
在找工作之前,明确自己的技术方向,是一件非常重要的事情。大多数人往往会被某些所谓的热门技术,高薪酬等所诱惑,怀疑自己的方向选择,什么岗位都去投一下简历。这在我看来是非常不好的,盲目地投递简历十分浪费时间精力。
如果你本来就参加过实验室项目和比赛,我想你对自己的技术方向定位应该是很清晰的了。
阅读大量笔试题和面试题
第一关的笔试题考核,是为了筛掉基础差的人。基础差的人,在工作中很难去解决技术问题,要么解决问题速度非常慢。
所以说笔试是首要解决的问题。一般来说笔试题考的范围比较广,占比最大的是「专业技术」和「数据结构」。「专业技术」指的是你的技术方向。「数据结构」指 算法和数据结构。越是大公司,越喜欢考察算法和数据结构基础。我参加的大部分笔试基本上 1/2 数据结构题 + 1/4 算法 + 1/4 java。(没看错,就是招的Android开发。)
当初我刷题是用的「牛客网」,网站体验不错,题目质量也不错。同时上面也有一些校招信息。其它同类型的刷题网站,例如 leetcode ,就看自己喜好了。
热门技术了解
除了基础外,你还应该对其他领域的知识有多少有所涉猎。你需要多了解一点新技术与科技前沿,你才能和面试官谈笑风生。
博客
从产品角度讲, 一个长期的价值博客是一份很好的简历。
从技术角度讲,持续的写作逼迫你不断学习,你将害怕有一天写无可写。
不过因为应届生熟悉大量笔试题和面试题需要花费相当多的时间,对于后面要找工作又不想没有完成技术文章累积的,可以写笔试面试题文章来完成每周撰写技术文章的任务。当然,文章不能是简单的答案,还需要自己的分析和理解。
面试的准备
准备 2 份自我介绍,一份 2 分钟,一份 5 分钟。根据情况选择不同时长的自我介绍。
建议自我介绍包括这些部分:
- 客观情况介绍,姓名,学校,专业,学历,应届还是非应届
- 应聘职位
- 和应聘职位有关的学习和实习经历。(成绩、各种荣誉……挑闪光点说,因为你说的,待会儿可能就会变成他面的重点)
- 特别突出的个人能力(以获得的奖项为依据)。如果没有,略过。
- 为什么申请这个职位,对公司的了解,对职位的理解并与自身匹配,对自己的定位,对未来工作的期望
面试官会从你的简历里挖什么?
面试官和你的对话一般是从简历里你熟悉的内容展开的,所以你需要好好回顾你的项目。
具体项目面试需要准备哪些方面,面试官会问些什么内容,可以阅读怎样一个漂亮的项目介绍 And 面试官到底在考察什么?
最后
面试还是要保持良好的心态,只要充分地展示平时自己的所学就可以了。不要把面试当作面试,看作一次技术交流,把心态从我要找到一份工作转变为我要通过面试去发现不足、提升自己,这样就会平和多了。应届面试者还可以和面试官交流你项目中解决方案的优化,对比企业级项目采用的不同的方式,也可以准备好自己的技术疑问,面试官一般会很愿意解答,你将有很大收获。
那么接下来,即将着手准备校招,从哪里开始准备呢?首先是基础。
基础这东西,各个公司都很看重,尤其是大公司,他们看中应届生的潜力,舍得花精力去培养,所以基础是重中之重。项目经历少怎么办?那就去打牢基础。
Java
- 多线程
这是必问的一块了
-
常用的线程池有几种?
-
这几种线程池之间有什么区别和联系?线程池的实现原理是怎么样的?
-
给你一些具体的场景,让你回答这种场景该使用什么样的线程池比较合适。
-
多线程同步
-
实现多线程的两种方法:Thread与Runable。
-
线程同步的方法:sychronized、lock、reentrantLock等。
-
锁的等级:方法锁、对象锁、类锁。
有前辈已经总结了40个Java 多线程的面试题,可以看看
-
网络
-
IO
IO 分为 File IO 和 Socket IO,File IO 基本上是不会问的,问也问不出什么来,平时会用就好了,另外记得 File IO 都是阻塞 IO。
Socket IO 是比较重要的一块,要搞懂的是阻塞 / 非阻塞的区别、同步 / 异步的区别,借此理解阻塞 IO、非阻塞 IO、多路复用 IO、异步 IO 这四种 IO 模型,Socket IO 如何和这四种模型相关联。
这是基本一些的,深入一些的话,就会问 NIO 的原理、NIO 属于哪种 IO 模型、NIO 的三大组成等等,这有些难,当时我也是研究了很久才搞懂 NIO。提一句,NIO 并不是严格意义上的非阻塞 IO 而应该属于多路复用 IO,面试回答的时候要注意这个细节,讲到 NIO 会阻塞在 Selector 的 select 方法上会增加面试官对你的好感。
-
注解
-
常见关键字的意义
-
面向对象的基础知识
-
GC 类型,时机等
-
字符编码
-
九种基本数据类型的大小,以及他们的封装类。
-
Switch 能否用 String 做参数?
-
equals 与 == 的区别。
-
Object有哪些公用方法?
-
Java的四种引用,强弱软虚,用到的场景。
-
try catch finally,try里有return,finally还执行么?
-
Override 和 Overload 的含义去区别。
-
Interface 与 abstract 类的区别。
-
Static class 与non static class的区别。
-
java多态的实现原理。
-
写出生产者消费者模式。
-
ThreadLocal 的设计理念与作用。
-
ThreadPool 用法与优势。
-
wait() 和 sleep() 的区别。
-
foreach 与正常 for 循环效率对比。
-
反射的作用与原理
-
泛型常用特点,List<String>能否转为List<Object>
-
解析 XML 的几种方式的原理与特点:DOM、SAX、PULL
-
JNI 的使用
JVM
- 内存模型以及分区,需要详细到每个区放什么。
- 堆里面的分区:Eden,survival from to,老年代,各自的特点。
- 对象创建方法,对象的内存分配,对象的访问定位。
- GC的两种判定方法:引用计数与引用链。
- GC的三种收集方法:标记清除、标记整理、复制算法的原理与特点,分别用在什么地方,如果让你优化收集方法,有什么思路?
- GC收集器有哪些?CMS收集器与G1收集器的特点。
- Minor GC与Full GC分别在什么时候发生?
- 几种常用的内存调试工具:jmap、jstack、jconsole。
- 类加载的五个过程:加载、验证、准备、解析、初始化。
- JVM中 OOM 你遇到过哪些情况,SOF 你遇到过哪些情况。
JVM问题没怎么变,内存模型和GC算法这块问得比较多
操作系统
- 线程和进程的关系
- 线程安全
- 死锁的产生和解决
- 进程的几种状态
- IPC 几种通信方式
- 虚拟地址、逻辑地址、线性地址、物理地址的区别
- 什么是虚拟内存
数据库
一些基本的像 union 和 union all 的区别、left join、几种索引及其区别就不谈了,比较重要的就是数据库性能的优化,如果对于数据库的性能优化一窍不通,那么有时间,还是建议你在面试前花一两天专门把 SQL 基础和 SQL 优化的内容准备一下。没时间的话可以不复习,一般公司的面试数据库比重不高。
eg:
- 数据库存储过程
TCP/IP
-
OSI与TCP/IP各层的结构与功能,都有哪些协议。
-
TCP与UDP的区别。
-
TCP报文结构。
-
TCP的三次握手与四次挥手过程,各个状态名称与含义,TIMEWAIT的作用。
-
TCP拥塞控制。
-
TCP滑动窗口与回退N针协议。
-
Http的报文结构。
-
Http的状态码含义。
-
Http request的几种类型。
-
Http1.1和Http1.0的区别
-
Http怎么处理长连接。
-
Cookie与Session的作用于原理。
-
电脑上访问一个网页,整个过程是怎么样的:DNS、HTTP、TCP、OSPF、IP、ARP。
-
Ping的整个过程。ICMP报文是什么。
-
C/S模式下使用socket通信,几个关键函数。
-
IP地址分类。
-
路由器与交换机区别。
网络其实大体分为两块,一个TCP协议,一个HTTP协议,只要把这两块以及相关协议搞清楚,一般问题不大。
算法和数据结构
常用的数据结构概念的实现原理
- array
- vector
- list
- set
- map
- tree
非常重要,也是必问的内容。基本上就是 List、Map、Set,问的是各种实现类的底层实现原理,实现类的优缺点。
集合要掌握的是 ArrayList、LinkedList、Hashtable、HashMap、ConcurrentHashMap、HashSet 的实现原理,能流利作答,当然能掌握 CopyOnWrite 容器和 Queue 是再好不过的了。另外多说一句,ConcurrentHashMap 的问题在面试中问得特别多,大概是因为这个类可以衍生出非常多的问题,关于 ConcurrentHashMap,可以参考以下问题:
(1)ConcurrentHashMap 的锁分段技术
(2)ConcurrentHashMap 的读是否要加锁,为什么
(3)ConcurrentHashMap 的迭代器是强一致性的迭代器还是弱一致性的迭代器
题目示例:
-
HashMap实现原理
-
HashTable和HashMap区别
-
Hashtalbe与ConcurrentHashMap区别
-
ArrayList、LinkedList、Vector的区别。
-
Map、Set、List、Queue、Stack的特点与用法。
-
HashMap 和 ConcurrentHashMap 的区别
-
链表与数组。
-
队列和栈,出栈与入栈。
-
链表的删除、插入、反向。
-
字符串操作。
-
Hash表的hash函数,冲突解决方法有哪些。
-
各种排序:冒泡、选择、插入、希尔、归并、快排、堆排、桶排、基数的原理、平均时间复杂度、最坏时间复杂度、空间复杂度、是否稳定。
-
快排的partition函数与归并的Merge函数。
-
对冒泡与快排的改进。
-
二分查找,与变种二分查找。
-
二叉树、B+树、AVL树、红黑树、哈夫曼树。
-
二叉树的前中后续遍历:递归与非递归写法,层序遍历算法。
-
图的BFS与DFS算法,最小生成树prim算法与最短路径Dijkstra算法。
-
KMP算法。
-
排列组合问题。
-
动态规划、贪心算法、分治算法。(一般不会问到)
-
大数据处理:类似10亿条数据找出最大的1000个数.........等等
-
前序中序 输出层次遍历序列
-
求树高
-
是否是平衡二叉树
-
广度遍历、深度遍历
-
动态规划和贪心的区别
-
大整数加、减、乘、除、求模运算实现
-
很多整数,找其中出现次数最多的那个数
-
单链表翻转(两个指针如何实现)、查找、删除、插入以及双向链表、有序链表合并
-
判断一个整数是否是2的整数次幂.(n&(n-1))
-
常见排序算法的实现以及稳定性(快排跟归并考的很多)
-
字符串翻转(O(n))、匹配(KMP算法)
-
最长递增子序列(nlogn的算法)
-
链表判断是否有环,环的入口,两个链表是否相交(快慢指针)。
-
指定一个数组,求2个数的和等于指定的和(某一个数),如果是3,4,5,n个等于个的和(某一个数)呢?(可以看作背包问题)
-
跳台阶问题
设计模式
- 单例(懒汉、饿汉)
- 工厂
- 适配器
- 责任链
- 观察者
面试中关于设计模式的问答主要是三个方向:
(1)你的项目中用到了哪些设计模式,如何使用
(2)知道常用设计模式的优缺点
(3)能画出常用设计模式的 UML 图
Android
-
Activity启动模式区别
-
四大组件生命周期
-
如何对产生 ANR 代码定位
-
检查内存泄露的工具
-
横竖屏切换时,Activity 的生命周期以及如何设置横屏或者竖屏
-
Android 主线程与子线程的理解
-
怎么做性能优化
- UI优化
- 减少过度绘制
- 不必要嵌套布局
- 利用include标签来复用控件等等
- 内存优化
- 缓存
- UI优化
-
Android的屏幕适配方案
-
图片适配
不同像素密度的手机加载工程资源文件(res)中不同资源图片 -
dimens.xml文件适配
dimens.xml存在于工程资源(res)文件夹中不同values(如:value-1280x720、value-800x480)文件夹下,可用于指定控件大小,不同像素密度手机加载不同values文件夹下的dimens.xml文件 -
布局文件适配(工程比较浩大,不常用)
不同分辨率的手机,加载不同的布局文件已达到适配效果。创建多个layout(如:layout-1280x720、layout-800x480)文件夹用于存放不同像素密度手机所需布局文件。 -
代码适配
通过android相应api获取当前手机的宽高像素值,按比例分配屏幕中控件的宽高以达到适配效果 -
权重适配
通过android提供的(权重)剩余空间分配,已达到适配效果
-
-
ListView优化
-
Java具备内存回收机制,为什么Android还会出现内存泄露?写出三个内存泄露的场景。
-
说说你知道的当前几个比较火比较流行的开源框架(比如 Volley ,Universnal-image-loader等),是怎么用的,研究过他们的源码没?
-
Android 虚拟机与 Java 的 Jvm区别
-
MVC 、MVP 和 MVVM 架构
-
Handler 消息机制
-
AsyncTask 的原理
-
OOM 原因、如何避免?
-
内存泄露的原因
- 数据库的 cursor 没有关闭
- 构造 Adapter 没有使用缓存 contentview
- 调用 registerReceiver() 后未调用 unregisterReceiver()
- 未关闭 InputStream / OutputStream
- Bitmap使用后未调用recycle()
- Context泄漏
-
三级缓存步骤
其他
C/C++相关
- 虚析构、模板和宏
- 虚函数实现机制
- vector与list的区别,map是如何实现的,查找效率是多少
- extern 关键字有什么用
- malloc和new的区别,能否malloc(1.2G)
linux以及操作系统相关
- 内存池实现
- 进程间通信机制
- Linux ps命令,以及看内存当前使用状态的命令
- 进程的内存空间