异常
-
异常体系、分类、机制。
-
与error的区别。
IO
主要还是问NIO的原理以及优缺点。建议把缓冲流的原理也得学一学并进行比较。
线程池
-
内部原理。必会的啊。
-
关键参数作用及如何配置。重点在如何配置,需要结合具体的机器情况、任务情况等等考量。
-
线程池的作用。不仅仅只是线程复用,更重要的是管理线程、控制线程数量。这个也比较考察具体的项目运用理解。
-
常见的四种线程池。
并发
-
sychronize。必问,java的锁机制。特别是jdk6之后的锁优化以及运用场景。为什么是重量级的、JVM层如何实现如果了解可以加分。
-
Lock。必问,AQS的原理最好懂。一般会拿来和synchronize比较。
-
volatile。必问,会拿来和锁比较,他的两个重要作用。更深点会问到cpu缓存一致性协议、以及指令重排的类型与原理。
-
CAS。必问,问原理以及ABA问题。
-
死锁。一般询问如何解决或者产生的条件。
-
Object的wait和notify。阻塞唤醒,一般会用一个代码或者具体的场景来询问如何保证多线程同步。
-
ThreadLocal。原理、内存泄露等
-
这一块问的还是比较多,而且大都可以深入去问,看自己的学习程度了。
JVM
-
GC机制。必问。
-
类加载机制。必问,同时还会问双亲委托机制。
-
方法调用过程。这个也问的挺多,也看对JVM的学习程度了。
-
线程与进程的内存关系。如一个线程占多少内存、一个进程可以开多少线程、一个进程占用多少内存等。
-
内存分布。JMM、运行时数据区、native内存分布。很看对JVM的理解程度。
Kotlin
kotlin其实问的很少,现在大部分的项目还是使用Java开发的。一些有kotlin业务的公司会问,但是问的内容也不多。这一块如果还没学习其实不急的,把Java学好才是王道,kotlin和java在原理上,都是互通的。
协程
问的是最多的,主要是理解线程和协程的关系、协程的优缺点。这个也看个人的学习程度了。
run、let、also、with、apply
注意返回值以及作用域
特性的具体实现
如默认参数的具体实现。有了解过最好了,没有的话就联想Java是如何实现的,如默认参数可以联想方法重载。
计算机网络
计网这一部分主要还是HTTP和TCP的内容了,经典中的经典。需要注意的是链路层、网络层的一些协议要了解,也是计算机基础了,被问到不会的话会比较尴尬。其次是一些新的协议如QUIC、http3.0等可以了解一下,面试会很加分,同时也可以进一步去理解TCP的优缺点。
HTTP
http在android上的体现并不多,因为大部分的工作都给框架解决了,问的问题其实很少。
-
历代http的优化以及原因
-
请求方法、响应码
HTTPS
必问。一定要会了
-
原理以及和http的区别。加密算法、hash摘要、ca证书验证都要了解
-
建立连接过程
-
破解:中间人攻击等
数据链路层、IP层
-
ARP和RARP协议
-
NAT协议
-
DNS
-
这部分主要问一些常见的协议,考察计网功底,这里列出来的是笔者考察过的,读者需要比价系统地去学习这一块。
TCP
-
握手挥手
-
拥塞控制
-
可靠传输原理
-
缺点以及如何改进。这个是比较重要的,对应http3.0的优化就是针对TCP的缺点来入手的。
-
TCP的连接数目上限
-
TCP非常重要,必问的内容,不会的读者一定要去好好学习一下。
UDP
-
优缺点
-
和TCP比较
-
应用场景
-
一般和TCP一起出现,询问他们的区别,以及如何通过UDP来优化TCP的缺点。
数据格式
json的优缺点,为什么要使用json而不是XML。熟记就可以了。
设计模式
设计模式这一块问的不是很多,原因是设计模式需要实际的编码才能去真正理解他的好处。所以大部分情况下面试官都是询问在项目中用了哪些设计模式、或者哪些开源框架用了什么设计模式。其次问的最多的就是三大架构模式了,必会的。
常见的设计模式
一般面试官会让我们讲自己认识的设计模式,按照自己的理解讲出来就好了。
在项目和源码中的体现
问的最多的就是:你看过的框架源码都使用了哪些设计模式。不仅考察了设计模式、还考察了源码。另外也会问在项目中运用了哪些设计模式。
MVC\MVP\MVVM
基本必问了。结合具体的项目实现以及自己的思考,分析他们的优缺点、适用场景等。
计算机基础
计算机基础这里包括了c语言、操作系统、数据库库、以及前面的计网等等。这部分直接问的内容不多,但却是非常重要的,也是考验我们基础扎不扎实的地方。其次,面试官也会用一些业务场景来考验我们的理解程度,如聊到java并发时,问具体为何线程切换代价高;又如聊到JVM内存分布时,问在native层是怎样的内存分布以及逻辑内存物理内存等;再如聊到volatile,会问到cpu缓存一致性的问题等等。这些都是非常考验功底的内容。因而,这些基础内容要学好,不仅是为了面试,更是为了让我们自己可以更好地学习理解知识。
C语言
问的很少,偶尔会问到。笔者只被问到:同构结构体的内存占用、指针相关问题。
C语言作为语言鼻祖,一些基础还是要会的。
操作系统
-
中断原理、作用。
-
死锁原理以及如何解决。
-
操作系统这一块确实问的不多,同样也是考察基础功底了。可以不问,但是问到一定要会。
项目
–
项目是非常重要的,一个拥有亮点的项目可为面试加分不少。面试前需要把自己的项目总结一下,提炼出项目的亮点难点。假如有优秀的项目,一定要把他写在简历上,并把亮点表现出来。
在面试中面试官一般会先让我们介绍项目,介绍项目一般可以按照这个模板来介绍:项目的背景、项目的内容、自己负责的内容、项目亮点。技术面的面试官会询问项目有什么技术亮点难点,这个时候可以把我们提前准备的亮点给面试官表述出来。例如做了什么优化、自定义view等,体现出自己在技术上的能力。
需要注意的是:面试前要把自己的项目总结好,包括背景、内容、技术难点、亮点;面试时不要觉得自己项目很捞,而要表现出自己的自信,把项目内容有条不紊地表达出来。后面回答好面试官提出的问题就可以了。
算法
–
算法这一块,先看看笔者在面试中遇到的算法题:
-
重排链表
-
出现一次的字符
-
K个一组链表反转
-
凑零钱
-
全路径简化
-
字符串拆分
-
二叉树路径和
-
链表是否有环
-
二叉树深度
如何提升算法,其实就是刷题,刷题,还是塔喵的,刷题。算法没有捷径可走,需要靠自己勤奋去做题。
总之,学好算法对我们是一件终身受益的事情,而不管企业考察难度如何。
面试中
未知,所以恐惧。
在没开始面试前,可能很多的读者都是人生第一次入职面试,肯定非常紧张的,在面试前甚至想着,要不算了,不面了。这都是正常的。解决的办法就是:去面一次。经历过一次之后就不会紧张了。或者说,没那么紧张了。
大厂的面试官的体验一般都是非常好的,笔者到目前为止遇到的所有面试官,都给我非常好的面试体验。
在面试的时候要注意语速与咬字清晰问题。笔者本身是一个语速很快的人,加上面试紧张,面试官很难听清楚我到底在讲什么。面试一定要控制语速,可以提前给自己录音看看什么程度的语速是最合适的。
其次,要注意自己的表达清晰。仔细听好面试官的问题,然后先组织好思路,再慢慢表述出来。回答问题,也是相当于和一个讲解知识点的过程,思路一定要清晰。一些口头禅、冗余的表达尽量去除。
有一个需要注意的点就是:不了解的东西,千万不要讲出来,切记!!!。例如,我们不懂NIO,在面试官问到传统IO的时候,就不要拿NIO去比较或者提起NIO。如果提起了,面试官99%会问一些NIO的问题,这时候就会灰常尴尬。而如果自己掌握了NIO,那么就可以不断提起NIO,把面试官的询问重点往我们熟悉的知识点牵引。
最后需要注意一点的是:拒offer是一个很考验情商的事情。这不是在凡尔赛,而是一个非常重要的事情,处理不好可能会上企业黑名单。举个最简单的例子:
现在手上拿到了企业a的offer,但是自己更加向往的企业是b,但是b还在面试。这个时候企业a的HR问你:a和b你选择哪个?然后你坚定地说肯定选择a啊。然后拖了一两个星期,b通过了,然后跟a的HR讲我不去,我去b了。不仅影响了企业a的招聘,而且HR还会觉得你言而无信。
所以,拒offer最好是趁早,不要影响人家的招聘;其次是语言前后要一致,不要当渣男or渣女。[狗头]
最后
–
最后想要告诉读者的是:影响面试结果的因素有非常多,如面试官心情、口味,当天自己的状态,岗位要求等等。笔者的两个同学,都是前面连续挂了两次一面,但后面也都成功拿到了BAT offer,甚至不止一个。挂掉面试绝对不是简单的自己能力不行,而是多方面的因素,总结好经验,继续面试就好了。
迈出第一步,开启第一轮面试非常重要。不要觉得自己“好菜啊,投了肯定不过的,不投了”。不投,怎么知道不过呢?面试也是一个学习的过程,会慢慢发现自己的不足,包括表达、知识等等。所以,如果你还在犹豫,赶紧投起来吧。
希望这篇文章能够给正在找实习的读者提供一点帮助,先预祝各位实习面试顺利吧。有什么问题或者想了解的内容可以评论区交流。
面试前的系统复习路线参考
面试:如果不准备充分的面试,完全是浪费时间,更是对自己的不负责!
接下来分享的系统学习资源以详解各大互联网公司的 Android 常见面试题为主线,从面试的角度带你介绍必备知识点,以及该知识点在项目中的实际应用。
**帮你在现在的基础上,重新梳理和建立 Android 开发的知识体系。**无论是你短期内想提升 Android 内功实力,突破自己工作中的能力瓶颈,还是准备参加 Android 面试,都会在这份资料中有所一些收获。
1、看视频进行系统学习
前几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。
另外,我自己也珍藏了好几套视频,有需要的我也可以分享给你。
2、进行系统梳理知识,提升储备
客户端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
-
架构师筑基必备技能: 深入Java泛型+注解深入浅出+并发编程+数据传输与序列化+Java虚拟机原理+反射与类加载+动态代理+高效IO
-
Android高级UI与FrameWork源码: 高级UI晋升+Framework内核解析+Android组件内核+数据持久化
-
360°全方面性能调优: 设计思想与代码质量优化+程序性能优化+开发效率优化
-
解读开源框架设计思想: 热修复设计+插件化框架解读+组件化框架设计+图片加载框架+网络访问框架设计+RXJava响应式编程框架设计+IOC架构设计+Android架构组件Jetpack
-
NDK模块开发: NDK基础知识体系+底层图片处理+音视频开发
-
微信小程序: 小程序介绍+UI开发+API操作+微信对接
-
Hybrid 开发与Flutter: Html5项目实战+Flutter进阶
知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结。
主要内容:
Java 基础(★★)
-
面向对象思想
-
多态
-
异常处理
-
数据类型
-
Java 的 IO
-
集合
-
Java 多线程
Java 高级(★★)
-
Java 中的反射
-
Java 中的动态代理
-
Java 中的设计模式&回收机制
-
Java 的类加载器
Android 基础(★★★)
-
Android 基本常识
-
Activity
-
Service
-
BroadCastReceiver
-
ContentProvider&数据库
-
Android 中的布局
面试复习路线,梳理知识,提升储备
自己的知识准备得怎么样,这直接决定了你能否顺利通过一面和二面,所以在面试前来一个知识梳理,看需不需要提升自己的知识储备是很有必要的。
关于知识梳理,这里再分享一下我面试这段时间的复习路线:(以下体系的复习资料是我从各路大佬收集整理好的)
- 架构师筑基必备技能
- Android高级UI与FrameWork源码
- 360°全方面性能调优
- 解读开源框架设计思想
- NDK模块开发
- 微信小程序
- Hybrid 开发与Flutter
知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结:
《960全网最全Android开发笔记》
《379页Android开发面试宝典》
历时半年,我们整理了这份市面上最全面的安卓面试题解析大全
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。
如何使用它?
1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数
《507页Android开发相关源码解析》
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。
总结:
[外链图片转存中…(img-xcqW7pfo-1720107851346)]
《960全网最全Android开发笔记》
[外链图片转存中…(img-fPxllZkS-1720107851346)]
《379页Android开发面试宝典》
历时半年,我们整理了这份市面上最全面的安卓面试题解析大全
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。
如何使用它?
1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数
[外链图片转存中…(img-NgD485QG-1720107851346)]
《507页Android开发相关源码解析》
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。