写点什么

【Android】金三银四面试集合,android 面试题大全

用户头像
Android架构
关注
发布于: 11 小时前

之后在 26 号进行了蚂蚁的一面,总体难度还是比较高,问到了比较多的一些优化、缓存的内容。而这一部分我接触得不多,大多是靠推理、猜测来回答的,也回答得不是很好。后面还跟面试官聊了一些博客相关的内容。面试完之后我觉得悬了,就也没抱着活的希望。接着就在 31 号上午收到了蚂蚁的电话,约了下午的面试。[oh my god, amazing]


蚂蚁二面是比较特殊的,一共有两个面试官:一个是技术面试官,另一个是 HR。技术面试官先提问了一会,大概 15 分钟吧;之后是 HR 跟我聊,也是聊了 15 分钟。主要问的内容都是在了解我的情况,例如工作室如何、成绩如何、怎么学习、怎么管理时间、博客等等。给我印象比较深刻的是这个 HR 姐姐。和其他企业的 HR 不同的是,面试过程中就像在和一个朋友聊天,了解我的学习以及周边环境的情况,还会给我反馈表达她对我的印象。


然后在 4 月 2 号,面试官加了我微信,给我补了笔试的内容,就是做算法题。过了两天,收到了蚂蚁的录用喜报!!!当时掐了一下大腿,没在做梦。。。



再拐回来说一下腾讯和字节跳动的后续。腾讯在 3.24 进行了一面、3.29 进行了二面、4.2 进行了三面、4.13 进行了 HR 面试。前面的速度是比较快的,只是 HR 可能比较忙,所以一直没约上,隔了比较久。字节跳动在 4.1 一面、4.6 二面、4.9 三面、4.14HR 面,半个月完成了 4 个面试,速度比之前的也快了很多。


前面还讲到了三月初投递的虎牙,但虎牙的速度是真的慢,我甚至以为我的简历被筛选掉了。直到四月份才开始约面试。



虎牙在 4 月 6 号进行了一面,隔了几天约了线下二面,也是终面。但此时我已经有意向的企业,就拒绝了面试。


整个面试流程,给我最大的感触是:不尝试,永远是 0;尝试了,概率再小,都有可能是 1


故事到这里就讲完了。诶,怎么没说去哪个公司了?哈哈,你猜我去哪了?


[](


)知识总结




面试中会被考察的具体问题有三个影响因素:部门需求、简历、面试中提到的知识点。因此不同的部门不同的面试者遇到的面试题很可能是完全不一样的,这也是我为什么不直接把面试题放出来的原因,没有多大的参考价值。


这一部分主要总结在面试中被考察到的知识点,多为高频面试问题,读者可以自行考察是否这些知识都掌握了。需要特别注意的是这并不是全部的知识体系,仅仅是笔者遇到的面试题,读者可以按照大体的方向去学习,但切不可认为这样就足够了,这里提到的知识点是远远不够的。


面试的过程中更多的时候不会单纯地考察知识点,而是会结合一些需求或者业务场景来多方面考察对知识点的理解。因此笔者建议,对于知识点要以理解为首要任务,而不是背诵答案。

[](

)Android


总体来说,本次春招问的 android 内容其实不多,主要还是看着我的简历问,简历写得不多,问得也就比较少。但 android 的基础内容如 handler、view 机制等还是要会的,其他的有更加深入的研究可以写在简历加分,如 Binder、系统服务、优化等。


  • Activity


  1. Activity 启动流程。其中考察最多的类似问题是:【从桌面点击一个图标之后,到界面显示,这个过程发生了什么?】。很多时候面试官会结合 activity 生命周期来考问:在启动流程的哪些阶段哪些生命周期被回调,此时 Activity 状态如何。


  1. 启动模式。也就是常见的四种启动模式,但面试官更喜欢问何时使用他们,也就是使用场景。


  1. 生命周期。这个很少单独问,一般和启动流程或者具体的业务场景结合考问。


  1. context。主要是内存泄露的考察以及 application 和 activity 两种 context 如何选择。


  • Handler


  1. 内部原理。Handler 必会的啊,android 的消息机制,可以称为 android 程序的引擎来的。


  1. 同步屏障。涉及到绘制优化、屏幕刷新机制等。


  1. 阻塞唤醒原理。这里一般是会问为何loop()方法是死循环却不会占用 cpu 时间片 or 为何next()方法阻塞却不会卡死。更深一点会问到 Linux 的 IO 多路复用epoll原理。


  1. 卡顿与内存优化。整个主线程的所有任务都必须经过 Looper,是排查卡顿和 ANR 的关键点,以及消息太多会造成的后果等。


  1. 消息复用。


  • 图片


  1. 计算一张图片大小。分辨率 x 像素点大小,考察得很多次。


  1. 加载优化。如 LaunchActivity 同时加载的图片太多如何优化、view 的大小比图片小如何优化等。


  1. 缓存优化。内存缓存、硬盘缓存。


  1. Glide 框架。重点就是 Glide 对上面的优化的实现原理,因此需要着重看 Glide 的缓存原理。


  1. drawable。对比使用图片和 drawable 的好处,以及 drawable 的原理。


  • SharePreference


  1. 内部原理


  1. commit 和 apply 的区别


  1. 这部分考察得不多,但建议读者可以深入理解 sp 的缺点,如导致 ANR 原理,以及新框架 MMKV、Data Store 的优点。


  • window


考察得非常少,主要 window 的类型、以及 window 的真正定义理解即可。


  • view


  1. 事件分发流程。考察得最多,基本把整个分发流程讲清楚就好了;其次还会考察如何解决具体的冲突场景。


  1. 应用界面的 view 层级。


  1. 绘制流程与时机。activity 启动时到 onResume 方法被调用,view 依旧还未被绘制。


  • IPC


  1. 常见 IPC 类型以及优缺点。


  1. Binder 机制。优点、缺点、特点、和传统 IPC 比较。Binder 涉及到的很多是偏底层,更多的时候考察的是上层的应用,如和 socket 比较等。


  1. socket。这个会重点问,涉及优缺点、使用场景、和 binder 相比等。


  • 序列化


  1. serializable 和 parcelable 的原理,以及各自的优缺点、应用场景。


  • jetpack


  1. 使用 jetpack 的好处与坏处。


  1. 框架原理。这部分如果写在简历也很少问,看面试官;但如果问的话,一般会问原理。


  • okHttp


  1. 拦截器以及责任链思想。这个是问的最多的。


  1. 内部调度器对线程、任务数的并发控制。


  1. 优点缺点,和 URLConnection 相比的好处,诞生的背景等。


  • 优化


  1. 性能优化。问得很多,主要看自己平时有没有做过优化。


  1. 卡顿优化。一般询问如何定位和解决卡顿问题。


  1. 内存优化。一般是内存泄露、或者减少内存占用等。


  1. ANR。一般会考察原理以及如何解决。


  1. 工具:leakcanary、profiler。优化涉及的内容太多,这个属于比较深的内容,还是得看自己平时的项目积累。

[](

)Java


Java 的考察是一个非常考验功底的地方,很多的知识点都是基础中的基础,同时又都可以延伸到底层的逻辑。这些知识点在实际的运用中,也有很多的情况需要考虑,考察我们对于知识点的运用。例如线程池,可以从参数作用、到线程池原理、到阻塞唤醒机制、到实际项目的参数配置,有非常多的知识点可以考察。因而这一块就看各位的造诣了。


当然,一些基础或者常考的知识点还是得会的。


  • 集合框架


  1. HashMap。几乎每家公司都问,主要是内部原理如 hash 算法、冲突解决方案、扩容方案、红黑树的优缺点等。必会的内容,不会就直接当场去世了。


  1. HashSet。内部使用 HashMap 来实现,value 设置为 object。记住这个就好了。


  1. ConcurrentHashMap。必问。他的并发原理以及好处,同时有些面试官也会问缺点等问题。


  1. Hashtable、SychronizeMap。一般和 ConcurrentHashMap 一起问,进行对比。


  1. CopyOnWriteArrayList。一般会作为线程安全方法来进行比较优缺点。


  1. 集合框架重点还是在 Map,但是其他的框架 List 和 queue 的原理也是要了解的。


  • 访问限制符


public protect default private 四个要懂,基础知识了。(笔者就是忽略了这些当时回答错了)特别注意 protect 是可以跨包访问的。



  1. 4 种内部类,特别注意每个 class 编译后都会产生一个 class 文件,不管静态或非静态。面试踩坑了


  1. lambda 的本质。就是匿名内部类。


  1. 抽象类和接口的区别。这个很看理解,如果有开发过具体项目的会回答得更加深刻,这是背八股文体现不出来的。


  • 异常


  1. 异常体系、分类、机制。


  1. 与 error 的区别。


  • IO


主要还是问 NIO 的原理以及优缺点。建议把缓冲流的原理也得学一学并进行比较。


  • 线程池


  1. 内部原理。必会的啊。


  1. 关键参数作用及如何配置。重点在如何配置,需要结合具体的机器情况、任务情况等等考量。


  1. 线程池的作用。不仅仅只是线程复用,更重要的是管理线程、控制线程数量。这个也比较考察具体的项目运用理解。


  1. 常见的四种线程池。


  • 并发


  1. sychronize。必问,java 的锁机制。特别是 jdk6 之后的锁优化以及运用场景。为什么是重量级的、JVM 层如何实现如果了解可以加分。


  1. Lock。必问,AQS 的原理最好懂。一般会拿来和 synchronize 比较。


  1. volatile。必问,会拿来和锁比较,他的两个重要作用。更深点会问到 cpu 缓存一致性协议、以及指令重排的类型与原理。


  1. CAS。必问,问原理以及 ABA 问题。


  1. 死锁。一般询问如何解决或者产生的条件。


  1. Object 的 wait 和 notify。阻塞唤醒,一般会用一个代码或者具体的场景来询问如何保证多线程同步。


  1. ThreadLocal。原理、内存泄露等


  1. 这一块问的还是比较多,而且大都可以深入去问,看自己的学习程度了。


  • JVM


  1. GC 机制。必问。


  1. 类加载机制。必问,同时还会问双亲委托机制。


  1. 方法调用过程。这个也问的挺多,也看对 JVM 的学习程度了。


  1. 线程与进程的内存关系。如一个线程占多少内存、一个进程可以开多少线程、一个进程占用多少内存等。


  1. 内存分布。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 上的体现并不多,因为大部分的工作都给框架解决了,问的问题其实很少。



  1. 历代 http 的优化以及原


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码



  1. 请求方法、响应码


  • HTTPS


必问。一定要会了



  1. 原理以及和 http 的区别。加密算法、hash 摘要、ca 证书验证都要了解


  1. 建立连接过程


  1. 破解:中间人攻击等


  • 数据链路层、IP 层


  1. ARP 和 RARP 协议


  1. NAT 协议


  1. DNS


  1. 这部分主要问一些常见的协议,考察计网功底,这里列出来的是笔者考察过的,读者需要比价系统地去学习这一块。


  • TCP


  1. 握手挥手


  1. 拥塞控制


  1. 可靠传输原理


  1. 缺点以及如何改进。这个是比较重要的,对应 http3.0 的优化就是针对 TCP 的缺点来入手的。


  1. TCP 的连接数目上限


  1. TCP 非常重要,必问的内容,不会的读者一定要去好好学习一下。


  • UDP


  1. 优缺点


  1. 和 TCP 比较


  1. 应用场景


  1. 一般和 TCP 一起出现,询问他们的区别,以及如何通过 UDP 来优化 TCP 的缺点。


  • 数据格式


json 的优缺点,为什么要使用 json 而不是 XML。熟记就可以了。

[](

)设计模式


设计模式这一块问的不是很多,原因是设计模式需要实际的编码才能去真正理解他的好处。所以大部分情况下面试官都是询问在项目中用了哪些设计模式、或者哪些开源框架用了什么设计模式。其次问的最多的就是三大架构模式了,必会的。


  • 常见的设计模式


一般面试官会让我们讲自己认识的设计模式,按照自己的理解讲出来就好了。


  • 在项目和源码中的体现


问的最多的就是:你看过的框架源码都使用了哪些设计模式。不仅考察了设计模式、还考察了源码。另外也会问在项目中运用了哪些设计模式。


  • MVC\MVP\MVVM


基本必问了。结合具体的项目实现以及自己的思考,分析他们的优缺点、适用场景等。

[](

)计算机基础


计算机基础这里包括了 c 语言、操作系统、数据库库、以及前面的计网等等。这部分直接问的内容不多,但却是非常重要的,也是考验我们基础扎不扎实的地方。其次,面试官也会用一些业务场景来考验我们的理解程度,如聊到 java 并发时,问具体为何线程切换代价高;又如聊到 JVM 内存分布时,问在 native 层是怎样的内存分布以及逻辑内存物理内存等;再如聊到 volatile,会问到 cpu 缓存一致性的问题等等。这些都是非常考验功底的内容。因而,这些基础内容要学好,不仅是为了面试,更是为了让我们自己可以更好地学习理解知识。


  • C 语言


问的很少,偶尔会问到。笔者只被问到:同构结构体的内存占用、指针相关问题。



C 语言作为语言鼻祖,一些基础还是要会的。


  • 操作系统


  1. 中断原理、作用。


  1. 死锁原理以及如何解决。


  1. 操作系统这一块确实问的不多,同样也是考察基础功底了。可以不问,但是问到一定要会。


[](


)项目




项目是非常重要的,一个拥有亮点的项目可为面试加分不少。面试前需要把自己的项目总结一下,提炼出项目的亮点难点。假如有优秀的项目,一定要把他写在简历上,并把亮点表现出来。


在面试中面试官一般会先让我们介绍项目,介绍项目一般可以按照这个模板来介绍:项目的背景、项目的内容、自己负责的内容、项目亮点。技术面的面试官会询问项目有什么技术亮点难点,这个时候可以把我们提前准备的亮点给面试官表述出来。例如做了什么优化、自定义 view 等,体现出自己在技术上的能力。


当然,很多时候我们的项目并没有什么亮点,甚至就是一个 Demo,例如笔者。在被面试官问到项目有什么技术难点时支支吾吾说不出来。这时候可以把项目自己实现的功能讲出来,例如一个 wanAndroid App 可以这样描述:首页使用 viewPager+recyclerView 来展示后台数据,点击后可跳转到对应文章详情页;登录注册需要跳转到另一个 Activity,采用 okHttp 拦截器和 SharePreference 来实现记住登录 。千万不要说:额、、就是一个练习 demo,拉数据展示,没有什么亮点。这样让面试官完全无法了解我们的项目到底如何,也无法从项目开始提问来了解我们,面试效果就大打折扣了。


面试官对于我们的项目有了一定的了解之后,会继续深问一些相关的知识点或者一些情况是如何解决的。以 wanAndroid App 为例子,面试官可以进一步提问:viewPager 有做缓存吗?recyclerView 缓存机制如何?首页图片过多首页加载缓慢导致卡顿如何解决?为什么使用拦截器实现,他有什么优缺点?SharePreference 的原理如何等等。


非技术面试官可能会问一些如:项目中学习到什么?你们是如何合作的?项目过程中遇到过什么问题等等。常见的问题可以提前准备,把自己的心得整理一下。


那,没有项目怎么办?那赶紧去写一个。正如某个大厂的面试官说的:到现在都不知道你们这些实习生,到底是真的会,还是背八股文的。的确如此,有时候我们甚至都不知道自己是不是真的懂,唯一的办法就是,是骡子是马拉出来遛一遛,写个项目。项目是面试官一个了解我们的非常好的方式。


需要注意的是:面试前要把自己的项目总结好,包括背景、内容、技术难点、亮点;面试时不要觉得自己项目很捞,而要表现出自己的自信,把项目内容有条不紊地表达出来。后面回答好面试官提出的问题就可以了。


[](


)算法




算法这一块,先看看笔者在面试中遇到的算法题:(点击可跳转 leetcode 对应题目)


  • [重排链表](


)


  • [出现一次的字符](


)


  • [K 个一组链表反转](


)


  • [凑零钱](


)


  • [全路径简化](


)


  • [字符串拆分](


)


  • [二叉树路径和](


)


  • [链表是否有环](


)


  • [二叉树深度](


)


算法难度基本就是力扣的中等题,且很多都属于经典题目。面试的过程中,只要别太紧张基本不会有太大的问题。笔者在前期的面试过程中过于紧张,导致大脑空白,根本无法思考,连题意都没看明白。此时,可以深吸一口气,冷静一下,旁边有水可以喝一口水,努力让自己冷静下来。如果是在牛客网面试,可以打开代码全屏,可以遮掉面试官的视频,眼不见心不烦(狗头)。


如何提升算法,其实就是刷题,刷题,还是塔喵的,刷题。算法没有捷径可走,需要靠自己勤奋去做题。如何刷以及刷到什么程度,可以参考笔者的经验:


  1. 分标签刷。题目的类型总体就分为那么几类,每一类题型都有特定的模板。因此在一段时间内,对同一类型的题目重复刷,然后总结思路,效率会更好。

  2. 可以参考[大厂算法合集](


)、[剑指 offer](


),在面试前一段时间把这些题目刷一刷,很多时候可以做到原题或者类型题。


  1. 多做总结。实习考察的算法大都是有套路,每次刷题都把关键的点记录下来,做总结,很快可以提炼出一个题型的整体思路。这里推荐[一个博主的算法框架](


),帮助我们提炼算法思路。


  1. 学习官解,精简代码。这里不是要实现那种一行代码解决问题的骚操作,而是去除掉我们代码中的那些无用的判断、循环等操作,增加代码可阅读性和提升效率。


关于算法,不同的企业对算法的要求是不同的,有些企业的算法都是简单题甚至没有算法题,例如美团的算法题是很简单的,腾讯的算法题也基本都是经典题目;而字节跳动对于算法考察较为严格,多为非常见算法题,且基本每轮技术面都有算法题。


其次,企业的不同的部门对算法的考察偏好也是不同的。例如我同学面试 wxg 一次性来了 5 道算法题,而笔者面试 pcg 则没有遇到这个情况。对算法看重的企业多会更深地去考察我们的算法功底,而对算法没有要求的更多是走个流程。


总之,学好算法对我们是一件终身受益的事情,而不管企业考察难度如何。


[](


)简历




关于简历,网络上有很多的博客写得很好,读者可以自行去搜查一下。这里主要和读者们分享笔者对于简历的一些心得。


  • 简历的作用是展示自己的亮点给面试官,让面试官可以在短时间内迅速了解我们。

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
【Android】金三银四面试集合,android面试题大全