在开始之前说说我的基本情况:c9本科双非研究生20届毕业,6月22号入职深圳今日头条,在2020年12月搭上校招补录的末班车上岸,岗位是android客户端开发工程师。此文记录一下我之前的面试经验,顺便分享一波复习资源,文末有资源链接自取。
我的秋招因为被导师的项目耽误了,所以10月份才开始投递简历,投递字节跳动客户端更是在挂了好几家公司之后的11月底,算是捡了个校招补录的便宜。因为客户端确实一直处于缺人状态,所以相对其他岗位不容易饱和,竞争也没那么激烈,有想法的可以试一试。
言归正传,我的研究生专业是科学计算可视化,方向偏冷门。我的代码能力尚可(c/c++),但数据库/网络基本没有工程经验(仅限于大三课程水平,遗忘过半),不会机器学习,不会java,没有大厂实习经历。
面试官只精通JAVA,而我只会C++,开始了愉快的交流,问题先后顺序可能有误(要不然上来两个问题都不会面试官会怀疑审简历的眼瞎了)
问的很细,幸好把方向引向了自己熟悉的领域:操作系统、数据结构&算法
(小插曲:第一天刚面10+分钟面试官有紧急事情终止了,听说是产品在美帝被告了要走法律流程orz,说改天继续,当时我有点慌,幸好事后HR通知第二天接着面)
定义一个线程类
class Thread
{
int waiting;//等待资源的id
int count;//已占有资源数量
int* holdings;//已占有资源数组(数组内存有count个整数,代表占有资源的id)
}
bool isThreadLocked(int n, Thread* thread)
{
//TODO
}
输入一个长度为N的Thread[]数组,判断是否存在死锁,返回true/false(哈希表+资源依赖链找环)
11月25号投的简历,11月29号一二面,12月3日三面,12月9日offer-call,12月12日录用函,这效率不可谓不快。
面试官考察的基础内容是有共同点的,无非是数据结构、计网、数据库、操作系统、算法这几门核心课的基础知识(其实我一直觉得计网和数据库不算核心课,毕竟很多方向和它俩不沾边)。有不会的大方承认,千万不要打肿脸充胖子。但是有一点很重要,字节跳动确实很看重coding,面试中的手撕代码环节,红黑树虽不至于但至少快排二叉树链表要熟练,然后再准备看一些leetcode中等题。
1、结合招聘岗位,只讲重点
简历内容这么多,实际的你,更有很多很多可以描述的东西。但时间有限,没有面试官会听你说个没完。
根据你求职的岗位,说重点即可。
其实简历制作的原则,也是一样。只是自我介绍时间更短,内容更精华。
2、有理有据,少说空话
如果你说“自己学习能力强”,这就是一句假大空的话。谁都可以说自己学习能力强。
你如果真的在这方面有突出,就要举一个例子,比如是1个月从0到1考了什么证书等。
3、有开头有结尾,有逻辑
开头问候,结尾总结。中间1、2、3条理清楚。
4、特别提醒
自我介绍中的内容,很可能是面试官后续发问的内容。所以,一是要引起重视,讲最重要的,你最想让面试官知道的内容。 而是做好准备,扬长避短,不要给自己挖坑。
比如前面你说自己学习能力强,但是没有举例子。
面试官很可能,顺着你的话问你,怎么证明你学习能力强呢? 结果你答不上来,或者是非常普通的成绩,根本不能算是“学习能力强”。 那你就是给自己挖坑了。
其实自我介绍也是每个人各有不同,说起来也只能提供大致的思路。和你具体的求职岗位、经历、个人风格有很大的关系。
官方文档就是教科书,源码一定要抽时间多看,网上的分析和讲解太多太乱,不要一味地跟着写,这里简单列了几个面试时喜欢反复讲的知识点。
Java垃圾回收机制
需要理解JVM,内存划分——方法区、内存堆、虚拟机栈(线程私有)、本地方法栈(线程私有)、程序计数器(线程私有), 理解回收算法——标记清除算法、可达性分析算法、标记-整理算法、复制算法、分代算法,优缺点都理解下。
需要了解下Activity栈和taskAffinity
View的绘制流程
ViewRoot
->performTraversal() ->performMeasure() ->performLayout() ->perfromDraw() ->View/ViewGroup measure() ->View/ViewGroup onMeasure() ->View/ViewGroup layout() ->View/ViewGroup onLayout() ->View/ViewGroup draw() ->View/ViewGroup onDraw()
看下invalidate方法,有带4个参数的,和不带参数有什么区别;requestLayout触发measure和layout,如何实现局部重新测量,避免全局重新测量问题。
事件分发机制
->dispatchTouchEvent() ->onInterceptTouchEvent()
onTouchEvent()
requestDisallowInterceptTouchEvent(boolean)
还有onTouchEvent()、onTouchListener、onClickListener的先后顺序
消息分发机制
这个考得非常常见。一定要看源码,代码不多。带着几个问题去看:
其他性能优化
Android学习是一条漫长的道路,我们要学习的东西不仅仅只有表面的 技术,还要深入底层,弄明白下面的 原理,只有这样,我们才能够提高自己的竞争力,在当今这个竞争激烈的世界里立足。
如果你觉得自己学习效率低,缺乏正确的指导,可以参考下下面分享我多年工作以来收集整理的学习路线,给大家做个参考:
除了上面的学习路线,还可以额外的配合以下方式学习,效果翻倍~
①看视频进行系统学习
前几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。
另外,我自己也珍藏了好几套视频,有需要的我也可以分享给你。
②读源码,看实战笔记,学习大神思路
“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 + 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。
主要内含微信 MMKV 源码、AsyncTask 源码、Volley 源码、Retrofit源码、OkHttp 源码等等。
③面试前夕,刷题冲刺
面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。
关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三。
④2020大厂面试高频知识点
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。