总的来说腾讯的面试确实强度更高更加持久。
字节是分开一次1个小时面试的。而腾讯1、2面是一次一小时,而3面和4面是连续面试一口气高强度的面试2小时,5面则是2个面试官轮流提问。
腾讯是持久战稍微脑子不清醒一点就可能出现大错漏。我在4面就是如此,差点出事了。请准备好糖分和水分及时补充,或者洗把脸保持清晰。
正文
–
面试的过程一般只有1个小时,如何在一个小时内彻底的考究你本人的水平究竟到达那种境界,也是面试官努力的方向。
而面试往往是由两部分构成:
-
算法
-
专业知识
关于算法
为什么把算法摆在第一点,因为算法在我看来这是大部分没有面试过大厂的朋友可能会忽视的一方面。它的重要程度不比专业知识的考究来的低。
在1-2小时内,如何能快速的看到你编码水平和思维就看这些算法的考究。
因此需要对常见的数据结构比较熟悉,如**链表,树,栈,堆
。需要知道遇到数组相关的题型
可能需要用到如快慢指针等解题思路。**
还有广度深度优先算法,最后,如果还有更难一点的,会涉及到回溯,动态规划
等解题思路。
前面几点都比较好处理,只要刷题到一定量,都能反应过来。我本人认为我并非是聪明的人,做了300快400道题也仅仅只是摸索出了一些大致的套路,我是完全比不了那些做了100+道题就能灵活掌握算法的大神。
但是经过了系统性的训练,遇到一些常见的算法解题思路可以快速的反应过来。
而动态规划
相关的问题,我看来是最难的。关键是需要判断题目是否可以分解成小问题且小问题之间不能互相影响,接着找到动态规划方程,或者是状态转移表。
在听到面试官的算法题后,先不要急着下笔。最好在下笔之前和面试官聊聊你的思路。
不同面试官的要求不同,有的面试官,希望算法是原地算法,而有的面试官希望时间复杂度降低,有的希望空间复杂度降低。
最好能清晰的表达你的初步思路后,面试官会知道你的算法的方向是否正确,可以一定程度上给予你方向上的指引。
记住就算你做过原题,除非你的方案能保证是从空间和时间复杂度是最优,不然我还是建议面试者多和面试官交流。
在交流的过程中,面试官也能明白你的思考过程,从而判断你这个人的编程能力如何。
千万不要小看这个模块的考究,如果说面试专业知识是100分,那么算法题可以占据50分。如果你写不出,或者思路完全偏离了,那就可以说再见了。
在我写文章学习的这5年里面,也有不少的朋友问我的意向,其中不乏有大厂。然而我深知我的算法水平确实不太行,学习的源码水平还不足,很多时候都婉拒了。也就今年和去年,练习算法已有近2个年头,才敢出山试试。
就算是这样的我,算法上的能力评价还是不高,只能说是达到了大厂的合格线,还需要继续加强。
Step:最后,再给两点建议:
-
一个人光看不练是不行的,一个人瞎琢磨效率偏低。
-
刷题最重要的是解题思维,最好可以买几本书或者课程指导,这样遇到不理解的题还能有老师指导一下。
关于Android工程师专业知识
网上很多人都在求大厂面试的真题,有是有用但是参考点并不大。因为面试官并不会面试你写在简历之外的随意一个问题。一般都是问你简历上的工作成果,以及背后延伸出来的知识点。更多的还是需要自己日常的积累。
当然也有一些老生常谈的基本考点,如**Handler
,多线程**等。
因此,背面试题不是关键。关键是回顾你的简历上的工作成果以及简历上的知识点,并不断的深挖。
下面是面试情况,以及一些简答。实际上在回答的过程中,可以回答的更加详细,本文只是筛选了部分问题简单介绍了知识点的要点。
字节面试
字节面试一共4面。字节的面试风格偏向基础的内容,以及简历上知识点的扩展。
字节1面
-
1.自我介绍,项目经历,项目上的优化项以及原因
-
2.为什么使用
mmap
优化io读写,mmap
和传统读写有什么区别?为什么选择它?
简答大意:
mmap
本质上从内核中 进程中申请了vm_area_struct
虚拟内存后,把虚拟内存保存到 file结构体address_space
结构体中的i_mmap
中。当需要访问这段虚拟地址,就会产生却也中断,通过伙伴系统申请出物理内存绑定。如果是文件映射还会预读取文件内容,之后读取可以命中后续的缓存。项目中也有频繁进行写入,可以快速的同步到内存中。
- 3.Object 中有什么方法?
简答:equal,wait等。
- 4.Object 的equal实现?重写equal需要注意的方面。
简答: equal 本质上是获取Object的 hashCode。而在hotspot虚拟机中,计算方式在类
markOop
中,hashCode的计算是获取对象的高16位向右移动16位并且与上掩码。
equal 重写时候,需要按需求处理。一般的,为了让HashMap等需要hashCode计算正确,需要把equal中每一个成员变量。
- 5.
synchronized
原理。
简答:翻译成字节码后,本质上在虚拟机中对应两个字节码
MONITOR_ENTER
以及MONITOR_EXIT
。通过Monitor进行临界区保护。当执行了MONITOR_ENTER
后,本质上就会取出Object 中的LockWord
中的记录锁状态信息。
在Android 虚拟机中,存在3种锁。通过记录
thread_id
的偏向锁,瘦锁,胖锁。瘦锁是一种乐观锁,本质上就是不断的自旋让渡cpu资源。当64次之后获取不到,则转化为胖锁。胖锁的实现是基于futex
进行同步处理的。
- 6.
volatile
原理
简答:解决三个问题。语序重拍,读时未同步,写时被修改。实现原理是基于读写栏栅处理cpu读写顺序,同时处理编译时候严格按照编码顺序处理。本质上是通过c++的
atomic
实现的。
- 7.ui优化
简答:优化ui层级,activityidleHandler 处理不重要事件,提前实例化ui到缓存池子,x2c等,展开说。
- 8.内存优化与LeakCanary的源码?以及LeakCanary的缺点和如何解决。
简答:LeakCanary 本质上是注册监听了四大组件的生命周期,当生命周期销毁时候,通过一个弱引用包裹该Activity/Fragment 等组件对象,并循环检测该对象是否销毁了。解决方案,可以通过ReferenceQueue+虚引用。当GC时候会把这些引用对象添加到引用队列中,接着通过ReferenceDeamon守护线程把数据保存在ReferenceQueue静态变量中,在ReferenceQueue的poll可以拿到。
- 9.算法:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字(Leetcode原题)。
字节2面
-
1.自我介绍,项目经历,项目上的优化项以及优化的原因
-
2.Rxjava源码原理,以及项目中你是如何将Rxjava流进行复用。
简答:模仿DisposeObserver,当ObservableCreate 调用onSubscribe后就会关联从上流到下流的关系。并通过cas设置到当前执行包的全局变量中。当第二次使用同一个流调用onSubscribe关联再度关联,就会dispose当前的rxjava流。只需要处理这一步骤即可。
-
3.你项目中高度自定义了DiskLRUCache。问LRUCache的实现?问LinkedHashMap的实现?问DiskLruCache的实现?问Glide中实现的DiskLruCache的运用。
-
4.Handler的原理
-
5.
volatile
原理 -
6.
synchronize
锁的转化流程。
简答:偏向锁转化瘦锁(owner thread id不一致且没上锁),瘦锁转化胖锁(64次获取不到锁后)。
- 7.
ReentrantLock
实现。
简答:由AQS(AbstractQueuedSynchronizer)实现。
ReentrantLock
分为公平锁和非公平锁。AQS本质上是调用acquire 时候为本线程添加到同步队列中,每一个线程代表一个Node,在每个Node会自旋竞争同步队列中的状态。公平锁需要多一个判断,就是保证自己是头节点。
-
8.ui 优化,首屏渲染时机优化
-
9.启动优化,与AlphaManager的实现。
-
10.插桩的原理以及运用。
ASM
Javapoet
动态代理
-
11.LiveData 和 ViewModel的源码实现
-
12.x2c 源码实现
-
13.DNS 原理
-
14.https的原理
-
15.算法:判断一个字符串是否是回文串(注意保证原字符串不可改变,可用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种,动态和静态
- 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的加载流程
-
8.Handler的实现
最好能回答到epoll和eventfd的层面
- 9.实现一个多线程下的消费者生产者模式
腾讯第二次面试2面
-
1.自我介绍,项目经历,项目上的优化项以及原因
-
- io 优化 与 使用
mmap
的优势和缺点
- io 优化 与 使用
-
3.ARouter 的实现,以及扩展的实现
-
4.多进程实现的路由
-
5.如何进行多进程的同步调用,此时另一个进程还没有启动?
-
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
比较,两者的优缺点
简答:
数据结构上:
ArrayMap 是两个数组组成的是为了内存优化而生;
HashMap 采用数组+链表+红黑树
内存优化:
ArrayMap 更加节省内存,因为是一个内存中连续开辟的数组,不易产生内存碎片
HashMap 以entry的方式保存key和value,对内存的利用率低
性能上:
Arraymap 查找时间是O(logN) 级别(二分法),删除和增加成员需要移动成员,速度慢,小于1000的情况下没有区别
HashMap 增删的时间复杂度就是O(1)
缓存机制:
ArrayMap 针对大小4和8的都有缓存。避免频繁GC,两个缓存池的大小上线为10
扩容机制:
ArrayMap是在容量满的时机触发容量扩大至原来的1.5倍,在容量不足1/3时触发内存收缩至原来的0.5倍,更节省的内存扩容机制
HashMap是在容量的0.75倍时触发容量扩大至原来的2倍,且没有内存收缩机制。
- 9.handler 的原理
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
尾声
如果你想成为一个优秀的 Android 开发人员,请集中精力,对基础和重要的事情做深度研究。
对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。
这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。
PS:之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
架构篇
《Jetpack全家桶打造全新Google标准架构模式》
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
ndroid工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。
这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。[外链图片转存中…(img-q0va1xQl-1713673964587)]
PS:之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
[外链图片转存中…(img-Dcf1LaET-1713673964588)]
架构篇
《Jetpack全家桶打造全新Google标准架构模式》
[外链图片转存中…(img-kAfyFzIl-1713673964589)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!