Android 技术面试指南
本文整理了 Android 开发岗位常见面试题,涵盖 Java 基础、集合、多线程、JVM、Android 组件、UI 绘制、性能优化、IPC、系统架构及 Kotlin 等核心领域。旨在帮助开发者系统复习,查漏补缺,提升面试通过率。
第一章 Java 方面
(一)Java 基础部分
1. 抽象类与接口的区别?
- 抽象类可以有构造方法、成员变量(非 public static final)、普通方法;接口只能有常量(public static final)和抽象方法(Java 8 后可有 default/static 方法)。
- 一个类可以实现多个接口,但只能继承一个抽象类。
- 抽象类是对类的抽象,体现"is-a"关系;接口是对行为的抽象,体现"can-do"关系。
2. final, static, synchronized 关键字的作用?
final:修饰类不可继承,修饰方法不可重写,修饰变量不可变(基本类型值不变,引用类型地址不变)。
static:属于类而非实例,内存中只有一份,可通过类名直接访问。
synchronized:用于线程同步,保证共享资源在并发访问时的原子性。
3. String、StringBuffer 和 StringBuilder 的区别?
String:不可变字符序列,每次修改都会生成新对象。
StringBuffer:可变字符序列,线程安全,方法加锁,效率较低。
StringBuilder:可变字符序列,线程不安全,效率高,推荐单线程使用。
4. equals() 与 ==、hashCode() 的区别?
==:比较基本类型的值或对象的引用地址。
equals():默认比较地址,Object 子类通常重写为比较内容。
hashCode():返回哈希码,用于哈希表存储。若重写 equals() 必须重写 hashCode(),保证相等对象哈希码相同。
5. 深拷贝与浅拷贝的区别?
- 浅拷贝:复制对象本身,内部引用类型指向原对象地址。
- 深拷贝:复制对象及其引用的所有对象,完全独立。
6. Error 和 Exception 的区别?
Error:严重错误,如 OutOfMemoryError,程序无法处理,通常不捕获。
Exception:程序可处理的异常,分为受检异常(Checked)和非受检异常(Runtime)。
7. 反射机制及应用场景?
- 运行时动态获取类信息并操作对象。应用场景:框架设计(如 Spring)、动态代理、序列化、插件化开发。
8. 重写 equals() 为什么要重写 hashCode()?
- 保证在 HashMap/HashSet 中,相等的对象具有相同的哈希桶位置,否则可能导致查找失败。
9. IO 流分类及 BIO/NIO/AIO 区别?
- 按流向分输入/输出流;按功能分节点流/处理流。
BIO:阻塞 IO,一个连接一个线程。
NIO:非阻塞 IO,基于 Channel 和 Buffer,支持多路复用。
AIO:异步非阻塞 IO,基于事件和回调机制。
10. 泛型类型擦除及局限性?
- 编译后泛型信息被擦除,替换为原始类型。局限性:无法判断泛型具体类型,不能创建泛型数组。
11. String 为什么不可变?
- 安全性(字符串常池)、线程安全、Hash 缓存优化。
12. 注解的理解?
- 元数据,用于标记代码,编译器或运行时读取。常用:@Override, @Deprecated, @SuppressWarnings。
13. 变量创建和回收时机?
- 成员变量随对象创建而创建,对象销毁回收;局部变量随栈帧创建销毁;静态变量随类加载创建,卸载时回收。
14. String.length() 原理?
- JDK 9+ 使用 byte[] 存储,length() 直接返回数组长度属性,O(1) 复杂度。
(二)Java 集合
1. List, Set, Map 区别?
- List:有序,可重复,索引访问。
- Set:无序,不可重复。
- Map:键值对,Key 不可重复。
2. ArrayList 和 LinkedList 区别?
- ArrayList:基于数组,随机访问快,增删慢。
- LinkedList:基于双向链表,增删快,随机访问慢。
3. HashMap 与 HashTable 区别?
- HashMap 非线程安全,允许 null 键值,扩容 2 倍;HashTable 线程安全(synchronized),不允许 null,扩容 2 倍 +1。
4. ArrayList 扩容机制?
- 默认容量 10,超过时扩容为原来的 1.5 倍,需重新分配数组并拷贝元素。
5. HashMap 实现原理?
- 数组 + 链表 + 红黑树(JDK 8+)。冲突时链表转红黑树(阈值 8),负载因子 0.75。
6. LinkedHashMap 原理?
- 继承 HashMap,维护双向链表记录插入顺序或访问顺序。
7. ConcurrentHashMap 理解?
- JDK 1.7 分段锁,JDK 1.8 CAS+synchronized 保证线程安全,性能更高。
(三)Java 多线程
1. 多线程方式?
- 继承 Thread 类,实现 Runnable 接口,实现 Callable 接口配合 FutureTask,线程池。
2. 线程状态?
- NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED。
3. 同步实现?
- synchronized 关键字,Lock 接口,volatile 变量,原子类。
4. 死锁及避免?
- 循环等待资源。避免:固定资源顺序获取,超时机制,检测死锁。
5. 线程阻塞原因?
- 等待 I/O,等待锁,sleep/wait,CPU 调度。
6. run() 与 start() 区别?
- start() 启动新线程执行 run();run() 只是普通方法调用,在当前线程执行。
7. synchronized 和 volatile 区别?
- synchronized 保证原子性和可见性,volatile 仅保证可见性和禁止指令重排。
8. 线程安全保证?
9. ThreadLocal 用法和原理?
- 提供线程局部变量副本。原理:Thread 内部维护 ThreadLocalMap,Key 为 ThreadLocal 弱引用。
10. notify 和 notifyAll 区别?
- notify 唤醒一个等待线程;notifyAll 唤醒所有等待线程。
11. 线程池及创建?
- 减少线程创建开销。通过 Executors 或 ThreadPoolExecutor 创建,配置核心线程数、最大线程数、队列等。
12. 常见锁?
13. sleep() 和 wait() 区别?
- sleep 是 Thread 静态方法,不释放锁;wait 是 Object 方法,释放锁。
14. 悲观锁和乐观锁?
- 悲观锁假设冲突,直接加锁;乐观锁假设无冲突,CAS 机制。
15. BlockingQueue 原理?
- 支持阻塞的队列,生产者在空时阻塞,消费者在满时阻塞。内部基于 Lock 和 Condition。
16. 线程安全集合?
- Vector, Hashtable, CopyOnWriteArrayList, ConcurrentHashMap。
17. Atomic 类原理和缺点?
- 基于 CAS 实现无锁并发。缺点:ABA 问题,高竞争下性能下降。
18. ThreadLocal 使用场景?
- 数据库连接管理,用户上下文传递,避免线程安全问题。
(四)Java 虚拟机
1. 垃圾回收机制?
- 标记 - 清除,标记 - 整理,复制算法。GC Roots 可达性分析。
2. 引用类型?
- 强引用(不回收),软引用(内存不足回收),弱引用(下次 GC 回收),虚引用(跟踪对象回收状态)。
3. 类加载机制?
4. JVM, Dalvik, ART 区别?
- JVM 标准 Java 虚拟机;Dalvik 安卓早期虚拟机,解释执行;ART 安卓 5.0+,预编译 AOT,启动快但安装慢。
5. 内存回收机制?
- 分代收集:新生代(Eden/Survivor),老年代。Minor GC 和 Major GC。
6. JMM 是什么?
- Java 内存模型,定义线程如何操作主内存和工作内存。解决可见性、原子性、有序性问题。
第二章 Android 方面
(一)Android 四大组件相关
1. Activity 与 Fragment 通信?
- Activity 传参给 Fragment;Fragment 回调接口给 Activity;ViewModel 共享;广播;EventBus。
2. LaunchMode 应用场景?
- standard:默认,每页新建。
- singleTop:栈顶复用。
- singleTask:栈内复用,清除上层。
- singleInstance:独立栈,全局唯一。
3. BroadcastReceiver 与 LocalBroadcastReceiver 区别?
4. Context 了解?
- ApplicationContext(应用级,生命周期长),ActivityContext(界面级,易内存泄漏)。
5. IntentFilter 及使用?
- 声明组件能响应的 Intent 动作、类别、数据。用于隐式 Intent 匹配。
6. startService 和 bindService 区别?
- startService:生命周期独立,startForeground 保活。
- bindService:绑定服务,解绑销毁,适合短周期交互。
7. Service 保活?
- 前台服务,JobScheduler,AlarmManager,双进程守护。
8. ContentProvider 数据共享?
- 封装数据源,提供 URI 接口,支持跨进程 CRUD。
9. 横竖屏切换生命周期?
- onConfigurationChanged 或重建(onDestroy -> onCreate)。
10. onNewIntent 调用时机?
- singleTop/Task 模式下,Intent 再次发送时触发,需手动更新 UI。
11. Intent 传输数据限制?
- Binder 限制约 1MB。大数据用 FileProvider 或临时文件。
12. ContentProvider/Resolver/Observer 关系?
- Provider 提供数据,Resolver 操作数据,Observer 监听数据变化。
13. Activity 加载流程?
- Launcher -> AMS -> WMS -> Zygote -> AppProcess -> ActivityThread -> attach -> onCreate。
(二)Android 异步任务和消息机制
1. HandlerThread 场景?
- 需要后台 Looper 的场景,如下载、日志写入。
2. IntentService 场景?
- 自动处理 Intent 请求,完成后自动停止,适合一次性任务。
3. AsyncTask 优缺点?
- 优点:简单;缺点:内存泄漏风险,版本废弃,配置变更导致中断。
4. runOnUiThread 理解?
5. 子线程能否更新 UI?
6. Handler 机制原理?
- MessageQueue 队列,Looper 循环取消息,Handler 分发。Message 包含 Runnable。
7. 子线程创建 Handler 异常?
8. post 和 sendMessage 区别?
- post 传入 Runnable,sendMessage 传入 Message。本质都是 enqueueMessage。
9. Loop 死循环为何不阻塞?
- Looper.loop() 是死循环,但主线程负责渲染,消息处理是非阻塞的,由系统调度。
(三)Android UI 绘制相关
1. 补间动画和属性动画区别?
- 补间:视觉变换,不改变真实属性;属性:改变 View 真实属性,支持插值器。
2. Window 和 DecorView?
- Window 抽象窗口概念,DecorView 是根布局,包含标题栏和内容区。
3. UI 刷新机制?
- VSYNC 信号触发,Choreographer 协调,ViewRootImpl.performTraversals 测量布局绘制。
4. Layout 效率?
- FrameLayout > LinearLayout > RelativeLayout。嵌套越深效率越低。
5. 事件分发机制?
- dispatchTouchEvent -> onInterceptTouchEvent -> onTouchEvent。自上而下分发,自下而上消费。
6. 自定义 View 流程?
- 构造函数 -> onMeasure -> onLayout -> onDraw -> 触摸事件处理。
7. RecyclerView 优化?
- 开启固定大小,ViewHolder 复用,DiffUtil,预加载,ItemDecoration 优化。
8. ListView 优化?
- ViewHolder 模式,convertView 复用,分页加载。
9. 自定义 LayoutManager?
- 继承 RecyclerView.LayoutManager,实现 measureChildren, layoutChild, scrollByX/Y。
10. RemoteViews 场景?
11. 获取 View 宽高方法?
- addOnLayoutChangeListener, ViewTreeObserver, requestLayout 后获取。
12. 插值器和估值器?
- Interpolator 控制速度曲线,Evaluator 控制数值计算。
13. getDimension 系列区别?
- Dimension 返回 float,PixelOffset/Size 返回 int,后者用于坐标定位。
14. StaticLayout 用法?
15. ConstraintLayout 特点?
16. LayoutInflater inflate 原理?
- 解析 XML 生成 View 对象,根据父容器参数设置 LayoutParams。
17. Fragment 懒加载?
- setUserVisibleHint (旧) 或 setUserVisibleHint 替代方案,onResume 时加载数据。
18. RecyclerView 缓存机制?
- ScrapCache, RecycledViewPool, Offscreen Cache。
19. invalidate 和 postInvalidate?
- invalidate 主线程,postInvalidate 子线程,触发重绘。
20. SurfaceView vs TextureView?
- SurfaceView 独立图层,性能好;TextureView 可变换,支持透明,性能稍差。
21. Adapter 刷新方式?
- notifyDataSetChanged, notifyItemInserted, DiffUtil。
22. Window 和 WindowManager?
- WindowManager 是 Window 的具体实现,用于添加/移除 View。
23. Activity, View, Window 关系?
- Activity 持有 Window,Window 持有 DecorView,DecorView 持有根 View。
24. WindowInsets?
25. View 位移方式?
- translate, scale, rotate, alpha。
26. ViewPager 嵌套滚动拦截?
- 需重写 onInterceptTouchEvent 判断方向。
27. Fragment 生命周期?
- onAttach, onCreate, onCreateView, onViewCreated, onStart, onResume, onPause, onStop, onDestroyView, onDestroy, onDetach。
28. 同步屏障?
- Choreographer 中的 Sync Barrier,跳过某些消息,用于优化滑动流畅度。
29. ViewDragHelper?
30. 屏幕刷新机制?
- 60Hz/90Hz/120Hz,VSYNC 信号驱动。
(四)Android 性能调优相关
1. 性能优化了解?
2. 内存泄漏场景?
- 静态引用 Context,未注销监听器,单例持有 Activity,Handler 未清理。
3. 自定义 Handler 避免泄漏?
- 使用 WeakReference,及时 removeCallbacksAndMessages。
4. OOM 原因?
- 大图片加载,集合无限增长,内存泄漏,Native 堆溢出。
5. ANR 场景及解决?
- 主线程耗时操作(网络,IO)。优化:异步处理,分片执行,降低主线程负载。
6. 内存优化方式?
- 内存分析工具(MAT),减少对象创建,及时释放,使用 LruCache。
**7. 布局优化技巧?**r> - 减少嵌套,使用 Merge/ViewStub,ConstraintLayout,避免过度绘制。
8. 图片优化方案?
- 压缩,缩略图,WebP 格式,LruCache,Glide/Picasso。
9. Native Crash 分析?
- logcat 查看 stacktrace,ndk-stack 还原符号,AddressSanitizer。
10. APK 瘦身?
- 混淆,去除无用资源,ProGuard,Split ABI,ZipAlign。
11. 启动优化?
- 延迟初始化,异步加载,Splash 页优化,冷启动指标监控。
12. 代码混淆步骤?
- ProGuard/R8 配置规则,保留必要类,测试验证。
13. WebView 优化?
14. 大图加载?
- inSampleSize 采样,BitmapFactory.Options,逐步加载。
15. 网络请求优化?
16. Bitmap 防溢出?
- 计算目标尺寸,inJustDecodeBounds 预读,及时 recycle。
(五)Android 中的 IPC
1. IPC 方式?
- Bundle, Messenger, AIDL, ContentProvider, Socket, File。
2. Binder 机制?
- 客户端 - 服务端 - 内核 - 驱动。Binder 驱动管理进程间通信,一次拷贝。
3. AIDL?
- Android Interface Definition Language,定义接口,自动生成 Stub 代码。
(六)Android 系统 SDK 相关
1. 系统架构?
- Linux Kernel, HAL, Native Libs, Android Runtime, Framework API, Apps。
2. SharedPreferences 线程安全?
- commit 同步,apply 异步。底层文件操作非线程安全,建议用 apply。
3. Serializable 和 Parcelable?
- Serializable 反射,慢;Parcelable 手动序列化,快,Android 专用。
4. Android 7.0 新特性?
- Nougat,多窗口,VR 模式,Project Treble。
5. ArrayMap 和 HashMap?
- ArrayMap 针对少量数据优化,节省内存,无 Entry 对象。
6. LruCache 原理?
- 最近最少使用算法,LinkedHashMap 实现,LRU 链。
7. SparseArray 代替 HashMap?
- 针对 int 作为 Key 优化,避免装箱拆箱,节省内存。
8. PathClassLoader 和 DexClassLoader?
- PathClassLoader 加载已安装 APK;DexClassLoader 可加载任意路径 dex/apk。
9. HttpClient 与 HttpUrlConnection?
- HttpClient 废弃,HttpUrlConnection 原生,OkHttp 更流行。
10. Lifecycle?
- 观察生命周期状态,避免内存泄漏,支持 ViewModel。
11. 签名机制?
12. APK 构建流程?
- Gradle 编译 -> 打包 -> 签名 -> ZipAlign。
13. Android 8.0/9.0 特性?
- 8.0 通知渠道,后台限制;9.0 隐私权限,深色模式。
14. Android 10 适配?
15. APK 安装过程?
- PackageManagerService 扫描,解析,移动文件,注册组件。
16. Java 与 JS 互调?
- addJavascriptInterface,evaluateJavascript。
17. JNI?
- Java Native Interface,Java 调用 C/C++,需 native 方法声明。
18. App 启动流程?
- Launcher -> AMS -> Zygote -> AppProcess -> ActivityThread -> onCreate。
(七)第三方框架分析
1. LeakCanary 原理?
- 监听 Activity/Fragment 销毁,检查是否被引用,利用 HPROF 分析。
2. EventBus 原理?
3. 网络拦截器?
- OkHttp Interceptor,统一处理日志,鉴权,重试。
4. Glide 缓存机制?
- 内存缓存(LRU),磁盘缓存(MD5),层级管理。
5. ViewModel 原理?
6. ButterKnife 原理?
7. RxJava 背压?
- 生产者快于消费者时,缓冲或丢弃策略,Flowable 支持。
(八)综合技术
1. MVC 和 MVP?
- MVC:Model-View-Controller,Controller 处理逻辑;MVP:Presenter 分离逻辑,View 薄层。
2. 存储方式?
- SharedPreferences, SQLite, Room, File, Network。
3. 热修复原理?
4. 机型适配?
- 分辨率适配,字体适配,刘海屏适配,不同厂商 ROM 兼容。
5. 多渠道打包?
- Gradle Flavor,Manifest 合并,BuildConfig。
6. MVP 防止泄漏?
- Presenter 持 WeakReference 的 View,销毁时解绑。
7. 图片内存计算?
- width * height * bytesPerPixel。
8. 64k 问题?
- Method ID 限制 65535。解决:MultiDex,代码精简,R8。
9. Gradle 构建优化?
10. 设备唯一 ID?
- AndroidId, IMEI (受限), OAID, UUID。
11. Android P HTTP 影响?
- 强制 HTTPS,需配置 CleartextTrafficPermitted。
12. AOP 场景?
13. MVVM?
- Model-View-ViewModel,数据绑定,单向数据流。
14. 数据埋点?
15. 断点上传?
16. WebP 和 SVG?
- WebP 压缩率高,SVG 矢量无损。Android 支持 WebP,SVG 需转换或使用 VectorDrawable。
17. 单元测试?
- JUnit, Mockito, Robolectric。覆盖业务逻辑,Mock 外部依赖。
18. GIF 加载思路?
19. AndroidX 迁移?
- 替换 Support Library,Gradle 配置,IDE 提示迁移。
(九)数据结构方面
1. 冒泡排序及优化?
2. 单链表实现?
- Node 类含 data 和 next,头指针操作。
3. 反转单链表?
- 三指针法:prev, curr, next,逐个翻转指向。
4. 时间/空间复杂度?
5. 判断链表成环?
6. 红黑树?
- 自平衡二叉搜索树,保证最坏情况 O(log n)。HashMap 底层结构。
7. 快速排序及优化?
8. 循环队列?
- 数组首尾相接,解决假溢出,head/tail 指针移动。
9. 判断链表交叉?
(十)设计模式
1. 单例模式?
2. 面向对象原则?
- SOLID:单一职责,开闭,里氏替换,接口隔离,依赖倒置。
3. 工厂模式?
4. 项目设计模式?
- 观察者(EventBus),适配器(RecyclerView),装饰者(InputStream)。
5. 代理模式?
- 静态代理,动态代理(JDK/CGLIB)。Android 源码中 Binder 代理。
6. 单例/建造者/工厂选择?
- 单例:全局唯一;建造者:复杂对象构建;工厂:解耦创建逻辑。
7. 原型模式?
8. 策略模式?
9. 静态代理和动态代理?
- 静态:编译期生成;动态:运行时生成。动态代理灵活。
10. 责任链模式?
- 多个对象处理请求,直到某个对象处理完或传递结束。如 EventDispatch。
(十一)计算机网络方面
1. HTTP 与 HTTPS 区别?
- HTTPS = HTTP + SSL/TLS,加密传输,端口 443。
2. https, udp, socket 区别?
- HTTPS 应用层协议;UDP 传输层无连接;Socket 是 API 接口。
3. HTTP 请求过程?
- DNS 解析 -> TCP 握手 -> 发送请求 -> 服务器处理 -> 响应 -> 断开。
4. TCP/IP 三次握手四次挥手?
- 握手:SYN, SYN+ACK, ACK;挥手:FIN, ACK, FIN, ACK。
5. HTTP 可靠性?
6. TCP/IP 分层?
- 物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。TCP 传输层,HTTP 应用层。
(十二)Kotlin 方面
1. Kotlin 特性?
- 简洁,空安全,扩展函数,协程,数据类,Lambda。
2. @JvmOverloads?
3. List 与 MutableList?
4. 单例方式?
5. data 关键字?
- 自动生成 equals, hashCode, toString, copy。
6. 委托属性?
- by 关键字,DelegatePattern,Lazy 初始化。
7. with 与 apply?
8. Unit 与 Void?
- Unit 是 Kotlin 类型,Void 是 Java 占位符。
9. infix 关键字?
10. 可见性修饰符?
- public, private, protected, internal。internal 仅限模块内。
11. Kotlin 与 Java 混合?
12. 解构?
13. 内联函数?
- inline,消除 Lambda 开销,配合 crossinline/noinline。
14. 构造方法?
- primary constructor, secondary constructor,init 块。
15. Sequence?
16. Coroutines?
17. 可空类型处理?
- ? 标记,?. 安全调用,!! 强制非空,?: Elvis 运算符。
18. Any 与 Object?
- Any 是顶层超类,Object 是 Java 顶层超类。
19. 隐式转换?
20. 集合遍历?
- for, forEach, map, filter。
注:本文档仅供学习参考,面试中请结合项目经验灵活作答。