笔者从前期准备到所有面试结束,花费了差不多3个月的时间。真可谓“面试造火箭,工作拧螺丝”,面试过程真的很累很辛苦。
笔者面了很多公司,最终拿下了百度、腾讯和京东的offer,最后可能会选择京东。有人可能会问为什么不选择腾讯?的确腾讯的工资很高,福利待遇也很好。我觉得在京东能接触到更多新颖的技术,以至于我不会在30+、40+的时候更快的被市场淘汰。
在与京东的面试官交流时,发现他们的技术相对来说更新颖一些,包括Kotlin、Flutter和Jetpack,都有一些实践,也都是我想学习的东西,这边的业务也更感兴趣一些。另外,在谈offer时也被他们满满的诚意打动了。
下面是面试题摘要:
百度:
- 有没有遇到OOM问题(有遇到内存泄漏问题)
- Handler机制
- ThreadLocal
- Activity启动到加载View过程
- View绘制过程
- ListView和RecyclerView区别?
- RecyclerView卡顿怎么排查?
- RecyclerView怎么实现多Type?
- RecyclerView的ItemView层级过深怎么优化?
- Android多进程?
- 怎么设计Android线程间通信?
- LinearLayout (wrap_content) & TextView (match_parent) 最终结果???
- OKHttp(1. 为什么选择它? 2. 性能了解不?3. 内部有哪些设计模式)
- 了解EventBus嘛?
- 用过哪些设计模式
- 观察者举例
…
腾讯:
- Android中的Context了解多少
- Application里面可以弹窗吗
- Activity、Window、View三者的关系
- OkHttp中有哪些设计模式
- Retrofit中有哪些设计模式
- Retrofit.create做了哪些工作
- 自定义一个圆角View
- 协程launch有哪些参数
- 说说by关键字
- 代理和委托的区别
- 双亲委托模式
- 有几种获取view宽高的方式
- view.post为什么可以获取到
- getWidth和getMesureWidth的区别
- 讲讲 handler 的底层实现原理?
- 说说你做的日志记录优化?
- 你看过 binder 驱动的源码,说说他的内存映射过程,说说客户端等待服务端处理返回的流程,如果要跨进程传递大内存数据你具体会怎么做?简单写一写吧
- 在公司做过哪些优化?
京东:
- StringBuilder、StringBuffer的区别,为什么StringBuffer快一点,看过这两个的源码没有,线程安全是怎么实现的
- LRUCatch的原理实现
- 一些排序算法的时间复杂度:冒泡、快速排序
- try。。。catch。。。finally 问了个通过 exit()退出程序 会不会执行finally
- Java容器,set map的区别
- TCP UDP区别
- 设计模式,主要问了工厂模式的几种情况
- 讲一下Java内存模型 局部变量存放在哪
- 讲一下引用传递
- 讲讲Handler机制。解释发送一条消息会经过哪些过程。问了我Handler源码看到哪一层(看到了Java)。Handler创建好以后怎么才能关联到他所在的线程?(这个回答的不是很好,感觉是在Handler的构造方法里关联的?),问了要传进什么参数
- ListView的VIewHolder为什么可以减少内存的使用
- 多线程相关。Java中控制多线程的方法。锁、synchronize(可以对哪些对象加锁(静态变量加锁和对普通变量加锁有什么区别),实现原理)、wait notify
- ANR。在广播内做耗时操作会怎么样
HR面问题整合:
- 为什么离职
- 介绍一下过往的工作经历
- 在上家公司你有什么收获吗
- 目前看机会会考虑哪些因素
- 你在之前的团队中是怎样一个角色
- 有什么兴趣爱好吗
- 最有成就感的一件事
- 有没有做过什么不可思议的事
- 你认为自己的优点是什么
- 最近有在看什么书吗,有什么感想
- 你一般遇到问题都是怎么解决的
- 未来的职业规划是什么
- 你对未来的公司有什么期望吗
- 目前薪资
- 期望薪资
- 还有什么想要问我的吗
如何写好简历
简历是开启面试的第一步,重要性不言而喻,一方面反应你的实力,另一方面也反应跟目标岗位的匹配度,不过很多JD都是复制粘贴,我个人也没有动态改简历。
如何写好简历,一定要简洁且突出重点。我也面过不少人了,看过7-8页的简历,有些项目经历是没必要全都往上写的,面试官也看不过来,最好是保持在3页左右比较合适,项目经历比较丰富的同学,可以挑重点来写。
我个人简历大概模板:
- 个人信息
- 技能清单
- 工作经历/项目经历
- 开源项目/博客
- 教育经历
我是MD排版,PDF格式,参考模板
投简历时有一个建议,不要开放简历,要主动投递。开放简历会有各种邀请面试,也不好拒绝,就可能会因为没准备好而错失一些机会。可以先去其他公司找找感觉,再面心仪的公司。
另外,一定要对自己简历上写的东西做到熟练,没用过的,不会的就别写了,万一问了不会,就是在给自己挖坑。
自我介绍
自我介绍需要好好准备,因为这可能是你整个面试环节中唯一的主动机会,也是引导面试官的第一步,可以介绍最近的项目经历啥的,以及相关技术栈等等,引导面试官往你擅长的领域提问。
挑重点不要啰嗦,时间控制在两分钟左右。
离职原因
这个其实大家都心知肚明,但是回答的时候还是委婉些的好,不抱怨原则。
不过HR总是有很多种问法,比如:
- 你在上家公司才做了一年多,为什么选择离职呢?
- 你在上家公司已经做了四年多,为什么选择离职呢?
回答建议:
- 想去更好的平台
- 薪资与个人付出不成正比
- 公司业务方向与个人职业规划出现偏离
关于如何复习
对于复习,首先要对自己做一次自我了解,我是通过画脑图来进行这个过程的,我会整体默想一遍大概的知识体系,画成类似下图。回想每个知识点可能考到的内容,记录下自己模糊的地方,然后去看网上总结的面试题,再对每个题目都做一下回答。这是一个迭代过程。
因图片太大,无法全部展示
在你预想的问题都可以回答上来的时候,就需要深入挖掘一下技术细节和深度了,比如我工作中开发了一个PLT Hook工具,这个工具可能是我参考开源项目并封装修改过来的,但对其中的细节并没有很了解,这个时候你就要对这个开源项目所涉及的内容做一次系统学习了。
算法这一块的话,“临时抱佛脚”对于算法的学习和积累作用不是很大,因此需要我们在平时繁忙的工作中抽出一些时间来复习,你也可以去LeetCode、LintCode上刷刷题。另外,虽然大部分面试的算法题目都是LeetCode上的简单题目,但你同样也需要关注一些中等和困难难度的经典题目。
在面试之前我把各个大厂近几年的面试题做了一个整理,下面分享给大家,希望大家能在金九银十找到满意的工作。
第一章 网络面试题
1.HTTP协议
2.TCP/IP协议
3.TCP的三次握手与四次挥手理解及面试题
4.网页中输入url,到渲染整个界面的整个过程,以及中间用了什么协议?
5.TCP和UDP的区别?
6.HTTP的几种请求方法具体介绍
7.HTTP请求和响应报文的格式,以及常用状态码
8.一个 TCP 连接上面能发多少个 HTTP 请求
第二章 Java面试题
1.HashMap
2.ArrayList
3.LinkedList
4.Hashset源码分析
5.内存模型
6.垃圾回收算法(JVM)
7.垃圾回收机制和调用 System.gc()的区别?
8.类加载过程
9.反射
10.多线程和线程池
11.创建多线程方式、线程池工作原理
12.设计模式(六大基本原则、项目中常用的设计模式、手写单例等)
13.断点续传
14.Java 四大引用
15.Java 的泛型
16. final、finally、finalize 的区别
17.接口、抽象类的区别
18.从 java 容器类的设计讨论抽象类和接口的应用
19.synchronized和lock的区别
第三章 Android 面试题
1.Activity启动模式
2.Activity的启动过程
3.进程通讯
4.Android Binder之应用层总结与分析
5.进程保活方法
6.从源码了解handler looper ,messageQueue思路
7.handler如何实现延时发消息postdelay()
8.Android中为什么主线程不会因为Looper.loop()里的死循环卡死?
9.RxJava原理及如何封装使用
10.okhttp源码分析
11.retrofit源码分析
12.LeakCanary核心原理源码浅析
13.LruCache 使用及原理
14.ARouter原理
15.注解框架实现原理
16.Android 如何编写基于编译时注解的项目
17.RxJava2+Retrofit2+OkHttp3的基础、封装和项目中的使用
18.Rxjava2.0+Retrofit+Okhttp(封装使用)+MVP框架搭建
19.Android 插件化和热修复知识梳理
20.Android开发中比较常见的内存泄漏问题及解决办法
21.如何检测和定位Android内存泄漏
22.图片占据的内存算法
23.为什么图片需要用软引用,MVP模式中的view接口用弱引用
24.基于DataBinding与LiveData的MVVM实践
25.App稳定性优化
26.App启动速度优化
27.App内存优化
28.App绘制优化
29.App瘦身
30.网络优化
31.App电量优化
32.安卓的安全优化
33.为什么WebView加载会慢呢?
34.如何优化自定义View
第四章 数据结构与算法面试题
1.常用的数据结构有哪些?
2.数组
(1).如何在一个1到100的整数数组中找到丢失的数字
(2).如何在给定的整数数组中找到重复的数字? (小米)
(3).如何在未排序整数数组中找到最大值和最小值?(字节跳动)
(4).在Java中如何从给定数组中删除多重复制?
(5).大数相加(今日头条)
3.链表
(1).那查询第一个跟倒数第二个呢?(这就不一样了,第一个直接给了头结点,倒数第二个需要从倒数第一个开始查询,走两步) (腾讯)
(2).arrayList底层原理 (滴滴)
(3).如何在一次遍历中找到单个链表的中值?(中国平安)
(4).如何证明给定的链表是否包含循环?如何找到循环的头节点?(优酷)
(5).两个有交叉的单链表,求交叉点 (华为)
(6).如何得到单链表的长度?(360)
(7).如何在不使用递归的情况下逆转单链表?(小米/美团)
(8).怎么判断链表有环? (滴滴)
4.队列&堆栈
(1).如何使用栈实现队列的功能(广州荔枝FM)
(2).两个栈实现一个队列(蘑菇街)
(3).两个队列实现一个栈 (腾讯)
(4).对比一下队列和栈,以及它们底部实现 (腾讯)
5.二叉树
(1).如何在给定的二叉树中执行先序遍历?(百度)
(2).如何实现后序遍历算法?(百度)
(3).如何在给定数组中执行二分法搜索?(苏宁)
(4).已知前序遍历为{1,2,4,7,3,5,6,8},中序遍历为{4,7,2,1,5,3,8,6},它的二叉树是怎么样的?
(5).输入两棵二叉树 A 和 B,判断 B 是不是 A 的子结构。 (爱奇艺)
(6).请实现两个函数,分别用来序列化二叉树和反序列化二叉树(YY)
(7).平衡二叉树和红黑树的区别?(字节跳动)
(8).什么是平衡二叉树,它有什么特征 (美团)
(9).B 树,B+树
6.HashMap
(1).HashMap的底层原理是什么?线程安全么? (百度)
(2).HashMap中put是如何实现的? (滴滴)
(3).谈一下hashMap中什么时候需要进行扩容,扩容resize()又是如何实现的?
(4).什么是哈希碰撞?怎么解决? (滴滴)
(5).HashMap和HashTable的区别 (小米)
(6).HashMap中什么时候需要进行扩容,扩容resize()是如何实现的? (滴滴)
(7).hashmap concurrenthashmap原理 (美团)
(8).arraylist和hashmap的区别,为什么取数快?(字节跳动)
7.图
(1).旋转输出矩阵
(2).给定一个矩阵 int matrixA[m][n],每行每列都是增序的,实现一个算法去寻找矩阵中的某个元素 element. 搜狗
8.排序算法有哪些?
9.查找算法
10.串
第五章 开源框架
1.Okhttp
2.Glide
3.LruCache的原理是什么?
4.Glide如何绑定生命周期
5.Retrofit
6.LeakCanary
总结
面试的准备其实是在我们平时工作过程中一点一滴积累的,复习只是作为一种在面试前巩固知识的手段。复习的过程主要是我们对知识点的整理和总结,你可以想一下在面试的时候可能会遇到的问题,以及该如何去表达。
但是我想说,虽然“临时抱佛脚”的准备可能有时有用,但是在短时间内靠“突击”是很难理解到某个知识点更加深度层次的内容,而且知识面的广度也是需要时间和经验去积累的。
所以不管你是否需要面试,在平时工作过程中都需要多思考、多训练、多总结,在有需要的时候可以厚积薄发。