Android 从基础到架构进阶全方面面试题解析
涵盖 Java 基础、集合、多线程、JVM 以及 Android 四大组件、UI 绘制、性能优化、IPC、系统 SDK、设计模式、网络协议和 Kotlin 特性等核心面试题。内容包含详细的技术解析与原理说明,旨在帮助开发者系统复习面试知识点,提升技术深度与广度,适用于中高级 Android 工程师求职准备。

涵盖 Java 基础、集合、多线程、JVM 以及 Android 四大组件、UI 绘制、性能优化、IPC、系统 SDK、设计模式、网络协议和 Kotlin 特性等核心面试题。内容包含详细的技术解析与原理说明,旨在帮助开发者系统复习面试知识点,提升技术深度与广度,适用于中高级 Android 工程师求职准备。

抽象类是对类的抽象,可以有构造方法、成员变量、普通方法等。接口是对行为的抽象,只能有常量、抽象方法(默认 public abstract)、默认方法(default)、静态方法(static)。一个类可以实现多个接口,但只能继承一个抽象类。
String 是不可变的,每次修改都会创建新对象。StringBuffer 和 StringBuilder 是可变的。StringBuffer 是线程安全的(方法同步),StringBuilder 是非线程安全的(性能更高)。
== 比较的是引用地址(基本类型比较值)。equals 默认比较引用,Object 子类通常重写为比较内容。hashCode 用于哈希表查找,若 equals 相等则 hashCode 必须相等。
浅拷贝只复制对象本身,不复制引用的对象;深拷贝会递归复制所有引用的对象,完全独立。
Error 是 JVM 无法处理的严重错误(如 OutOfMemoryError),程序无法恢复。Exception 是程序可以处理的异常,分为受检异常和非受检异常。
反射允许在运行时获取类的信息并操作对象。应用场景包括框架开发(如 Spring IOC)、动态代理、序列化等。
根据 Java 规范,若两个对象 equals 相等,则它们的 hashCode 必须相同。否则在使用 HashMap/HashSet 时会出错。
IO 分为字节流和字符流。BIO 是阻塞 IO,NIO 是非阻塞 IO(基于 Channel 和 Buffer),AIO 是异步非阻塞 IO(基于事件驱动)。
编译后泛型信息被擦除,替换为原始类型。局限性是无法直接获取泛型实际类型,且不能实例化泛型类型。
安全性(字符串常池)、线程安全、哈希缓存优化、类加载器识别。
元数据,提供代码之外的信息。分为运行时注解和编译时注解,常用于框架配置、代码生成等。
成员变量随对象创建而创建,随对象 GC 回收;局部变量随栈帧创建,随栈帧销毁回收;静态变量随类加载创建,随类卸载回收。
内部调用 value.length,其中 value 是 char 数组,直接返回长度属性。
List 有序可重复;Set 无序不可重复;Map 键值对存储,Key 不可重复。
ArrayList 基于数组,随机访问快,增删慢;LinkedList 基于链表,随机访问慢,增删快。
HashMap 非线程安全,允许 null 键值;HashTable 线程安全,不允许 null,效率较低。
初始容量 10,当元素超过负载因子(0.75)时,扩容为原来的 1.5 倍。
数组 + 链表 + 红黑树(JDK8+)。通过 key 的 hashCode 计算索引位置,冲突时链表或树存储。
继承自 HashMap,维护双向链表记录插入顺序或访问顺序。
JDK1.7 分段锁,JDK1.8 使用 CAS + synchronized 锁住链表头节点,并发度更高。
继承 Thread 类,实现 Runnable 接口,实现 Callable 接口配合 FutureTask,使用线程池。
新建 (NEW)、运行 (RUNNABLE)、阻塞 (BLOCKED)、等待 (WAITING)、计时等待 (TIMED_WAITING)、终止 (TERMINATED)。
synchronized 关键字,Lock 接口,volatile 关键字,原子类,ThreadLocal。
死锁需四个条件:互斥、请求保持、不可剥夺、循环等待。避免破坏任一条件,如按顺序加锁。
等待 I/O,等待锁,sleep,wait,join 等。
start() 启动新线程执行 run();run() 只是普通方法调用,在当前线程执行。
synchronized 保证原子性和可见性,volatile 仅保证可见性,不保证原子性。
不可变对象,线程封闭,同步控制,原子类。
为每个线程提供独立的变量副本。原理是 Thread 内部维护 ThreadLocalMap。
notify 唤醒一个等待线程,notifyAll 唤醒所有等待线程。
ThreadPoolExecutor 核心参数:corePoolSize, maximumPoolSize, keepAliveTime, workQueue, threadFactory, handler。
公平锁/非公平锁,读写锁,重入锁,乐观锁/悲观锁。
sleep 不释放锁,wait 释放锁;sleep 在 Thread 类,wait 在 Object 类。
悲观锁假设冲突多,加锁;乐观锁假设冲突少,CAS 机制。
支持阻塞操作的队列,生产消费模型常用。内部基于锁或信号量实现阻塞。
Vector, Hashtable, CopyOnWriteArrayList, ConcurrentHashMap。
基于 CAS 实现无锁并发。缺点是 ABA 问题,高竞争下性能下降。
用户上下文传递,数据库连接管理,Session 管理。
分代收集理论,新生代(Eden, Survivor),老年代。算法:标记清除,标记复制,标记整理。
强引用(不回收),软引用(内存不足回收),弱引用(GC 回收),虚引用(通知回收)。
加载,验证,准备,解析,初始化。双亲委派模型。
JVM 标准 Java 虚拟机;Dalvik 安卓早期虚拟机(解释执行);ART 现代安卓虚拟机(预编译 AOT)。
Java 内存模型,定义线程如何与主内存交互,解决可见性、原子性、有序性问题。
Activity 传参给 Fragment,Fragment 回调接口给 Activity,使用 ViewModel 共享数据,EventBus 等。
standard(默认),singleTop(栈顶复用),singleTask(栈内复用),singleInstance(独立栈)。
LocalBroadcastReceiver 仅在应用内广播,更安全高效;普通广播跨进程。
Context 是上下文,提供资源访问、启动组件等功能。注意避免内存泄漏,优先用 Application Context。
声明组件能响应的 Intent 动作、类别和数据类型。
startService 生命周期独立,onDestroy 停止;bindService 绑定服务,客户端解绑服务销毁。
前台服务,JobScheduler,系统白名单,监听系统广播等。
通过 URI 暴露数据,其他应用通过 ContentResolver 访问。
onPause -> onRetainNonConfigurationInstance -> onStop -> onDestroy -> onCreate -> onStart -> onResume。
单例模式下 Activity 再次启动时,Intent 传递给 onNewIntent 而非 onCreate。
Binder 限制约 1MB,大数据建议使用 FileProvider 或临时文件。
ContentProvider 提供数据,ContentResolver 查询数据,ContentObserver 监听数据变化。
Launcher 启动 -> AMS -> Zygote 进程 -> ActivityThread -> onCreate -> setContentView。
带 Looper 的后台线程,适合处理耗时任务,如下载、网络请求。
自动创建 WorkerThread 处理 Intent,完成后自动停止,适合一次性任务。
优点:封装简单;缺点:内存泄漏风险,版本废弃,不支持长时间运行。
在主线程执行 Runnable,内部通过 Handler 发送消息。
不可以,会导致崩溃。需通过 Handler 或 runOnUiThread 切换到主线程。
MessageQueue 存储消息,Looper 循环取出消息,Handler 分发处理。
子线程没有 Looper,需先调用 Looper.prepare() 和 Looper.loop()。
post 发送 Runnable,sendMessage 发送 Message。
Looper.loop() 中调用 MessageQueue.next() 会阻塞当前线程直到有消息,此时 CPU 空闲,不会占用主线程时间片导致卡顿。
补间动画(ViewAnimation)仅改变显示效果,不改变真实属性;属性动画(PropertyAnimation)改变真实属性。
Window 是抽象概念,DecorView 是 Window 的根视图,包含标题栏和内容容器。
Choreographer 调度 VSYNC 信号,ViewRootImpl 触发 draw 流程,测量、布局、绘制。
FrameLayout > LinearLayout > RelativeLayout。RelativeLayout 需多次遍历,效率低。
dispatchTouchEvent -> onInterceptTouchEvent -> onTouchEvent。从上到下分发,从下到上消费。
构造函数 -> onMeasure -> onLayout -> onDraw。
固定高度,开启预回收,ViewHolder 复用,DiffUtil 更新。
convertView 复用,减少 findViewWithTag,图片压缩。
用于远程界面更新,如 Notification,Widget。
onGlobalLayoutListener, ViewTreeObserver, measure 方法。
插值器控制动画速度曲线,估值器控制颜色/数值变化。
getDimension 返回 float,getDimensionPixelOffset 返回 int 偏移,getDimensionPixelSize 返回 int 尺寸。
用于复杂文本排版,支持换行、对齐等。
扁平化布局,减少嵌套,性能优于相对布局。
解析 XML 生成 View 对象。
onCreateView 中判断 isAdded && !isHidden 时加载数据。
RecycledViewPool 复用旧 ViewHolder,mCachedViews 缓存最近使用的。
inflate(Context, ResId) 和 inflate(Context, ResId, ViewGroup),后者可指定父容器。
invalidate 主线程刷新,postInvalidate 子线程刷新。
SurfaceView 独立窗口,性能好;TextureView 可变换,支持动画。
notifyDataSetChanged, notifyItemInserted, DiffUtil。
处理刘海屏、底部导航栏等系统区域。
translate, scale, rotate, alpha。
需要重写 onInterceptTouchEvent 拦截滑动事件。
onAttach -> onCreat -> onCreateView -> onViewCreated -> onActivityCreated -> onStart -> onResume -> onPause -> onStop -> onDestroyView -> onDetach。
Handler 插入屏障,确保某些消息在屏障前执行。
辅助处理拖拽手势。
60Hz 刷新率,VSYNC 信号触发。
启动优化,内存优化,包体积优化,流畅度优化,耗电优化。
静态持有 Context,未注销监听器,单例持有 Activity,Handler 未移除。
使用 WeakReference 持有 Activity,及时 removeCallbacksAndMessages。
大图片加载,集合未清理,内存泄漏,Native 内存溢出。
主线程耗时操作(网络,DB),优化主线程逻辑,异步处理。
LeakCanary 检测,Bitmap 压缩,LruCache 缓存。
减少嵌套,使用 Merge/ViewStub,ConstraintLayout。
压缩,WebP 格式,按需加载,缩略图。
logcat 查看 stacktrace,ndk-stack 还原符号。
ProGuard 混淆,删除无用资源,拆分 ABI,使用 App Bundle。
延迟初始化,异步加载,Splash 页优化,冷启动监控。
ProGuard/R8 规则配置,保留必要类和方法。
复用实例,关闭 JS 调试,设置最小字体。
BitmapRegionDecoder,采样率计算,LruCache。
连接池,缓存策略,Gzip 压缩,HTTP2。
inSampleSize 采样,inJustDecodeBounds 预读。
Binder, Messenger, AIDL, ContentProvider, Socket。
基于 C/S 架构,内核驱动,一次复制两次拷贝。
Android Interface Definition Language,定义接口进行跨进程通信。
Application, Framework, HAL, Linux Kernel。
非线程安全,commit 同步写入磁盘,apply 异步写入。
Serializable 反射实现,性能低;Parcelable 手动实现,性能高。
FileUriExposedException,多窗口模式,VoLTE。
ArrayMap 针对小数据量优化,节省内存。
LRU 算法,先进先出淘汰,基于 LinkedHashMap。
针对 int 作为 Key 优化,避免装箱拆箱。
PathClassLoader 加载已安装 APK,DexClassLoader 加载任意路径 dex/apk。
HttpClient 已废弃,HttpUrlConnection 更底层,OkHttp 基于其封装。
生命周期感知组件,避免内存泄漏。
v1/v2/v3 签名,保证应用完整性。
Source -> Compile -> Manifest -> Resources -> DEX -> APK。
8.0 后台限制,9.0 隐私权限。
分区存储,深色模式,5G 支持。
PackageInstaller -> PackageManager -> 解析 -> 安装。
addJavascriptInterface,evaluateJavascript。
Java Native Interface,C/C++ 调用 Java,反之亦然。
Launcher -> AMS -> Zygote -> AppProcess -> ActivityThread -> onCreate。
监听 Activity 销毁,检查是否被引用,利用 Hprof 分析。
发布订阅模式,内存中总线传递消息。
OkHttp Interceptor,统一处理请求响应。
内存缓存 + 磁盘缓存,支持多种格式。
保存 UI 相关数据,配置变更不丢失。
注解生成代码,绑定 View。
生产者快于消费者时的压力处理,Flowable 支持。
MVC 控制器处理逻辑;MVP Presenter 处理逻辑,View 仅展示。
SharedPreferences, SQLite, Room, File, Network。
Hook 类加载,补丁包替换。
dp/sp,不同分辨率资源,全面屏适配。
ManifestPlaceholders,Gradle 插件。
WeakReference 持有 View。
宽 * 高 * 每像素字节数。
Method ID 限制,Multidex 解决。
增量编译,并行构建,依赖缓存。
Android ID, IMEI(受限), OAID。
禁止明文传输,强制 HTTPS。
面向切面编程,日志,权限,埋点。
Model-View-ViewModel,数据绑定,LiveData。
SDK 集成,自定义事件上报。
分片上传,记录进度,续传。
WebP 压缩率高,SVG 矢量图。
JUnit, Mockito,测试覆盖。
Glide 支持,自定义解码器。
Jetpack 库,兼容旧版,Gradle 配置。
相邻交换,O(n^2),优化:无交换则提前结束。
Node 类含 data 和 next 指针。
迭代法,prev, curr, next 指针移动。
时间复杂度衡量运行时间,空间复杂度衡量内存占用。
快慢指针,相遇则有环。
平衡二叉搜索树,自平衡,查找效率高。
分治法,选基准,递归排序。
首尾相连,解决假溢出。
计算长度差,对齐后遍历。
饿汉式,懒汉式,双重检查锁,静态内部类。
单一职责,开闭原则,里氏替换,接口隔离,依赖倒置,迪米特法则。
简单工厂,工厂方法,抽象工厂。
单例,观察者,适配器,装饰器等。
静态代理,动态代理(JDK/CGLIB)。
链式调用构建复杂对象。
克隆对象。
定义一系列算法,互换使用。
静态编译期生成,动态运行时生成。
多个处理器依次处理请求。
HTTPS = HTTP + SSL/TLS,加密传输。
HTTPS 应用层协议,UDP 传输层无连接,Socket 网络编程接口。
DNS 解析 -> TCP 握手 -> 发送请求 -> 服务器处理 -> 返回响应 -> 断开连接。
三次握手建立连接,四次挥手断开连接。
基于 TCP,保证数据完整有序。
应用层,传输层,网络层,链路层,物理层。
空安全,扩展函数,协程,数据类,Lambda。
生成重载方法,兼容 Java。
List 只读,MutableList 可修改。
object 关键字。
自动生成 equals, hashCode, toString, copy。
delegate 关键字,简化属性逻辑。
with 返回结果,apply 返回对象自身。
Unit 表示无返回值,Void 表示无参数。
中缀表达式语法糖。
public, private, protected, internal。
注意空安全,协程兼容性。
deconstructors,提取对象属性。
inline,消除 Lambda 开销。
primary constructor, secondary constructor。
惰性求值,链式操作。
轻量级线程,协程挂起恢复。
? 标记,!! 强制非空,?. 安全调用。
Any 是所有类型的超类,Object 是 java.lang.Object。
支持,如 Int 转 Long。
for, forEach, map, filter。

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