刚出炉的一线互联网公司 Android 面试回顾

4,261 阅读6分钟

这篇文章的作者是一位颜值不亚于我的小伙伴,最近刚刚拿到某大厂 offer,趁着大佬开心央求他写了一篇分享,我们一起向大佬学习!


先说说我是如何展开面试复习的,
大概分为四大类:

  1. 安卓基础知识

  2. JAVA基础知识

  3. 算法和数据结构

  4. 职业发展规划相关问题

安卓基础知识

安卓基础知识确实很多,如果日常积累不够的话确实比较头晕,比如我承认我只在 APP 升级的时候搞过一个前台的 Service,但是面试的时候就会问你 Service 生命周期,如何绑定,如何跨进程通讯,如何关闭Service 等等,你肯定不能说"我没用过我不会"。

所以我们就要复习,一来我们可以应付面试,二来我们也可以通过基础知识的积累来提高我们的能力。

首先我又读了一遍《Android开发艺术探索》,想以该书为基础展开复习,这本书必须一遍一遍的嚼,我在大三实习的时候刚买来读了第一遍,实习辞职到家读了第二遍,刚刚加入工作读了第三遍,这次我又读了一遍,我发现这书没有几遍根本读不透。

这次阅读我主要关注了一下几个方面(事实证明确实有效):

  1. Activity 任务栈和 4 种启动模式关联性问题

  2. IPC 非常重要,想要达到中级和高级的水平就必须要读懂,跨进程几种方式必须了解

    • Binder 肯定是必问的,当然还有 AIDL

  3. 自定义 View 的 draw measure layout 过程,事件的分发,拦截,处理,处理滑动冲突的思路,view滑动的几种方式

  4. 动画的几种实现方式

  5. Window 在 Android 里的作用。它和 Activity 和 View 的关系

  6. 四大组件的工作过程,这个确实有难度,按自己能力钻研吧,也别陷的太深

    • 但是,四大组件的使用方式必须会,Service 的启动和绑定,广播的使用方法,写个简单 ContentProvider 这些都是必须的

  7. Looper,Handler,MessageQueue 的关系

  8. 主线程为什么是主线程,如何开启线程,线程池和安卓常用的四种线程池

    • 他们的特点和使用场景

  9. AsyncTask 原理,并发问题,缺点等

  10. 如何面对大的 bitmap,如何自己设计一个 ImageLoader

    • 其实可以扩展为,如何设计一个 okhttp,如何设计一个 retrofit,eventBus 等等

    • 其实就考察对开源框架的认识和使用的熟练程度

  11. 如何避免和处理 Crash 和 ANR

  12. 优化篇,过度绘制,OOM,内存泄漏,布局优化,MAT, Lint

书里差不多就这些了,书也有些年头了,所以另外我还多准备了一些方面。

  1. 有个问题很常见:你了解过哪些开源框架?

    • okhttp 或者 retrofit 必须了解一下底层原理,即使不能读好源码,也要看看别人是怎么分析的

  2. 如今热更新和插件化特别火,一定要能说出来几种,并简单说明原理

  3. MVC MVP MVVM 优缺点,一点要说出自己的切身体会

  4. Fragment,生命周期和使用方法

  5. Rxjava 尽量也看看

  6. 注解机制,现在这么多使用注解的框架

Java 基础知识

我是参照的《Thinking in Java》这个书和网上的博文,别的我也没买。网上 Java 的资料非常多,但是确实有很多写的不好,甚至有一些错误的,大家阅读要小心了。

主要知识点:

  1. 修饰符

  2. 类 接口 抽象类 匿名内部类 回调机制

  3. 几种基本类型,长度,边界

  4. 从 Iterator 到 Collection,再到 Set List Map(必问)

    • 从以下几个角度理解学习:用法,具体实现类,线程安全性,底层数据存储结构,某些场景下如何选用?比如 ArrayList 和 LinkedList 如何选用

  5. 线程相关(必问)

    • 锁机制 synchronize 用法

    • 实现一个死锁

    • 同步,生产者消费者模型

    • Thread 中的几个常用方法 比如问你 sleep 和 wait 区别

    • 线程安全

  6. JVM 了解一些,GC 了解一下,堆和栈的区别等

  7. 静态代理,动态代理 反射

  8. 设计模式 单例模式(要会写),工厂模式,抽象工厂,观察者模式等

算法和数据结构

知识点:

  1. 数组,链表,队列,栈,图

    • 不会直接问你,会让你找到用处,比如Activity任务栈

  2. 算法

    • 基本几种排序复杂度和思路

    • 几种查找复杂度和思路

    • 串的处理

推荐 LeetCode 刷题和读《剑指offer》。

职业发展规划相关问题

主要有以下几个问题:

  1. 为什么想离职

  2. 当前项目的强度和自己的角色

  3. 希望加入个什么样的团队

  4. 对我们公司的了解

最好提前想一想避免面试时候紧张思路乱,说话没有逻辑。

面试问题

记录下这次面试的主要问题。

一面

  1. MVP,MVC,MVVM

    • 项目里有没有用,缺点是什么,如何改进

  2. ClassLoader 原理

  3. Binder原理和使用

  4. Activity 如何显示到屏幕上

  5. 自定义 View 的注意事项

  6. Retrofit 原理

  7. okhttp 连接池如何维护的

  8. MAT 如何使用,能干什么

  9. 注解如何使用,编译时和运行时注解的区别

  10. 有没有了解过热修复

  11. Map 的实现类和数据结构

  12. 内存泄漏如何检测

  13. 如何避免过度绘制

  14. 锁机制

二面

  1. List 的实现类和优缺点,他们是否线程安全

  2. 如何设计一个优秀的 SDK,如何让 SDK 适应业务模式的变化。

  3. 在纸上设计一个推送 SDK 或者监控 SDK

  4. 两道算法题

    • 考察大量数据排序

    • 考察多线程协同意识,和核心线程的利用意识。

    • 只要求写思路,伪代码即可

  5. 为什么要离职

  6. 是否能接受加班

三面(HR)

  1. 当前项目组结构和项目组中的角色

  2. 为什么离职

  3. 多久能到岗

  4. 当前薪水

  5. 希望薪水

总结

以上内容是我用 3 周时间所复习的,LeetCode 只刷了 10 多道 easy 的,我一直都暗示自己,就算暂时不能面过也是对自己能力的一种提升,所以就乖乖的学习了。

因为确定了 offer,有一些问题不太方便说清楚,所以匿名投稿。

笔者毕业刚满一年,之前工作是在金融公司可能并不是特别追求技术,而笔者又是喜欢追求技术的人,所以格格不入,只能把目标放在互联网大厂了。也希望大家都去敢于尝试和追逐自己的梦想!