而面试往往是由两部分构成:
- 1.算法
- 2.专业知识
关于算法
为什么把算法摆在第一点,因为算法在我看来这是大部分没有面试过大厂的朋友可能会忽视的一方面。它的重要程度不比专业知识的考究来的低。
在1-2小时内,如何能快速的看到你编码水平和思维就看这些算法的考究。
因此需要对常见的数据结构比较熟悉,如链表,树,栈,堆。需要知道遇到数组相关的题型可能需要用到如快慢指针等解题思路。还有广度深度优先算法。最后,如果还有更难一点的,会涉及到回溯,动态规划等解题思路。
前面几点都比较好处理,只要在leetcode上做到一定量的题目,都能反应过来。经过了系统性的训练,遇到一些常见的算法解题思路可以快速的反应过来。
而动态规划相关的问题,我看来是最难的。关键是需要判断题目是否可以分解成小问题且小问题之间不能互相影响,接着找到动态规划方程,或者是状态转移表。
在听到面试官的算法题后,先不要急着下笔。最好在下笔之前和面试官聊聊你的思路。不同面试官的要求不同,有的面试官,希望算法是原地算法,有的面试官希望时间复杂度降低,有的希望空间复杂度降低。
最好能清晰的表达你的初步思路后,面试官会知道你的算法的方向是否正确,可以一定程度上给予你方向上的指引。
记住就算你做过原题,除非你的方案能保证是从空间和时间复杂度是最优,不然我还是建议面试者多和面试官交流。在交流的过程中,面试官也能明白你的思考过程,从而判断你这个人的编程能力如何。
最后,再给两点建议:
- 一个人光看不练是不行的,一个人瞎琢磨效率偏低。
- 最好可以买几本书或者课程指导。我是看了辉哥的课程,阅读了极客时间的刘超的数据结构,还阅读了书籍算法4。把基础都补充好后,可以去leetcode中对每一个数据结构专项进行训练。在这些基础上,在做一做剑指offer中经典题目也就差不多了。
关于专业知识
网上很多人都在求大厂面试的真题,实际上我看来意义并不大。因为面试官并不会面试你写在简历之外的随意一个问题。一般都是问你简历上的工作成果,以及背后延伸出来的知识点。更多的还是需要自己日常的积累。
当然也有一些老生常谈的基本考点,如Handler,多线程等。
因此,背面试题不是最重要。关键是回顾你的简历上的工作成果以及简历上的知识点,并不断的深挖。
下面是面试情况,以及一些简答。实际上在回答的过程中,可以回答的更加详细,本文只是筛选了部分问题简单介绍了知识点的要点。
字节面试
字节面试一共4面。字节的面试风格偏向基础的内容,以及简历上知识点的扩展。
字节1面
- 自我介绍,项目经历,项目上的优化项以及原因
- 为什么使用
mmap
优化io读写,mmap
和传统读写有什么区别?为什么选择它? - Object 中有什么方法?
- Object 的equal实现?重写equal需要注意的方面。
synchronized
原理。volatile
原理- ui优化
- 内存优化与LeakCanary的源码?以及LeakCanary的缺点和如何解决。
- 算法:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字(Leetcode原题)。
字节2面
- 自我介绍,项目经历,项目上的优化项以及优化的原因
- Rxjava源码原理,以及项目中你是如何将Rxjava流进行复用。
- 你项目中高度自定义了DiskLRUCache。问LRUCache的实现?问LinkedHashMap的实现?问DiskLruCache的实现?问Glide中实现的DiskLruCache的运用。
- Handler的原理
volatile
原理synchronize
锁的转化流程。ReentrantLock
实现。- ui 优化,首屏渲染时机优化
- 启动优化,与AlphaManager的实现。
- 插桩的原理以及运用。
- ASM
- Javapoet
- 动态代理
- LiveData 和 ViewModel的源码实现
- x2c 源码实现
- DNS 原理
- https的原理
- 算法:判断一个字符串是否是回文串(注意保证原字符串不可改变,可用O(n)的空间复杂度)。
方向:栈的考究。
字节3面 Leader面
- 1.工作软技能的考核,以及团队中的定位
- 2.如何进行io 优化,指标是什么,优化后的结果以及参数是多少?
方向:可以使用/proc/pid/stat
读取cpu的idle,iowait等。使用mmap优化后的结果。
- 3.算法:在一个单链表中,每k个节点进行反转,无法被反转的部分放在末尾。
腾讯面试
腾讯的面试风格,普遍是基于你的简历上项目经历,往细节往深处问。我是面试因算法失败了一次,后面第二次就成功了。
总结一下2次腾讯面试
腾讯第一次面试1面
- 自我介绍,项目经历,项目上的优化项以及原因
- ARouter 源码实现,项目中对ARouter的扩展实现详细设计
- ui 优化,启动优化,首屏展示时机优化
volidate
实现- Java异常捕获
- DNS 原理
- https的原理
- jni 中JNIEnv 和线程的关系
- jni中有几种注册native方法。
- Native异常捕获
腾讯第一次面试2面
- 自我介绍,项目经历,项目上的优化项以及原因
- ARouter的实现,以及自定义扩展ARouter的实现
- 项目中的io 优化,以及为什么用mmap于io优化
- mmap的实现
- mmkv 中 对应 mmap 断电时候的处理机制
- mmap没调用msync时候,落盘时机。
- 算法:合并三个单链表(可参考leetcode 合并多个单链表)
因为自己画蛇添足,把每一个节点拷贝了一次,还没有往后迭代,实在是错漏百出就挂了。脑袋还是不够清醒,结果饮恨而归。
腾讯第二次面试1面
- 自我介绍,项目经历,项目上的优化项以及原因
- ARouter 的实现,以及扩展的实现
- 启动优化,以及ARouter的启动优化方式,ARouter的分区方式
- Navigation的源码解析
- 基于Navigation 编写路由框架NavigationRouter 的源码实现,以及实现的优点
- Navigation 实现的路由框架中如何处理Activity和Fragment 嵌套启动的方式
- class的加载流程
- Handler的实现(最好能回答到epoll和eventfd的层面)
- 实现一个多线程下的消费者生产者模式
腾讯第二次面试2面
- 自我介绍,项目经历,项目上的优化项以及原因
- io 优化 与 使用
mmap
的优势和缺点 - ARouter 的实现,以及扩展的实现
- 多进程实现的路由
- 如何进行多进程的同步调用,此时另一个进程还没有启动?
- 数据结构中不支持多线程的数据结构,如果使用多线程操作会造成什么结构
ArrayMap
实现HashMap
与ArrayMap
比较,两者的优缺点- handler 的原理
- handler 是怎么进行postDelay 延时操作。
- 当handler 只有一个延时的message时候,Looper中是如何运行。
volidate
原理- 当没有添加
volidate
修饰属性的时候,数据什么时候从缓存行刷新到主存。 - 算法题:在一个n*n的方格中。有两种方格,1代表阻塞不能经过,0代表可达。两点坐标,a和b。问a到b的最短路径。
腾讯第二次面试3面和4面
腾讯3面和4面是联系到一起的,这里一起说了
- 自我介绍,项目经历,项目上的优化项以及原因
mmap
实现原理和io优化- View的绘制流程,从
setContentView
解析xml到View的绘制结束。 - 硬件渲染流程
- SurfaceFlinger 在 View绘制流程中扮演的角色
- Choregrapher 的工作原理
- OOM 如何优化,内存爆满是虚拟内存容易先爆掉还是物理内存容易,一口气映射4g的内存是否会发生异常。
- Bitmap 如何优化避免OOM,为什么放在native中bitmap不容易OOM
- 一个进程最多可以使用多少fd
- 你研究过RN和Flutter,RN的渲染机制和Flutter的渲染机制是如何运作的?他们之间区别是什么?
- 插件化你是如何实现的。
- 算法1: 将一个int的数字转化成汉语说法。如10000转化为一万。
- 算法2:中国下棋的马,能否吃掉另一个坐标的旗子,请找出坐标
腾讯二次面试5面
本次面试是两个面试官进行考察,考察的东西偏向网络协议。
- 自我介绍,项目经历,项目上的优化项以及自己开源在GitHub上项目的特点。
- 当遇到弱网络时候的优化
- 当遇到弱网络时候,网络是如何进行文件重传
- 当遇到弱网络时候,手机连接上了4g,但是没有数据流量时候,如何检测并恢复。
- 当app在播放音视频的时候,需要注意的要点,以及相关的实现。
总结
从专业技能考察可以看到,实际上整个面试过程。腾讯面试的会相对仔细一点,技术广度更加广一点;而字节则更加偏向基础是否扎实。都是从你的简历项目,技术点开始询问,并根据你回答的问题,不断的调整询问的方向,不断的向下挖你的知识点,看能达到什么程度
但是无论如何,你回答的层面最好足够深,从源码层级说起来。有时候面试官的对问题的看法和你的看法有分歧,此时就需要你是否可以从源码的层面上对这些问题有自己的解释。
面试的时候只需要沉着冷静的思考,从源码的角度对面试官抛出来问题进行分析,就能比较轻松的解决。
最后有人好奇我去了哪里。应该是去腾讯。
Android开发技能储备
Android学习是一条漫长的道路,我们要学习的东西不仅仅只有表面的 技术,还要深入底层,弄明白下面的 原理,只有这样,我们才能够提高自己的竞争力,在当今这个竞争激烈的世界里立足。
如果你觉得自己学习效率低,缺乏正确的指导,可以参考下下面分享我多年工作以来收集整理的学习路线,给大家做个参考:
学习一线大厂的各项技术:
大厂是我们的技术先驱,不仅仅是各种技术,还有很多令你大开眼界的使用方法,学习这些有利于自己竞争力的提高,深入理解后也可以提升你的学习效率。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
学习福利
【Android 详细知识点思维脑图(技能树)】
其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。
这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
由于篇幅有限,这里以图片的形式给大家展示一小部分。
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
里以图片的形式给大家展示一小部分。
[外链图片转存中…(img-FYBtiDdc-1712990370514)]
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-aFXlAcWp-1712990370514)]