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