程序员面试的那些小事

「校招季」校招的准备 And 复习的知识点

2017-10-14  本文已影响36人  FeelsChaotic

基本流程

校招的套路基本都是宣讲会 — 笔试 — 技术一面 — 技术二面(大公司会到技术三面乃至终面)。

校招信息获取渠道

注:不建议选择「海投」的方式,这种耗费大量时间精力的方式, 投入产出比可能比较低。根据自己的兴趣,公司的规模,公司的发展前景等,有选择性地投递简历。一个人的精力是有限的,把精力投入在优选出来的公司上,效果可能更优。

找准岗位方向

在找工作之前,明确自己的技术方向,是一件非常重要的事情。大多数人往往会被某些所谓的热门技术,高薪酬等所诱惑,怀疑自己的方向选择,什么岗位都去投一下简历。这在我看来是非常不好的,盲目地投递简历十分浪费时间精力。

如果你本来就参加过实验室项目和比赛,我想你对自己的技术方向定位应该是很清晰的了。

阅读大量笔试题和面试题

第一关的笔试题考核,是为了筛掉基础差的人。基础差的人,在工作中很难去解决技术问题,要么解决问题速度非常慢。

所以说笔试是首要解决的问题。一般来说笔试题考的范围比较广,占比最大的是「专业技术」和「数据结构」。「专业技术」指的是你的技术方向。「数据结构」指 算法和数据结构。越是大公司,越喜欢考察算法和数据结构基础。我参加的大部分笔试基本上 1/2 数据结构题 + 1/4 算法 + 1/4 java。(没看错,就是招的Android开发。)

当初我刷题是用的「牛客网」,网站体验不错,题目质量也不错。同时上面也有一些校招信息。其它同类型的刷题网站,例如 leetcode ,就看自己喜好了。

热门技术了解

除了基础外,你还应该对其他领域的知识有多少有所涉猎。你需要多了解一点新技术与科技前沿,你才能和面试官谈笑风生。

博客

从产品角度讲, 一个长期的价值博客是一份很好的简历。

从技术角度讲,持续的写作逼迫你不断学习,你将害怕有一天写无可写。

不过因为应届生熟悉大量笔试题和面试题需要花费相当多的时间,对于后面要找工作又不想没有完成技术文章累积的,可以写笔试面试题文章来完成每周撰写技术文章的任务。当然,文章不能是简单的答案,还需要自己的分析和理解。

面试的准备

准备 2 份自我介绍,一份 2 分钟,一份 5 分钟。根据情况选择不同时长的自我介绍。

建议自我介绍包括这些部分:

  1. 客观情况介绍,姓名,学校,专业,学历,应届还是非应届
  2. 应聘职位
  3. 和应聘职位有关的学习和实习经历。(成绩、各种荣誉……挑闪光点说,因为你说的,待会儿可能就会变成他面的重点)
  4. 特别突出的个人能力(以获得的奖项为依据)。如果没有,略过。
  5. 为什么申请这个职位,对公司的了解,对职位的理解并与自身匹配,对自己的定位,对未来工作的期望

面试官会从你的简历里挖什么?

面试官和你的对话一般是从简历里你熟悉的内容展开的,所以你需要好好回顾你的项目。

具体项目面试需要准备哪些方面,面试官会问些什么内容,可以阅读怎样一个漂亮的项目介绍 And 面试官到底在考察什么?

最后

面试还是要保持良好的心态,只要充分地展示平时自己的所学就可以了。不要把面试当作面试,看作一次技术交流,把心态从我要找到一份工作转变为我要通过面试去发现不足、提升自己,这样就会平和多了。应届面试者还可以和面试官交流你项目中解决方案的优化,对比企业级项目采用的不同的方式,也可以准备好自己的技术疑问,面试官一般会很愿意解答,你将有很大收获。


那么接下来,即将着手准备校招,从哪里开始准备呢?首先是基础。

基础这东西,各个公司都很看重,尤其是大公司,他们看中应届生的潜力,舍得花精力去培养,所以基础是重中之重。项目经历少怎么办?那就去打牢基础。

Java

  1. 多线程

这是必问的一块了

  1. 网络

  2. 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 方法上会增加面试官对你的好感。

  3. 注解

  4. 常见关键字的意义

  5. 面向对象的基础知识

  6. GC 类型,时机等

  7. 字符编码

  8. 九种基本数据类型的大小,以及他们的封装类。

  9. Switch 能否用 String 做参数?

  10. equals 与 == 的区别。

  11. Object有哪些公用方法?

  12. Java的四种引用,强弱软虚,用到的场景。

  13. try catch finally,try里有return,finally还执行么?

  14. Override 和 Overload 的含义去区别。

  15. Interface 与 abstract 类的区别。

  16. Static class 与non static class的区别。

  17. java多态的实现原理。

  18. 写出生产者消费者模式。

  19. ThreadLocal 的设计理念与作用。

  20. ThreadPool 用法与优势。

  21. wait() 和 sleep() 的区别。

  22. foreach 与正常 for 循环效率对比。

  23. 反射的作用与原理

  24. 泛型常用特点,List<String>能否转为List<Object>

  25. 解析 XML 的几种方式的原理与特点:DOM、SAX、PULL

  26. JNI 的使用

JVM

  1. 内存模型以及分区,需要详细到每个区放什么。
  2. 堆里面的分区:Eden,survival from to,老年代,各自的特点。
  3. 对象创建方法,对象的内存分配,对象的访问定位。
  4. GC的两种判定方法:引用计数与引用链。
  5. GC的三种收集方法:标记清除、标记整理、复制算法的原理与特点,分别用在什么地方,如果让你优化收集方法,有什么思路?
  6. GC收集器有哪些?CMS收集器与G1收集器的特点。
  7. Minor GC与Full GC分别在什么时候发生?
  8. 几种常用的内存调试工具:jmap、jstack、jconsole。
  9. 类加载的五个过程:加载、验证、准备、解析、初始化。
  10. JVM中 OOM 你遇到过哪些情况,SOF 你遇到过哪些情况。

JVM问题没怎么变,内存模型和GC算法这块问得比较多

操作系统

  1. 线程和进程的关系
  2. 线程安全
  3. 死锁的产生和解决
  4. 进程的几种状态
  5. IPC 几种通信方式
  6. 虚拟地址、逻辑地址、线性地址、物理地址的区别
  7. 什么是虚拟内存

数据库

一些基本的像 union 和 union all 的区别、left join、几种索引及其区别就不谈了,比较重要的就是数据库性能的优化,如果对于数据库的性能优化一窍不通,那么有时间,还是建议你在面试前花一两天专门把 SQL 基础和 SQL 优化的内容准备一下。没时间的话可以不复习,一般公司的面试数据库比重不高。

eg:

TCP/IP

  1. OSI与TCP/IP各层的结构与功能,都有哪些协议。

  2. TCP与UDP的区别。

  3. TCP报文结构。

  4. TCP的三次握手与四次挥手过程,各个状态名称与含义,TIMEWAIT的作用。

  5. TCP拥塞控制。

  6. TCP滑动窗口与回退N针协议。

  7. Http的报文结构。

  8. Http的状态码含义。

  9. Http request的几种类型。

  10. Http1.1和Http1.0的区别

  11. Http怎么处理长连接。

  12. Cookie与Session的作用于原理。

  13. 电脑上访问一个网页,整个过程是怎么样的:DNS、HTTP、TCP、OSPF、IP、ARP。

  14. Ping的整个过程。ICMP报文是什么。

  15. C/S模式下使用socket通信,几个关键函数。

  16. IP地址分类。

  17. 路由器与交换机区别。

网络其实大体分为两块,一个TCP协议,一个HTTP协议,只要把这两块以及相关协议搞清楚,一般问题不大。

算法和数据结构

常用的数据结构概念的实现原理

非常重要,也是必问的内容。基本上就是 List、Map、Set,问的是各种实现类的底层实现原理,实现类的优缺点。

集合要掌握的是 ArrayList、LinkedList、Hashtable、HashMap、ConcurrentHashMap、HashSet 的实现原理,能流利作答,当然能掌握 CopyOnWrite 容器和 Queue 是再好不过的了。另外多说一句,ConcurrentHashMap 的问题在面试中问得特别多,大概是因为这个类可以衍生出非常多的问题,关于 ConcurrentHashMap,可以参考以下问题:

(1)ConcurrentHashMap 的锁分段技术

(2)ConcurrentHashMap 的读是否要加锁,为什么

(3)ConcurrentHashMap 的迭代器是强一致性的迭代器还是弱一致性的迭代器

题目示例:
  1. HashMap实现原理

  2. HashTable和HashMap区别

  3. Hashtalbe与ConcurrentHashMap区别

  4. ArrayList、LinkedList、Vector的区别。

  5. Map、Set、List、Queue、Stack的特点与用法。

  6. HashMap 和 ConcurrentHashMap 的区别

  7. 链表与数组。

  8. 队列和栈,出栈与入栈。

  9. 链表的删除、插入、反向。

  10. 字符串操作。

  11. Hash表的hash函数,冲突解决方法有哪些。

  12. 各种排序:冒泡、选择、插入、希尔、归并、快排、堆排、桶排、基数的原理、平均时间复杂度、最坏时间复杂度、空间复杂度、是否稳定。

  13. 快排的partition函数与归并的Merge函数。

  14. 对冒泡与快排的改进。

  15. 二分查找,与变种二分查找。

  16. 二叉树、B+树、AVL树、红黑树、哈夫曼树。

  17. 二叉树的前中后续遍历:递归与非递归写法,层序遍历算法。

  18. 图的BFS与DFS算法,最小生成树prim算法与最短路径Dijkstra算法。

  19. KMP算法。

  20. 排列组合问题。

  21. 动态规划、贪心算法、分治算法。(一般不会问到)

  22. 大数据处理:类似10亿条数据找出最大的1000个数.........等等

  23. 前序中序 输出层次遍历序列

  24. 求树高

  25. 是否是平衡二叉树

  26. 广度遍历、深度遍历

  27. 动态规划和贪心的区别

  28. 大整数加、减、乘、除、求模运算实现

  29. 很多整数,找其中出现次数最多的那个数

  30. 单链表翻转(两个指针如何实现)、查找、删除、插入以及双向链表、有序链表合并

  31. 判断一个整数是否是2的整数次幂.(n&(n-1))

  32. 常见排序算法的实现以及稳定性(快排跟归并考的很多)

  33. 字符串翻转(O(n))、匹配(KMP算法)

  34. 最长递增子序列(nlogn的算法)

  35. 链表判断是否有环,环的入口,两个链表是否相交(快慢指针)。

  36. 指定一个数组,求2个数的和等于指定的和(某一个数),如果是3,4,5,n个等于个的和(某一个数)呢?(可以看作背包问题)

  37. 跳台阶问题

设计模式

  1. 单例(懒汉、饿汉)
  2. 工厂
  3. 适配器
  4. 责任链
  5. 观察者

面试中关于设计模式的问答主要是三个方向:

(1)你的项目中用到了哪些设计模式,如何使用

(2)知道常用设计模式的优缺点

(3)能画出常用设计模式的 UML 图

Android

  1. Activity启动模式区别

  2. 四大组件生命周期

  3. 如何对产生 ANR 代码定位

  4. 检查内存泄露的工具

  5. 横竖屏切换时,Activity 的生命周期以及如何设置横屏或者竖屏

  6. Android 主线程与子线程的理解

  7. 怎么做性能优化

    • UI优化
      • 减少过度绘制
      • 不必要嵌套布局
      • 利用include标签来复用控件等等
    • 内存优化
      • 缓存
  8. Android的屏幕适配方案

    • 图片适配
      不同像素密度的手机加载工程资源文件(res)中不同资源图片

    • dimens.xml文件适配
      dimens.xml存在于工程资源(res)文件夹中不同values(如:value-1280x720、value-800x480)文件夹下,可用于指定控件大小,不同像素密度手机加载不同values文件夹下的dimens.xml文件

    • 布局文件适配(工程比较浩大,不常用)
      不同分辨率的手机,加载不同的布局文件已达到适配效果。创建多个layout(如:layout-1280x720、layout-800x480)文件夹用于存放不同像素密度手机所需布局文件。

    • 代码适配
      通过android相应api获取当前手机的宽高像素值,按比例分配屏幕中控件的宽高以达到适配效果

    • 权重适配
      通过android提供的(权重)剩余空间分配,已达到适配效果

  9. ListView优化

  10. Java具备内存回收机制,为什么Android还会出现内存泄露?写出三个内存泄露的场景。

  11. 说说你知道的当前几个比较火比较流行的开源框架(比如 Volley ,Universnal-image-loader等),是怎么用的,研究过他们的源码没?

  12. Android 虚拟机与 Java 的 Jvm区别

  13. MVC 、MVP 和 MVVM 架构

  14. Handler 消息机制

  15. AsyncTask 的原理

  16. OOM 原因、如何避免?

  17. 内存泄露的原因

    • 数据库的 cursor 没有关闭
    • 构造 Adapter 没有使用缓存 contentview
    • 调用 registerReceiver() 后未调用 unregisterReceiver()
    • 未关闭 InputStream / OutputStream
    • Bitmap使用后未调用recycle()
    • Context泄漏
  18. 三级缓存步骤

其他

C/C++相关
  1. 虚析构、模板和宏
  2. 虚函数实现机制
  3. vector与list的区别,map是如何实现的,查找效率是多少
  4. extern 关键字有什么用
  5. malloc和new的区别,能否malloc(1.2G)
linux以及操作系统相关
  1. 内存池实现
  2. 进程间通信机制
  3. Linux ps命令,以及看内存当前使用状态的命令
  4. 进程的内存空间
上一篇下一篇

猜你喜欢

热点阅读