字节跳动 Android 岗位面试高频考点与知识点汇总
本文系统梳理了 Android 岗位面试的高频考点,涵盖 Java 基础、Android 系统机制、高级特性、性能优化、开源库分析、算法及 Flutter 相关内容。内容包括 JVM 内存模型、并发编程、Activity 生命周期、View 绘制流程、内存与启动优化、OKHttp 与 Retrofit 原理、常见数据结构与算法题、Dart 语言特性及设计模式应用。旨在帮助开发者全面复习核心技术点,提升面试通过率。

本文系统梳理了 Android 岗位面试的高频考点,涵盖 Java 基础、Android 系统机制、高级特性、性能优化、开源库分析、算法及 Flutter 相关内容。内容包括 JVM 内存模型、并发编程、Activity 生命周期、View 绘制流程、内存与启动优化、OKHttp 与 Retrofit 原理、常见数据结构与算法题、Dart 语言特性及设计模式应用。旨在帮助开发者全面复习核心技术点,提升面试通过率。

Android 开发岗位的面试准备是技术成长的重要环节。通过研读大厂面试题,可以了解主流技术趋势、核心关注点,并据此完善自身知识体系。以下整理了 Android 岗位面试中的高频考点,涵盖 Java 基础、Android 系统机制、高级特性、性能优化、开源库分析、算法及 Flutter 相关知识点。
面向过程强调功能步骤的实现,以函数为中心;面向对象强调对象的交互,以类为中心。面向对象具有封装、继承、多态等特性,更利于代码维护和扩展。
主要包括封装(隐藏内部实现)、继承(复用代码)、多态(同一接口不同实现)以及抽象(提取共性)。
Java 源代码先被编译器编译成字节码(.class 文件),再由 JVM 的解释器或 JIT 编译器将字节码转换为机器码执行。这保证了跨平台性。
JVM 运行时数据区包括程序计数器、虚拟机栈、本地方法栈、堆和方法区。堆存储对象实例,栈存储局部变量和方法调用信息。
主要包括启动类加载器、扩展类加载器、应用程序类加载器和自定义类加载器。它们负责加载 .class 文件到 JVM 中。
GC 负责自动回收无用内存。常用算法包括标记 - 清除、复制算法、标记 - 整理和分代收集法。现代 JVM 通常结合多种算法使用。
成员变量属于类或对象,存储在堆或方法区,生命周期随对象存在;局部变量定义在方法内,存储在栈帧中,生命周期随方法调用结束。
重写是子类覆盖父类方法,要求方法名、参数列表相同;重载是同一类中方法名相同但参数列表不同,用于提供多种调用方式。
Java 中只有值传递。对于基本类型,传递的是值的副本;对于引用类型,传递的是引用的副本,即指向对象的地址副本。
根据 Java 规范,如果两个对象 equals 比较为真,它们的 hashCode 必须相同。否则会导致 HashMap 等集合无法正确查找对象。
接口侧重行为契约,支持多实现,成员默认为 public static final;抽象类侧重代码复用,支持单继承,可包含构造方法和非抽象方法。
HashMap 基于哈希表实现,允许 null 键和 null 值。JDK 1.8 后采用数组 + 链表 + 红黑树结构,解决哈希冲突,查询效率高。
线程安全的哈希表。JDK 1.7 使用分段锁,JDK 1.8 使用 CAS + synchronized 锁住链表头节点,并发性能更高。
悲观锁假设冲突概率高,操作时加锁;乐观锁假设冲突少,更新时检查版本号或状态,失败则重试。
线程是 CPU 调度的最小单位。Java 通过 Thread 类和 Runnable 接口创建线程,涉及线程状态转换、上下文切换等机制。
Synchronized 是关键字,隐式锁;volatile 保证可见性和有序性,不保证原子性;Lock 是接口,需手动释放锁,功能更灵活。
包括互斥锁、读写锁、自旋锁等。用于控制多线程对共享资源的访问,防止数据竞争。
反射允许在运行时动态获取类信息和调用方法。常用于框架开发,但会降低性能并破坏封装性。
元数据标签,用于修饰类、方法、字段等。可用于编译期检查、运行时处理(如依赖注入)。
确保一个类只有一个实例。常见写法包括饿汉式、懒汉式(双重检查锁定)、静态内部类及枚举实现。
生命周期包括 onCreate、start、resume、pause、stop、destroy 等。启动模式有 Standard、SingleTop、SingleTask、SingleInstance。启动流程涉及 AMS、WMS 及 Binder 通信。
Fragment 生命周期依附于宿主 Activity。数据传递可通过 Bundle、接口回调或 ViewModel 共享。
启动方式有 startService 和 bindService。前台服务优先级较高,不易被杀。可通过 Notification 保持前台状态。
接收系统或应用广播消息。分为有序广播和无序广播,注册方式有静态(Manifest)和动态(代码)。
用于在不同应用间共享数据。基于 URI 进行数据访问,底层常配合 SQLite 数据库。
测量流程(measure)、布局(layout)、绘制(draw)。事件分发涉及 onTouchEvent、dispatchTouchEvent 等,MotionEvent 描述触摸动作。
主进程和子进程。多进程通信方式包括 AIDL、Messenger、ContentProvider 和 Socket。
将对象转换为字节流以便存储或传输。Android 常用 Serializable 和 Parcelable,后者性能更优。
Window 是视图容器,管理视图层级。Activity 对应 PhoneWindow,通过 WindowManager 添加 View。
Handler 发送和处理消息。原理涉及 MessageQueue、Looper 和 Handler 的 Looper 循环,实现线程间通信。
卡顿场景包括布局复杂、频繁刷新。优化策略包括 ViewHolder 复用、DiffUtil 计算差异、限制 Item 数量、异步加载图片。
AOT(Ahead-of-Time)编译在运行前完成,启动快但包体积大。JIT 在运行时编译,灵活但启动慢。ART 结合了两者。
双亲委托确保核心类安全。Android 使用 PathClassLoader 和 DexClassLoader,分别用于加载已安装和未安装/插件的 DEX。
Hook 技术用于拦截系统方法调用。常见实现包括 Xposed Framework、Substrate 等,用于修改系统行为。
混淆减少包体积并增加反编译难度。规则包括保留类、移除无用代码、重命名标识符。模版用于批量配置。
NDK 允许使用 C/C++ 编写部分逻辑。JNI 是 Java 与 Native 代码的桥梁。构建流程涉及 CMakeLists.txt 配置和 Gradle 集成。
插件化实现组件化运行,热修复修复线上 Bug。技术涉及 ClassLoader 替换、Dex 插桩、补丁合并等。
冷启动指首次打开,热启动指后台恢复。优化包括减少 Application 初始化、延迟加载、预加载资源、异步任务。
减少过度绘制(OverDraw),使用 Hierarchy Viewer 分析。避免复杂嵌套布局,使用 ConstraintLayout,开启 GPU 加速。
监控内存泄漏(LeakCanary),优化大图加载(压缩、采样),及时释放资源,避免静态持有 Context。
使用 HTTP/2、连接池、缓存策略、Gzip 压缩。离线优先策略提升弱网体验。
减少 WakeLock 使用,优化后台任务,合理设置传感器轮询频率,使用 JobScheduler。
资源压缩(R8/ProGuard),动态加载资源,移除无用代码,拆分 ABI 架构包。
强制缓存(Expires/Cache-Control)优先于对比缓存(Last-Modified/ETag)。合理使用缓存减少网络请求。
请求流程涉及 Interceptor 链。同步阻塞,异步回调。CacheInterceptor 处理缓存逻辑,支持连接复用。
基于注解的网络库,底层依赖 OkHttp。支持 RxJava 集成,简化 API 调用。
图片加载库,支持内存/磁盘缓存、变形裁剪、占位图。相比 Picasso 性能更优。
轻量级事件总线,解耦组件。注意内存泄漏问题,需在合适时机取消订阅。
快速排序、归并排序、堆排序等。重点掌握时间复杂度及稳定性。
遍历(前中后序)、层序遍历、平衡判断、最近公共祖先。
反转链表、环检测、合并有序链表、删除倒数第 N 个节点。
括号匹配、单调栈、滑动窗口最大值、用栈实现队列。
寻找目标值、旋转数组查找、边界查找。
两数之和、无重复字符的最长子串、LRU 缓存。
Top K 问题、数据流中位数。
验证 BST、插入/删除节点、最近公共祖先。
三数之和、接雨水、移动零。
活动选择、区间调度、跳跃游戏。
最长回文子串、正则匹配、字符串压缩。
爬楼梯、最大子数组和、背包问题、编辑距离。
螺旋矩阵、旋转图像、搜索二维矩阵。
位运算技巧、统计 1 的个数、只出现一次的数字。
大文件找共同记录(MapReduce 思想)、IP 转 Int、整数反转、LRU 缓存实现。
强类型、可选类型、JIT/AOT 编译、异步编程(Future/Stream)。
Isolate 实现并发,Mixin 混合代码,Extension 扩展方法。
表示 List 集合,支持泛型。
通过 Isolate 实现真正的并行,避免共享内存导致的锁竞争。
值传递。对象引用也是值传递,修改对象属性会影响原对象。
异步数据流,类似 Observable,支持监听事件序列。
混入类,用于复用代码块,不支持继承关系。
Widget 是配置,Element 是实例化后的代理,RenderObject 负责布局和绘制。
MaterialApp 或 CupertinoApp 通常是根节点。
Google 开发的跨平台 UI 框架,使用 Skia 引擎渲染。
热重载、声明式 UI、高性能、丰富组件。
App 生命周期由 Platform Channel 管理,Widget 有 build、dispose 等。
嵌入原生 View 到 Flutter 界面。
Flutter 与原生通信通道,支持 MethodChannel、EventChannel、BasicMessageChannel。
Flutter 启动页通常由原生 Activity 展示,加载引擎后显示 Flutter 内容。
Flutter 是框架,Dart 是编程语言,二者紧密绑定。
同 1.8。
extends 继承类,implements 实现接口,mixin 混入功能。
单例模式、工厂模式、观察者模式、装饰器模式、适配器模式、代理模式。
设计模式是解决通用问题的模板。实际开发中常用单例、工厂、观察者来解耦和复用。
确保类仅有一个实例。线程安全写法包括双重检查锁定、静态内部类、枚举。
定义对象间一对多依赖,当一个对象改变状态,所有依赖者收到通知。Android 中 EventBus 即为此模式。
解耦对象创建与使用。适用于对象创建逻辑复杂或需统一管理的场景。
动态给对象添加职责。作用于对象层次,比继承更灵活。如 InputStream 包装类。
不允许。静态方法属于类,非静态变量属于实例,实例不存在时无法访问。
遵循开闭原则,模块化设计。涉及账户管理、交易处理、安全认证、异常处理。需考虑并发安全和事务一致性。
Android 技术栈广泛且深入,持续学习是保持竞争力的关键。以上知识点涵盖了从基础语法到架构设计的核心内容,建议结合实际项目经验进行理解和实践。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online