Android 开发 1 年背了几十份面经还是连挂了 6 个面试,拿到最终字节腾讯 offer 后我总结了这些坑点
1.离职原因方面
其实大家换工作无非钱少了/环境不好/没成长三种原因,但是面试在讲离职原因的时候一定不要过于实诚,请尽量往个人发展这个方向上靠拢,切忌一定不要说现任公司的坏话,尤其是跳槽频繁或者像我这种第一份工作不满两年的,一定要想好自己的离职理由,我有几家公司明显技术答的还行,但是因为离职理由挂掉的。
2.简历投递顺序方面
如果你对自己很有信心的话,可以直接投你的意向公司,如果信心不够强烈建议跟我一样先面几家体量不那么大的公司涨涨经验看看现在外面的行情,然后再投自己中意的公司。
3.心态准备方面
既然准备了要离职,就不要被任何其他事物影响心态,心态真的很重要。刚开始面试的时候我真的是处处碰壁,面一家挂一家,后来在一家面试过程中被面试官疯狂嘲讽,面完之后怀疑自我,是不是自己真的太菜了找不到工作。后来也辛亏隔天有一家公司给我发了 offer,让我明白了不是自己的问题。工作本身就是双向选择,一家不行再换一家,总有合适的,千万不要因为别人的一句话就全盘否定自己,一定要自信。
4.技术准备方面
刚开始面试的时候是准备把面试过的所有家都写详细的题目出来的,后来发现写了面经发在牛客的都挂了,也不知道是什么奇怪的玄学,后来就没发过了,不过其实面过来面过去就那些问题,就像下边这样整体总结一下吧。
Java
怎么判断一个字符串的字符个数,比如说中文
Java 的异常机制,为什么这么设计,什么时候用什么
HashMap,经典的就不一一列举了,说几个可以拓展的
解决 hash 冲突的方案有哪几种
1.7 和 1.8 有什么区别(链表头插尾插方面)
hashmap 高并发场景会怎样
高并发链表成环会有什么问题
hashmap 扩容时到底干了什么(位运算过程)
concurrentHashMap 原理
String,StringBuilder,StringBuffer
ArrayList 多线程下会有什么问题
内部类持有外部类引用的原理是什么
volatile 有什么用,原理是什么
为什么会有 StackOverflow,stack 的大小是多少
虚拟机
Java 虚拟机和 Android 虚拟机有什么区别
Android 两种虚拟机有什么区别
类加载过程
内存模型
四种引用类型
class 文件格式
synchronized 底层实现原理
synchronized 放在普通方法和静态方法上有什么区别
synchronized 的锁实际是保存在哪里的(对象头)
双亲委派机制,为什么要用双亲委派机制,如何打破双亲委派机制
内存收集整理的算法
Android
Activity
Activity 的生命周期
dialog 会不会影响 Activity 生命周期,为什么
Activity 的启动模式(还会伴有场景让你说这种场景选哪个合适)
Activity 任务栈以及 taskaffinity
Service
Service 存在的意义是什么
startService 和 bindService 的生命周期
startService 和 bindService 的区别
startService 和 bindService 分别适合应用在什么场景
Service 可以执行耗时操作吗
IntentService 和 Service 的区别
Service 和线程都可以用来执行后台任务,为什么选 Service 不选线程,明明线程用起来更简单
broadcastreceiver
广播的原理是什么
View 的绘制流程
详细讲一下 View 的绘制流程有哪些
View 的第一次绘制是怎么调到的
View 的后续绘制是怎么调用的
View 的 onMeasure,onLayout,onDraw 都分别用来干什么
除了上面三个,还有哪些关键的方法
invalidate 的原理
invalidate 和 requestlayout 的区别
requestlayout 的作用范围是多大
一个 View 被添加后第一个回调的方法是哪个(onAttacthToWindow)
为什么 View.post 能拿到 view 的宽高
讲一些字节做过的自定义 VIew 的例子
触摸事件分发
讲一下 Android 事件分发的流程
怎么处理滑动冲突
怎么判断手势
讲一些自己做过的处理滑动冲突的原理
事件分发
handler 这套机制的原理
IdleHandler 是什么
handler 的 postDelay 怎么实现的
Message 有个缓存池,缓存池大小是多少知道吗
MessageQueue 的中没有消息的时候为什么不会 ANR
知道 epoll 的底层原理吗
epoll 是阻塞的吗
ANR
ANR 是什么
ANR 的原理
什么情况下会发生 ANR
如何检测是否发生了 ANR
SharedPreference
SharedPreference 原理
SharedPreference 的优化
SharedPreference 的 commit 和 apply 区别
什么情况下会选择用 SharedPreference
序列化
Serlizeable 和 Parceable 的区别
什么情况下选择用哪个,为什么
有没有了解过别的序列化方法
RecyclerView
RecyclerView 的缓存机制
RecyclerView 和 ListView 对比
Recycler 是怎么进行回收和复用的
LayoutManager 怎么进行布局的
内存泄漏
内存泄漏的常见场景
怎么检查内存泄漏
Binder
Binder 原理
Binder 比起其他跨进程的通信方式好在哪
网络
HTTP 报文格式
HTTP 在网络体系架构中的意义是什么
HTTPS 和 HTTP 的区别
对称加密和非对称加密
TLS 四次握手的过程
CA 是干什么的
校验证书的详细过程
HTTPS 一定是安全的吗
TCP 和 UDP 的区别(高频)
HTTP1.0,1.1,2.0 的区别
有没有实际了解过 HTTP2.0 到底比 1.1 快了多少
详细解释“Keep-Alive”有什么用
UDP 为什么比 TCP 快(存在误导,UDP 不一定比 TCP 快)
UDP 可以进行广播为什么 TCP 不行
为什么要三次握手,四次挥手
为什么握手仅需要三次而回收需要四次
HTTP 是基于什么协议的(一般来说是 TCP,可以借此引出 QUIC,KCP 等协议进行进一步的探讨)
操作系统
线程间通信方式
线程的几种状态
进程间通信方式
线程和进程的区别
设计模式
设计模式没有必要全都看,重要的是你会的几种设计模式他们的优点是什么,缺点是什么,在哪些常见的地方用到了他们,要能够举一反三,例举几个我面试时常说的。
单例——单例一定要特别熟,特别高频,尤其是 DCL 为什么这么写,synchronized 为什么那么加,有什么讲究,volatile 在这个地方起到了什么作用,不加会导致什么问题。静态内部类的单例怎么能够保证线程安全。等等。
Builder——常见,知道什么时候用就行了
责任链——要能扩展到 Android 的事件分发,okhttp 的拦截链等。
观察者模式——要能知道 Android 中哪些地方用到了观察者,什么情况下使用。比如广播机制就使用的是观察者
享元模式——要知道享元模式是为了避免重复创建对象而导致的开销,Message,String,线程池都是这样的设计思想。
Adapter——要能想到 ListView 和 RecyclerView,以及为什么他们设计的时候要用 Adapter
代理模式——静态代理,动态代理
算法(手撸代码)
就算法来说,其实大部分公司(除了字节和腾讯)问的都不是很难,一般都集中在数组和链表上,基本就是剑指 offer 难度甚至直接就是原题。
移动零——一个数组有 0 和其他数,不更改原本其他非 0 数字的顺序,把 0 都移到数组最末位(猿辅导)
手写栈(伴鱼)
数组中只出现一次的数字——剑指原题(伴鱼)
判断链表是否有环(顺丰,腾讯,美团)
有环链表环的长度(腾讯)
反转链表(腾讯)
一道贪心——题目太长了且没有原题(腾讯)
字符串转数字(百度)
回字形打印数组(老虎证券)
[插入 5](
)(老虎证券)
斐波那契数列(美团)
手写 DCL 单例(字节)
二叉树路径和——从根节点到叶子节点是否有一个路径之和等于给定值(字节)
最短子数组长度——滑动窗口(字节)
手写观察者模式(字节)
两个栈实现队列(字节)
获取一个 VIewGroup 的最深深度(美团)
评论