点击上方 "后端架构师"关注,星标或置顶一起成长
后台回复“大礼包”有惊喜礼包!
关注订阅号「后端架构师」,收看更多精彩内容
每日英文
As we grow up, we realize it becomes less important to have a tons of friends, and more important to have real ones。
长大了之后,我们发现,拥有几个真心朋友比找一大堆朋友要更重要。
每日掏心话
每年四月流疏树就开出白色小花,佈滿整棵树,看起来就像下了一场大雪,让人看著发呆,也让人产生错乱,就像人生中充满著各种错觉,身在其中很容易就被迷惑了。
来自:Omooo|责编:乐乐
链接:juejin.im/user/2647279728079432
后端架构师(ID:study_tech)第 1062 次推文
往日回顾:给IDEA换个酷炫的主题,这个有点哇塞啊!
正文
/前言 /
双非本科毕业,洋洋洒洒的写了一年多业务,九月份开始面试,将一些面试题分享给大家,希望对大家有所帮助。基本上问的都差不多,我就不按公司分类了,面了得物、阅文、B站、京东、携程、百度、触宝、腾讯、拼多多,最后挂了两个(某讯是真的气,基本上不按简历问)。
关于我的简历以及这些题的具体该怎么回答,我都放在GitHub了。
GitHub地址:
/Omooo/Android-Notes
写的不是博客,而是口水话。何为口水话呢?就是面试官问你相关问题的时候,你应该如何说的话。有没有遇到这样的场景,明明面试官问我的问题我会,我也看过甚至我自己也写过相关博客,但是在回答的时候还是支支吾吾说不清楚,或者不分轻重想到啥就说啥。口水话专门用来解决这个问题,它不同于一般博客语言琐碎,而是语言精炼,突出重点,以沟通的方式而非说教的形式去阐述问题。
/正文 /
下面是一些我印象中的面试题。
Java
反射、注解、泛型、异常了解吗?
基本上都会被问到,回答的时候只是回答基本使用是不够的,可以说一下它们在 JVM 里面的实现原理。比如反射的性能损耗在哪,怎么优化?注解的信息存放在哪?注解的两种处理方式(反射和APT)。泛型擦除怎么理解?泛型的PECS原则如何理解(典型的一个例子就是Collections.copy方法)?异常的两种方式(Exception和Error)分别简单说一下?异常实例的构造?异常表?final 为啥总是会执行?
Java集合源码
问的最多的莫过于HashMap了。HashMap的扩容机制、hash冲突的解决、负载因子为什么是0.75,为什么链表长度的边界值是 8,取索引的过程?非线程安全,所以就牵扯到了 ConcurrentHashmap、然后又牵扯到 CAS 等等。
在公众号后端架构师后台回复“Java”,获取Java面试题和答案。
最后也可以说一下Android中推荐的使用的SparseArray、ArrayMap(里面存在两个缓存队列)的优化,源码也要看一下。
ArrayList比较简单,有一家让我直接手写实现,可以练习一下。然后又可以牵扯到线程安全的Vector、CopyOnWriteArrayList。
JVM
问的最多的就是内存区域的划分以及GC。回答的时候需要注意,标记清除是清除未被标记的对象;还有GCRoots对象是哪些?CMS就别说了,已经被废弃了,可以说一下G1、ZGC这些。然后就是引用计数法和可达性分析,这个可以扩展说一下Android Framework层使用到的智能指针,它就是使用的引用计数,然后说一下它是怎么解决循环引用问题的。
类加载机制问的也不少,除了Java中的,还可以说一下Android中的DexClassLoader,Android 8的改动?然后就可以引申到了插件化和热修复了。
还有一些问到虚拟机的。这时候先从Java的HotSpot(解释执行和编译执行,分层编译)说起,然后到Dalvik,最后到ART。期间涉及JIT、AOT编译,什么区别?profile性能分析?对垃圾回收的改进,如果优化GC停顿(可以参考G1回收流程)?
并发
问的最多的也就是synchronized和volatile的实现原理了。synchronized的基本使用?1.6 的改进(无锁、偏向锁、轻量级锁、重量级锁)?Java对象头?实现原理(ACC_SYNCHRONIZED、monitorenter/monitorexit 指令)?volatile 的可见性(lock 前缀+缓存一致性协议)和有序性(内存屏障)的实现原理?CAS的实现(ABA问题、循环时间长开销大问题、只能保证单个共享变量的原子性)?UnSafe类的理解?
线程池,问的也很多,但是基本上都是问线程池的那几个参数的意思。
Android
基础
基本上都大差不差,Activity和Fragment的数据传递,生命周期、启动模式;动画的使用,估值器、插值器(其实就是三角函数)都比较简单。
View的绘制流程(从Activity的attach到onResume),然后延伸到如何自定义View,为什么要重写onMeasure、MeasureSpec的理解?
View事件分发,需要注意onCancel的触发时机(典型的就是RecyclerView的点击滑动)?除了一般博客上面写的Activity -> ViewGroup -> View 的流程。还可以说一下事件从哪里来的(InputManagerService)?事件最先是分发给Activity的吗(其实是ViewRootImpl里面的mView,也就是DecorView)?IMS是如何分别处理KeyEvent和TouchEvent的?
再讲View的绘制流程,在scheduleTraversal时可以延伸到View的刷新机制。Vsync信号的处理?四种回调前三种都比较好理解,Commit回调是怎么触发的(onTrimMemory)?Vsync计算掉帧,如何监听线上的卡顿情况,一种就是利用Vsync,还一种就是BlockCanary的利用Handler回调。
然后就是Handler机制,这个基本上大家都懂,不过可以说一下内存屏障、为什么没有卡死、IdleHandler在实际项目中怎么用到的?
Framework
其实前面我们在回答Android基础时就已经讲到不少Framework的东西了。所以这一块直接问的比较多的就是Activity启动流程和Binder机制。在讲Activity流程的时候,可以说一下插件化hook式的hook点,以及Android 8、10启动Activity的流程改动。
Binder机制,先说一下Linux下的IPC通信方式(管道、Socket、信号量、共享内存,其实这些在Framework层都有使用到,可以简单讲一下)。然后就是着重讲Binder的通信模型,Binder在驱动层是如何表示的(binder_node、binder_ref 数据结构)?ServiceManager的代理对象的获取(getStrongProxyForHandle(0))、Service的注册?打开Binder机制的三大流程?
插件化和热修复,插件化的静态代理式(这个很好写,就是刚哥的dynamic-load-apk)和Hook式;热修复我也只了解腾讯系的类加载机制的dex插桩,如果熟悉阿里系的底层替换方案也可以说一下。
性能优化
这个就可以根据实际在项目中做了哪些来说了。我是写了包体积优化(减少 8M+)、布局优化(过度绘制和布局嵌套)、内存优化(LeakCanary + Android Profile)。
在公众号后端架构师后台回复“offer”,获取算法面试题和答案。
Gradle
因为我简历上的个人技能和项目经历都写了Gradle,所以这一块问的也比较多。主要是问了编译打包流程(AAPT和AAPT2的区别)以及一些项目中做了哪些事(构建优化、写了一个Gradle插件)。
计算机网络
TCP
必问,一定要回答全哦。TCP的面向连接(三次握手、四次挥手)、基于字节流、全双工、可靠性(流量控制、拥塞控制、重传机制等)。TCP的缺陷(队头阻塞),以及HTTP3的怎么解决的?TIME_WAIT状态的理解?
HTTP/1.x、HTTPS、HTTP2、HTTP3
必问,这个只要成体系了,就很好回答了。
先从目前使用最广泛的HTTP/1.1(二十多年前的版本)开始回答,长连接、如果传输大数据、现在有什么优化措施(每个域名六个并发连接、域名分片、精灵图等等),HTTP 1.x的问题(应用层的队头阻塞、未压缩Header、明文传输),HTTP2是如何解决的(多路复用、HPACK算法、二进制数据)?HTTP的不安全性(机密性、问完整性、身份校验)由HTTPS保证(TLS_ECDHE_RSA_AES_128_GCM_SHA_256 + PKI)?
HTTP2(基于SPDY协议)只解决了应用层的队头阻塞问题,但是并没有解决传输层的队头阻塞,所以可以说一下HTTP3是如何解决的(基于QUIC协议,使用UDP)?连接迁移、前向冗余纠错?
算法
某度:判断合法的IP地址。
某多:树的最大深度(递归和迭代都要写),加面算法判断是否是同花顺:
花色:R :红色,B:黑色,M:梅花,F:方块;牌大小:A、2、3、4... K;输入:["RA","R2","R3","R4","R5","B4","M2","F1"]返回true,可以构成一个同花顺。输入:["FJ","FQ","FK","FA","F2"]返回false。
某讯:岛屿问题
某宝:对称二叉树(递归和迭代都要写)
PS:欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,欢迎转发分享给更多人。
欢迎加入后端架构师交流群,在后台回复“007”即可。
猜你还想看
阿里、腾讯、百度、华为、京东最新面试题汇集
微软将从12月开始暂停Windows 10更新!
如何设计一个通用的权限管理系统
技术无罪!开发者强烈抗议后,这款被封杀的下载神器恢复了
嘿,你在看吗?