最后
金三银四到了,送上一个小福利!
-
9.启动优化,与AlphaManager的实现。
-
10.插桩的原理以及运用。
-
ASM
-
Javapoet
-
动态代理
-
11.LiveData 和 ViewModel的源码实现
-
12.x2c 源码实现
-
13.DNS 原理
-
14.https的原理
13和14可以阅读 :Android网络编程 总览
- 13.算法:判断一个字符串是否是回文串(注意保证原字符串不可改变,可用O(n)的空间复杂度)。
方向:栈的考究。
字节3面 Leader面
-
1.工作软技能的考核,以及团队中的定位
-
2.如何进行io 优化,指标是什么,优化后的结果以及参数是多少?
方向:可以使用/proc/pid/stat
读取cpu的idle,iowait等。使用mmap优化后的结果。
- 3.算法:在一个单链表中,每k个节点进行反转,无法被反转的部分放在末尾。
腾讯面试
腾讯的面试风格,普遍是基于你的简历上项目经历,往细节往深处问。我是面试因算法失败了一次,后面第二次就成功了。
总结一下2次腾讯面试
腾讯第一次面试1面
-
1.自我介绍,项目经历,项目上的优化项以及原因
-
2.ARouter 源码实现,项目中对ARouter的扩展实现详细设计
-
3.ui 优化,启动优化,首屏展示时机优化
-
4.
volidate
实现 -
5.Java异常捕获
-
13.DNS 原理
-
14.https的原理
-
6.jni 中JNIEnv 和线程的关系
简答:线程私有,需要JavaVm 重新获取一个jnienv 调用attachThread 方法把线程和新的JNIEnv 绑定起来。
- 7.jni中有几种注册native方法。
简答:2种,动态和静态。关于整个流程中关键的数据结构之间的关系可以看下面这篇文章的流程图: JVM引擎执行总结
- 8.Native异常捕获
简答:通过sigaction
保存系统默认的处理信号方式,sigaddset
保证一次只关心一种信号,sigaction
设置自定义的信号处理方法。在自定义的信号处理方法中,进行unwind_backtrace 处理,通过_Unwind_GetIP
获得native栈信息保存起来,并抛出异常。同时 当前方法地址 和 so的地址获取 相对地址,最后通过addr2line 解析 出是so库中哪一个方法。
腾讯第一次面试2面
-
1.自我介绍,项目经历,项目上的优化项以及原因
-
2.ARouter的实现,以及自定义扩展ARouter的实现
-
3.项目中的io 优化,以及为什么用mmap于io优化
-
4.mmap的实现
-
5.mmkv 中 对应 mmap 断电时候的处理机制
-
6.mmap没调用msync时候,落盘时机。
简答:进程死亡
详情看
-
6.算法:合并三个单链表(可参考leetcode 合并多个单链表)
因为自己画蛇添足,把每一个节点拷贝了一次,还没有往后迭代,实在是错漏百出就挂了。脑袋还是不够清醒,结果饮恨而归。
腾讯第二次面试1面
-
1.自我介绍,项目经历,项目上的优化项以及原因
-
2.ARouter 的实现,以及扩展的实现
-
3.启动优化,以及ARouter的启动优化方式,ARouter的分区方式
-
4.Navigation的源码解析
-
5.基于Navigation 编写路由框架NavigationRouter 的源码实现,以及实现的优点
-
6.Navigation 实现的路由框架中如何处理Activity和Fragment 嵌套启动的方式
-
7.class的加载流程
文章:class 文件初识
- 8.Handler的实现
文章:
最好能回答到epoll和eventfd的层面
- 9.实现一个多线程下的消费者生产者模式
腾讯第二次面试2面
-
1.自我介绍,项目经历,项目上的优化项以及原因
-
- io 优化 与 使用
mmap
的优势和缺点
- io 优化 与 使用
-
3.ARouter 的实现,以及扩展的实现
-
4.多进程实现的路由
-
5.如何进行多进程的同步调用,此时另一个进程还没有启动?
参考答案:横向浅析Small,RePlugin两个插件化框架 中,RePugin是如何通过CP 进行跨进程同步通信
- 6.数据结构中不支持多线程的数据结构,如果使用多线程操作会造成什么结构
简答:如HashMap
,ArrayMap
等不支持多线程保护原子性的数据结构。每一次进行put,get操作的时候,都会对modCount 加一。用于记录当前操作次数。一旦看是遍历里面的元素,会不断检查该操作前保存的modCount 是否和之前的一致。不一致则抛出ConcurrentModificationException
- 7.
ArrayMap
实现
简答:ArrayMap
是内存优化的数据结构。核心是由两个数组组成的数据结构。第一个数组记录了key对应的hashCode,这个过程会不断的通过二分法找到hashCode合适的插入位置。获得的index,index左移动1位是key缓存的位置,index左移动1位加1则是value的缓存位置。
ArrayMap
中的存在一个静态数组,用来保存大小4/8 开辟过的ArrayMap
。如果使用该大小的ArrayMap 则直接使用缓存。
ArrayMap
的扩容,当存储的数据大小大于等于hash存储的数组大小则扩容,小于4扩容位4,大于4小于8扩容成8,如果大于8则扩容成原来的1.5倍。
每一次remove 发现是存储的数据是当前容器大小的1/3,则压缩一半。
- 8.
HashMap
与ArrayMap
比较,两者的优缺点
简答:
-
数据结构上:
-
1.ArrayMap 是两个数组组成的是为了内存优化而生;
-
2.HashMap 采用数组+链表+红黑树
-
内存优化:
-
ArrayMap 更加节省内存,因为是一个内存中连续开辟的数组,不易产生内存碎片
-
HashMap 以entry的方式保存key和value,对内存的利用率低
-
性能上:
-
Arraymap 查找时间是O(logN) 级别(二分法),删除和增加成员需要移动成员,速度慢,小于1000的情况下没有区别
-
HashMap 增删的时间复杂度就是O(1)
-
缓存机制:
-
ArrayMap 针对大小4和8的都有缓存。避免频繁GC,两个缓存池的大小上线为10
-
Hashmap 没有缓存
-
扩容机制:
-
ArrayMap是在容量满的时机触发容量扩大至原来的1.5倍,在容量不足1/3时触发内存收缩至原来的0.5倍,更节省的内存扩容机制
-
HashMap是在容量的0.75倍时触发容量扩大至原来的2倍,且没有内存收缩机制。
-
9.handler 的原理
-
10.handler 是怎么进行postDelay 延时操作。
简答:postDelay 会将延时+当前的时间戳,插入到MessageQueue的合适位置。每一次消费判断时间到达延时的时间点,再进行消费。
- 11.当handler 只有一个延时的message时候,Looper中是如何运行。
简答:通过pollOnce 调用epoll 进行阻塞。
-
12.
volidate
原理 -
13.当没有添加
volidate
修饰属性的时候,数据什么时候从缓存行刷新到主存。
简答:当从synchronized
代码域离开的时候;当线程结束时候;当调用synchronized
方法;当第一次访问线程的某个属性。
文章:线程的缓存何时刷新?
- 14.算法题:在一个n*n的方格中。有两种方格,1代表阻塞不能经过,0代表可达。两点坐标,a和b。问a到b的最短路径。
腾讯第二次面试3面和4面
腾讯3面和4面是联系到一起的,这里一起说了
-
1.自我介绍,项目经历,项目上的优化项以及原因
-
2.
mmap
实现原理和io优化 -
3.View的绘制流程,从
setContentView
解析xml到View的绘制结束。
设计的内容极多和广泛,建议看我写的如下系列文章:
-
View的绘制流程 (一)View的初始化View的初始化")
-
View的绘制流程(二) 绘制的准备 绘制的准备")
-
View的绘制流程(三) onMeasure onMeasure")
-
View的绘制流程(四) onLayout onLayout")
-
View的绘制流程(五) onDraw onDraw")
-
4.硬件渲染流程
-
View的绘制流程(六) 硬件渲染(上) 硬件渲染(上)")
-
View的绘制流程(七) 硬件渲染(下) 硬件渲染(下)")
-
5.SurfaceFlinger 在 View绘制流程中扮演的角色
-
- Choregrapher 的工作原理
关于5和6两个问题可以详细阅读系列文章: SurfaceFlinger的概述
-
7.OOM 如何优化,内存爆满是虚拟内存容易先爆掉还是物理内存容易,一口气映射4g的内存是否会发生异常。
-
8.Bitmap 如何优化避免OOM,为什么放在native中bitmap不容易OOM
-
9.一个进程最多可以使用多少fd
-
10.你研究过RN和Flutter,RN的渲染机制和Flutter的渲染机制是如何运作的?他们之间区别是什么?
关于RN和Flutter的文章,之后有机会会和大家分享出来。
目前来说可以去看看gityuan 的博客,里面有详细的介绍了Flutter的通信流程和渲染流程。
而RN的渲染流程倒是很多相关的文章,建议直接结合文章看最新的源码,不是特别的难。
- 11.插件化你是如何实现的。
详细可以阅读横向浅析Small,RePlugin两个插件化框架 这篇文章有详细的解析了整个hook的原理和流程。
- 12.算法1: 将一个int的数字转化成汉语说法。如10000转化为一万。
简答:方向是除余,除法移动int,并保存到栈中。然后推出,生成汉语说法
- 13.算法2:中国下棋的马,能否吃掉另一个坐标的旗子,请找出坐标
简答:广度优先算法,遍历8个方向。
最后
我想问下大家当初选择做程序员的初衷是什么?有思考过这个问题吗?高薪?热爱?
既然入了这行就应该知道,这个行业是靠本事吃饭的,你想要拿高薪没有问题,请好好磨练自己的技术,不要抱怨。有的人通过培训可以让自己成长,有些人可以通过自律强大的自学能力成长,如果你两者都不占,还怎么拿高薪?
架构师是很多程序员的职业目标,一个好的架构师是不愁所谓的35岁高龄门槛的,到了那个时候,照样大把的企业挖他。为什么很多人想进阿里巴巴,无非不是福利待遇好以及优质的人脉资源,这对个人职业发展是有非常大帮助的。
如果你也想成为一名好的架构师,那或许这份Java核心架构笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。
中高级开发必知必会:
既然入了这行就应该知道,这个行业是靠本事吃饭的,你想要拿高薪没有问题,请好好磨练自己的技术,不要抱怨。有的人通过培训可以让自己成长,有些人可以通过自律强大的自学能力成长,如果你两者都不占,还怎么拿高薪?
架构师是很多程序员的职业目标,一个好的架构师是不愁所谓的35岁高龄门槛的,到了那个时候,照样大把的企业挖他。为什么很多人想进阿里巴巴,无非不是福利待遇好以及优质的人脉资源,这对个人职业发展是有非常大帮助的。
如果你也想成为一名好的架构师,那或许这份Java核心架构笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。
中高级开发必知必会:
[外链图片转存中…(img-LbrNT53N-1715344851798)]