30K入职腾讯,全靠这份606页的Android面试指南
阅读原文时间:2023年07月09日阅读:2

光阴似箭,日月如梭,时间真的过得飞快。 加上实习,从事 Android 开发,差不多有 5 年了。在上家公司职务、薪酬感觉已经到达了天花板,没有上升的余地。而且在这家公司过于安逸了,想换个有挑战性的岗位。

通过朋友内推参加了腾讯面试。具体部门这边就不说了。面试涉及到的范围很广,设计模式、优化、源码等等,还是具有一定挑战性的,在面试前花了大概三个月的时间准备,在上班的空闲时间刷题,也不枉我准备了这么久啊。

下面分享一下面经:

1.mmap + native 日志优化?

2.广播和 EventBus 的区别?

3.常用设计模式你了解哪些?

4.跨进程通信有哪些?

5.简单讲讲 binder 驱动吧?

6.跨进程传递大内存数据如何做?

7.说说 ConcurrentHashMap 的实现原理说下,初始化大小是多少?

8.启动优化怎么优化?

9.你写的 rxpay 和 rxlogin 具体怎么实现的?

10.kotlin + fullter 方面的

1.单例设计模式都写写,静态内部类是怎么保证线程安全的?

2.synchronized 底层实现原理,ReentrantLock 公平锁与非公平锁。

3.主线程等待所有线程执行完毕,再执行某个特定任务怎么实现?原理和源码看过没?

4.自定义 view 的一般流程,要注意些什么如何优化,点击事件和长按时间分别是怎么实现的?

5.四种启动模式,在源码分析中的原理是怎样的?

6.讲讲 bindService 的过程,你当初是怎么优化后台服务进程的?

7.开发中你都用到了哪些设计模式?说说当时具体的场景。为什么你要用方法工厂,另外两种呢?

1.讲讲 handler 的底层实现原理?

2.说说你做的日志记录优化?

3.你看过 binder 驱动的源码,说说他的内存映射过程,说说客户端等待服务端处理返回的流程,如果要跨进程传递大内存数据你具体会怎么做?简单写一写吧。

4.在公司做过哪些优化?

5.过程中遇到的一些最难解决的问题?

6.提到了动态修复替换加载 so ,那你知道怎么修复 class 吗?怎么修复资源呢?

7.还有什么要问的?

三面之后就是HR面了,没有什么特别好说的东西,这里就省略了。

下面分享一份帮我内推的朋友给我的《Android面试指南》,包含了各个互联网大厂的面试重点。

一、Android基础+进阶

1.Activity启动模式

2.Activity的启动过程

3.进程通讯

4.Android Binder之应用层总结与分析

5.进程保活方法

6.从源码了解handler looper ,messageQueue思路

7.handler如何实现延时发消息postdelay()

8.Android中为什么主线程不会因为Looper.loop()里的死循环卡死?

9.RxJava原理及如何封装使用

10.okhttp源码分析

11.retrofit源码分析

……

12.LeakCanary核心原理源码浅析

13.LruCache 使用及原理

14.ARouter原理

15.注解框架实现原理

16.Android 如何编写基于编译时注解的项目

17.RxJava2+Retrofit2+OkHttp3的基础、封装和项目中的使用

18.Rxjava2.0+Retrofit+Okhttp(封装使用)+MVP框架搭建

19.Android 插件化和热修复知识梳理

20.Android开发中比较常见的内存泄漏问题及解决办法

21.如何检测和定位Android内存泄漏

22.图片占据的内存算法

23.为什么图片需要用软引用,MVP模式中的view接口用弱引用

24.基于DataBinding与LiveData的MVVM实践

25.App稳定性优化

26.App启动速度优化

27.App内存优化

28.App绘制优化

29.App瘦身

30.网络优化

31.App电量优化

32.安卓的安全优化

33.为什么WebView加载会慢呢?

34.如何优化自定义View

二、Java基础+进阶

1.HashMap

2.ArrayList

3.LinkedList

4.Hashset源码分析

5.内存模型

6.垃圾回收算法(JVM)

7.垃圾回收机制和调用 System.gc()的区别?

8.类加载过程

9.反射

10.多线程和线程池

11.创建多线程方式、线程池工作原理

12.设计模式(六大基本原则、项目中常用的设计模式、手写单例等)

13.断点续传

14.Java 四大引用

15.Java 的泛型

16.接口、抽象类的区别

17.从 java 容器类的设计讨论抽象类和接口的应用

三、数据结构与算法面试题

1.常用的数据结构有哪些?

2.数组

(1).如何在一个1到100的整数数组中找到丢失的数字

(2).如何在给定的整数数组中找到重复的数字? (小米)

(3).如何在未排序整数数组中找到最大值和最小值?(字节跳动)

(4).在Java中如何从给定数组中删除多重复制?

(5).大数相加(今日头条)

3.链表

(1).那查询第一个跟倒数第二个呢?(这就不一样了,第一个直接给了头结点,倒数第二个需要从倒数第一个开始查询,走两步) (腾讯)

(2).arrayList底层原理 (滴滴)

(3).如何在一次遍历中找到单个链表的中值?(中国平安)

(4).如何证明给定的链表是否包含循环?如何找到循环的头节点?(优酷)

(5).两个有交叉的单链表,求交叉点 (华为)

(6).如何得到单链表的长度?(360)

(7).如何在不使用递归的情况下逆转单链表?(小米/美团)

(8).怎么判断链表有环? (滴滴)

4.队列&堆栈

(1).如何使用栈实现队列的功能(广州荔枝FM)

(2).两个栈实现一个队列(蘑菇街)

(3).两个队列实现一个栈 (腾讯)

(4).对比一下队列和栈,以及它们底部实现 (腾讯)

5.二叉树

(1).如何在给定的二叉树中执行先序遍历?(百度)

(2).如何实现后序遍历算法?(百度)

(3).如何在给定数组中执行二分法搜索?(苏宁)

(4).已知前序遍历为{1,2,4,7,3,5,6,8},中序遍历为{4,7,2,1,5,3,8,6},它的二叉树是怎么样的?

(5).输入两棵二叉树 A 和 B,判断 B 是不是 A 的子结构。 (爱奇艺)

(6).请实现两个函数,分别用来序列化二叉树和反序列化二叉树(YY)

(7).平衡二叉树和红黑树的区别?(字节跳动)

(8).什么是平衡二叉树,它有什么特征 (美团)

(9).B 树,B+树

6.HashMap

(1).HashMap的底层原理是什么?线程安全么? (百度)

(2).HashMap中put是如何实现的? (滴滴)

(3).谈一下hashMap中什么时候需要进行扩容,扩容resize()又是如何实现的?

(4).什么是哈希碰撞?怎么解决? (滴滴)

(5).HashMap和HashTable的区别 (小米)

(6).HashMap中什么时候需要进行扩容,扩容resize()是如何实现的? (滴滴)

(7).hashmap concurrenthashmap原理 (美团)

(8).arraylist和hashmap的区别,为什么取数快?(字节跳动)

7.图

(1).旋转输出矩阵

(2).给定一个矩阵 int matrixA[m][n],每行每列都是增序的,实现一个算法去寻找矩阵中的某个元素 element. 搜狗

8.排序算法有哪些?

9.查找算法

10.串

四、计算机网络部分

1.HTTP协议

2.TCP/IP协议

3.TCP的三次握手与四次挥手理解及面试题

4.网页中输入url,到渲染整个界面的整个过程,以及中间用了什么协议?

5.TCP和UDP的区别?

6.HTTP的几种请求方法具体介绍

7.HTTP请求和响应报文的格式,以及常用状态码

8.一个 TCP 连接上面能发多少个 HTTP 请求

……

由于篇幅限制,展示了部分内容截图,需要这些文档资料的,可以点赞支持一下我,然后【点击这里】免费阅读下载。

1.基本信息

  • 简历不要太花哨, 你是应聘的技术, 不是设计师
  • 简历把一些基本信息要说清楚(无关的不要写, 比如头像之类的)
  • 有个人博客, 跟 GitHub 的写上, 若没有内容那就算了,因为你写了,面试官势必会满怀期待地点进去看,如果这个时候呈现给他的却是空白页或者寥寥几行内容的话,这种一落千丈的感受会给面试官留下非常不好的印象
  • 应届毕业生需写上相关证书之类, 有经验的可不写
  • 简历控制在两页 A4 纸

2.项目经验

  • 一般写 2, 3个代表性的项目就好,优先写本职工作相关的
  • 时间为倒序
  • 说明你在项目当中的职责作用
  • 项目模块需要了解大概逻辑与思路,以及一些关键的技术点,以防面试官问到
  • 没有项目经验的也要模仿一两个小 Demo

3.须知

  • 自己亲自做的东西一定要明白, 如果不是自己亲自做的, 请慎重骗面试官
  • 问的时候会问一些知识点相关的话题,比如你的数据是需要 api 交互的,那可能会问 http 相关, json 数据解析相关,缓存相关,图片加载相关等
  • 对用到的知识点虽用不着一定要看源码的地步,但是最好要懂原理,比如图片加载一定要知道二级缓存,一些常见的缓存算法

4.注意事项

  • 去面试前一定要花点时间了解下你面试的这家公司(本身有自己产品的下载体验一下,以防面试过程中问到,或者可以给产品提点意见)
  • 面试的时候态度要谦虚点
  • 学习能力很重要(一定要让面试官感受到你是一个好学的人)
  • 个人兴趣(不要提什么打游戏, 唱歌之类的, 可以说一下业余时间提下自己经常上一些技术社区,看一些技术博客之类的)
  • 除了基本的知识点, 面试官通常都会问一些比较深的领域(可能你没有接触过,但不要气馁, 面试官在考察下你的技术的深度, 这些领域一般包括设计模式, 虚拟机, 插件化, React Native之类的)

5.面试前一定要多刷刷面试题

面试前多刷面试题,是对面试最起码的尊重。

虽然我在这里不提倡大家临时抱佛脚,但是适当地抱一抱佛脚也比那些什么都不准备,就直接裸面的人要好很多,至少你的态度是端正的。

你来面试也是需要花费面试官时间的,简单准备一下不香嘛?万一你运气好,恰好这家公司职位扩充,降低面试要求了呢?你这么随便,岂不是把白花花的机会全都给浪费掉了嘛!

最后

如果你想去一家不错的公司,但是目前的硬实力又不到,我觉得还是有必要去努力一下的,技术能力的高低能决定你走多远,平台的高低,能决定你的高度。

如果你通过努力成功进入到了心仪的公司,一定不要懈怠放松,职场成长和新技术学习一样,不进则退。