前言
本文整理了 Android 开发岗位在春季招聘中的面试经验,涵盖字节跳动、腾讯、阿里、美团、京东、网易等知名互联网企业。内容基于实际面试记录整理,重点梳理了 Java 基础、Android 系统原理、并发编程及算法考察点,并补充了相关技术知识解析,旨在帮助求职者全面复习核心知识点。
字节跳动—技术中台
一面(60 分钟)
-
协程
- 问题:Kotlin 协程的基本概念及使用场景。
- 知识点解析:协程是一种轻量级的线程,由语言运行时调度。在 Android 开发中,Kotlin 协程常用于替代 RxJava 或异步回调,实现非阻塞的并发编程。核心概念包括挂起函数 (suspend function)、协程作用域 (CoroutineScope) 以及 Dispatchers。相比传统线程,协程切换开销极小,适合高并发场景。
-
OkHttp 连接复用
- 问题:一个域名可以有几个连接?如何复用?
- 知识点解析:OkHttp 默认使用连接池 (ConnectionPool)。对于 HTTP/1.1,通常每个域名保持 5 个空闲连接;HTTP/2 则支持多路复用。连接复用通过 Keep-Alive 机制实现,减少 TCP 握手和 SSL 协商的开销,提升网络请求效率。
-
C 语言 malloc 内存分配
- 问题:malloc() 内存分配是立即分配吗?
- 知识点解析:malloc 并不总是立即向操作系统申请物理内存。它通常从堆区 (Heap) 的内存块中分配虚拟地址空间。只有当访问该内存时,若发生缺页中断,才会触发操作系统的物理内存映射。这涉及虚拟内存管理和延迟分配策略。
-
Synchronized 底层实现
- 问题:加锁粒度及具体实现。
- 知识点解析:JDK 1.6 后引入了偏向锁、轻量级锁和重量级锁三种状态。偏向锁针对无竞争场景,轻量级锁针对自旋竞争,重量级锁依赖 OS Mutex。底层通过对象头 Mark Word 和 Monitor 对象实现,保证原子性和可见性。
-
Java 抽象类与接口区别
- 知识点解析:抽象类可以有构造方法、成员变量和方法实现,表示'是一个'的关系;接口只能有常量、抽象方法和默认方法(Java 8+),表示'能做什么'的关系。一个类可以实现多个接口,但只能继承一个抽象类。
-
Java 接口静态方法与默认方法
- 知识点解析:默认方法 (default method) 允许接口提供方法实现,解决接口扩展时的兼容性问题。静态方法 (static method) 属于接口本身,不能被子类重写,主要用于工具方法的封装。
-
操作系统内存映射
- 知识点解析:内存映射 (mmap) 允许文件内容与进程虚拟地址空间直接关联,避免用户态与内核态之间的数据拷贝。在 Android 中,Native 层常用 mmap 加载共享库或处理大文件 IO。
-
ART 空间占用优化
- 知识点解析:ART 虚拟机相比 Dalvik 采用 AOT 编译。优化手段包括压缩 OAT 文件、使用 Compact Heap、减少代码膨胀等。可通过
-Xms和-Xmx调整堆大小,配合 GC 策略降低内存峰值。
- 知识点解析:ART 虚拟机相比 Dalvik 采用 AOT 编译。优化手段包括压缩 OAT 文件、使用 Compact Heap、减少代码膨胀等。可通过
-
栈顶复用与 Activity 生命周期
- 知识点解析:当新 Activity 启动覆盖旧 Activity 时,旧 Activity 进入
onPause->onStop状态,其栈帧保留在任务栈中。若配置为单例模式或清除任务,则可能销毁栈帧。需关注上下文泄漏风险。
- 知识点解析:当新 Activity 启动覆盖旧 Activity 时,旧 Activity 进入
-
Java 异常体系
- 知识点解析:分为 Checked Exception(受检异常,必须处理)和 Unchecked Exception(运行时异常)。自定义异常应继承 RuntimeException 或 Exception。注意 try-catch-finally 的执行顺序及资源关闭。
-
匿名类
- 知识点解析:匿名类用于简化一次性使用的类定义,如监听器。需注意对局部变量的引用必须是 final 或 effectively final。Lambda 表达式在 JDK 8+ 可替代部分匿名类功能。
-
Java 反射
- 知识点解析:反射允许在运行时获取类信息并操作对象。常见于框架设计(如 ButterKnife, Retrofit)。性能开销较大,过度使用可能导致安全问题和维护困难。
-
栈具体结构
- 知识点解析:JVM 栈存储局部变量表、操作数栈、动态链接和方法出口。每个线程拥有独立的栈,线程私有。栈溢出 (StackOverflowError) 通常由递归过深引起。
-
Activity 创建过程
- 知识点解析:AMS 发起 -> Zygote 启动 -> ActivityThread 主循环 -> Instrumentation 执行 -> onCreate。涉及 Binder 通信、Context 初始化、WindowManager 绑定等复杂流程。
-
算法:反转部分链表
- 知识点解析:典型的双指针法。需记录前驱节点、当前节点和后继节点,逐步修改 next 指向。注意边界条件,如头尾节点的处理。
二面(50 分钟)
-
Handler 机制
- 知识点解析:Handler 发送消息到 MessageQueue,Looper 循环取出消息分发给 Handler。涉及 ThreadLocal 存储 Looper,确保每个线程只有一个 Looper。防止内存泄漏需使用 WeakReference。
-
事件分发
- 知识点解析:ViewGroup 的 dispatchTouchEvent -> onInterceptTouchEvent -> View 的 onTouchEvent。遵循从上到下分发,从下往上消费的原则。可重写 onInterceptTouchEvent 拦截事件。
-
Java 并发
- 知识点解析:包含线程池 (ThreadPoolExecutor)、锁 (ReentrantLock)、原子类 (AtomicInteger)、并发容器 (ConcurrentHashMap)。理解 volatile 的可见性与禁止指令重排。
-
设计模式
- 知识点解析:常用模式包括单例、工厂、观察者、代理、装饰者。Android 源码中大量使用观察者模式(如 LiveData)、代理模式(如 Proxy)。
-
volatile 与 i++ 问题
- 知识点解析:volatile 保证可见性和有序性,但不保证原子性。i++ 包含读、改、写三步,多线程下不安全,需用 synchronized 或 AtomicInt。
-
公平锁设计
- 知识点解析:公平锁按申请顺序分配资源,避免饥饿。AQS (AbstractQueuedSynchronizer) 实现了 FIFO 队列管理。非公平锁性能更高,因为允许插队。
-
OkHttp + Retrofit + RxJava
- 知识点解析:Retrofit 基于 OkHttp 封装,RxJava 处理异步流。三者结合形成经典的响应式网络请求链。注意线程切换 (subscribeOn/observeOn)。
-
开放性问题:表格拖动
- 知识点解析:需自定义 View,重写 onDraw 和 onTouchEvent。计算触摸偏移量,更新数据源并 invalidate。高性能场景考虑 RecyclerView 的 ItemDecoration。
-
开放性问题:大图加载
- 知识点解析:先读取图片尺寸 (inJustDecodeBounds),再根据目标控件大小计算采样率 (inSampleSize)。使用 Glide/Picasso 等库自动处理内存回收和缓存。
-
开放性问题:登录验证解耦
- 知识点解析:使用接口隔离原则,将认证逻辑抽离为独立模块。通过 EventBus 或 LiveData 通知 UI 状态变化。避免硬编码,便于单元测试。
-
RecyclerView 调优
- 知识点解析:开启预加载 (setHasFixedSize),复用 ViewHolder,避免频繁 inflate。使用 DiffUtil 计算差异列表,减少刷新开销。禁用不必要的动画。
-
学习与技术分享
- 建议:保持阅读源码习惯,参与开源项目,定期输出技术博客。关注社区动态,如 Android Dev Summit。
三面(1h20min)
-
自我学习与实习时间
- 考察点:职业规划匹配度,稳定性。
-
Linux 进程调度与死锁
- 知识点解析:进程调度算法包括 CFS (完全公平调度)。死锁产生需满足互斥、占有且等待、不可抢占、循环等待四个条件。预防死锁可采用资源有序分配法。
-
Android IPC
- 知识点解析:常见方式有 Binder、Messenger、AIDL、ContentProvider、Socket。Binder 是 Android 首选,基于 C/S 架构,支持跨进程调用。
-
Binder 底层与内存拷贝
- 知识点解析:Binder 驱动通过 mmap 共享内存,减少用户态到内核态拷贝。一次传输完成,效率高。涉及 Parcel 序列化机制。
-
Service 与 IntentService 底层
- 知识点解析:Service 运行在主线程,IntentService 内部使用 HandlerThread 处理任务,完成后自动停止。建议使用 JobScheduler 或 WorkManager 替代 Service 进行后台任务。
-
算法:大数相加
- 知识点解析:模拟竖式加法,从低位到高位逐位相加,处理进位。使用 StringBuilder 构建结果字符串,最后反转。
HR 面
- 流程:隔两周后电话沟通,谈薪并确认 Offer。重点考察薪资期望、离职原因、职业规划及团队融合能力。
阿里巴巴—蚂蚁集团
一面(安全方向)
-
频繁 GC 原因
- 知识点解析:新生代对象存活率高,老年代对象过多。检查是否有内存泄漏,对象是否被意外持有。调整堆大小或 GC 算法(如 G1)。
-
内存泄漏排查
- 知识点解析:使用 MAT (Memory Analyzer Tool) 分析 Dump 文件。查找 Dominator Tree,定位未释放的对象引用。常见原因包括静态集合、单例持有 Context、未注销监听器。
-
RPC
- 知识点解析:远程过程调用,如 Dubbo、gRPC。涉及序列化、网络传输、负载均衡。Android 端较少直接使用,多见于服务端交互。
-
ThreadLocal 继承
- 知识点解析:ThreadLocal 存储线程局部变量。InheritableThreadLocal 可在线程池中传递值。注意清理 (remove),防止内存泄漏。
-
性能优化
- 知识点解析:启动速度、FPS、内存占用、电量消耗。使用 Systrace 或 Perfetto 分析耗时,优化主线程 IO。
-
HashMap
- 知识点解析:数组 + 链表 + 红黑树。JDK 1.8 后阈值 8 转红黑树。扩容因子 0.75,负载因子影响性能。线程不安全,并发用 ConcurrentHashMap。
-
对称与非对称加密
- 知识点解析:对称加密(AES)速度快,密钥共享。非对称加密(RSA)安全性高,用于密钥交换。HTTPS 结合两者使用。
支付宝中台
-
项目相关
- 考察点:业务复杂度,个人贡献,难点攻克。
-
HTTP 请求过程
- 知识点解析:DNS 解析 -> TCP 三次握手 -> TLS 握手 -> HTTP 报文传输 -> 断开连接。关注 HTTPS 证书校验。
-
事件分发
- 知识点解析:同字节一面,重点考察冲突处理。
-
Handler
- 知识点解析:同字节一面,重点考察 Looper 死循环。
-
GC
- 知识点解析:同阿里一面,重点考察 CMS 与 G1 区别。
线上笔试:斐波那契(递归 + 迭代)、死锁、交替打印 1-100、简单计算器实现。
- 备注:主要聊项目,问题比较常规。后续因流程慢,准备拒了。
腾讯—天美工作室
一面(1 小时)
-
算法题:青蛙跳台阶、跳跃游戏。
- 知识点解析:动态规划经典题。青蛙跳台阶 f(n)=f(n-1)+f(n-2);跳跃游戏判断能否到达终点,贪心算法维护最远可达位置。
-
Java 匿名内部类
- 知识点解析:同字节一面,注意闭包特性。
-
乐观锁与悲观锁
- 知识点解析:乐观锁假设无冲突,CAS 实现;悲观锁假设冲突,synchronized 实现。高并发读少写用乐观,反之用悲观。
-
JVM
- 知识点解析:内存区域划分,GC 根对象,类加载机制。
-
四种引用
- 知识点解析:强引用、软引用、弱引用、虚引用。软引用用于内存敏感缓存,弱引用用于缓存 Map。
-
Android IPC
- 知识点解析:同字节一面。
-
Binder 优点
- 知识点解析:高效、安全、支持权限控制。
-
线程与进程区别
- 知识点解析:进程资源独立,线程共享进程资源。线程切换成本低。
-
事件分发
- 知识点解析:同前。
-
Apk 文件结构
- 知识点解析:classes.dex, resources.arsc, assets, lib, AndroidManifest.xml。签名校验机制。
-
内存泄漏
- 知识点解析:同前。
-
插件化
- 知识点解析:利用 ClassLoader 加载外部 dex。难点在于组件通信和资源替换。主流方案有 VirtualApp, Robust。
- Gradle 脚本
- 知识点解析:Groovy/Kotlin DSL。配置依赖、构建变体、打包签名。
- Native 相关
- 知识点解析:JNI 调用,NDK 编译,so 库加载。
- ANR 排查
- 知识点解析:主线程耗时超过 5s。检查 IO、网络、复杂计算。使用 Traceview 或 Systrace。
- 启动模式
- 知识点解析:standard, singleTop, singleTask, singleInstance。影响任务栈行为。
二面(1 小时)
- 项目相关
- 专业课与成绩
- 学习路线
- App 启动流程
- 设计模式
- 算法:大数相加
- 智力题:300ml 和 500ml 倒出 400ml 水。
- 解答:装满 500ml,倒入 300ml 杯,剩 200ml。倒空 300ml,将 200ml 倒入。装满 500ml,倒入 300ml 杯(已有 200ml,需 100ml),500ml 杯剩 400ml。
三面(1 小时)
- 项目相关
- Https
- Android IPC
- 闲聊:游戏、段位、软件、Offer、规划。
- 考察点:文化匹配度,个人兴趣,稳定性。
- 算法:最大连续子数组和、LRU。
- 知识点解析:最大子数组和用 Kadane 算法。LRU 用 HashMap + 双向链表实现,O(1) 时间复杂度。
后续:流程灰了,HC 不足。
美团
一面(50 分钟)
- 自我介绍与项目
- 操作系统 IPC
- 学习方法
- 算法:最长无重复子串
- 知识点解析:滑动窗口法。维护左右指针,用 Set 或 Map 记录字符出现位置。右移右指针,遇重复则移动左指针。
二面(60 分钟)
- 自我介绍与项目
- Https
- TCP、UDP、IP
- 知识点解析:TCP 可靠面向连接,UDP 不可靠无连接。IP 负责寻址。OSI 七层模型与 TCP/IP 四层模型对应关系。
- 链路层相关
- 知识点解析:MAC 地址,交换机,以太网帧。
- 差错校验
- 知识点解析:CRC 校验码,海明码。检测数据传输错误。
- 锁相关
- 学习方法
- LRU 原理
- 算法:螺旋输出二维数组
- 知识点解析:模拟顺时针遍历,维护上下左右边界,每走完一圈收缩边界。
HR 面(25 分钟)
- 后续:收到 OC,因接受字节 Offer 已拒。
OPPO
一面(40 分钟)
- 自我介绍与项目
- 快排原理
- 知识点解析:分治法。选基准值,分区,递归排序。平均 O(nlogn),最坏 O(n^2)。
- 数据结构:二叉树
- 知识点解析:遍历方式(前序、中序、后序、层序)。平衡二叉树 (AVL) 与红黑树区别。
- Handler
- 数据库、B+ 树
- 知识点解析:MySQL 索引结构。B+ 树叶子节点存数据,非叶子存索引,适合范围查询。
HR 面
- 后续:已拒。
网易互娱
一面(50 分钟)
- 线程进程
- IPC
- HashMap
- 创建线程三种方式
- 知识点解析:继承 Thread,实现 Runnable,实现 Callable 提交给线程池。
- 锁、volatile
- 动态代理
- 知识点解析:JDK 动态代理(接口)与 CGLIB(类)。AOP 基础。
- http 相关
- Handler
- Binder
- view 绘制
- 知识点解析:measure -> layout -> draw。三阶段流程,父布局决定子布局大小。
- 算法:反转链表、Top k
- 知识点解析:反转链表双指针。Top k 可用最小堆或快速选择算法。
二面
- 后续:已拒。
京东
一面(30 分钟)
- Activity 相关
- service 的意义
- Handler 内存泄漏
- OkHttp 源码
- 手写 Singleton
- 知识点解析:双重检查锁 (DCL) 实现饿汉式或懒汉式。静态内部类方式最推荐,利用类加载机制保证线程安全。
后续:发出复试邀请,因签字节 Offer 已拒。
结语与建议
本次春招经历了多家大厂的筛选,整体感觉技术面深度不一,但核心考察点集中在 Java 基础、Android 系统原理及算法能力上。以下是几点备考建议:
- 夯实基础:Java 集合、并发、JVM 是必考题,务必深入理解源码。
- 系统原理:Activity 生命周期、Binder 机制、View 绘制流程需烂熟于心。
- 算法训练:LeetCode 高频题(链表、树、动态规划)需反复练习,掌握模板。
- 项目复盘:准备 1-2 个亮点项目,能清晰阐述难点、解决方案及量化成果。
- 心态调整:面试是双向选择,遇到流程慢或拒信属正常现象,及时总结经验,保持自信。
祝各位开发者都能拿到满意的 Offer,顺利入职心仪公司!

