Java/Kotlin基础核心考点

在Android面试中,Java和Kotlin的基础知识是必问环节。面试官通常会考察你对面向对象编程的理解、集合框架的使用以及Kotlin特有语法特性的掌握程度。

1. Java基础重点

面向对象三大特性

封装、继承、多态是Java的核心。面试常问多态的实现原理(方法重写、向上转型)及静态绑定与动态绑定的区别。

集合框架详解

HashMap的底层实现(数组+链表+红黑树)、扩容机制、线程安全问题(ConcurrentHashMap)是高频考点。

异常处理机制

Checked Exception与Runtime Exception的区别,try-with-resources语法,以及自定义异常的最佳实践。

2. Kotlin语法特性

Kotlin作为Android官方推荐语言,其特性是面试的重点。以下是关键知识点对比:

特性 Java Kotlin 面试要点
空指针安全 需手动判空 Type Safety (?) 和 !! 理解可空类型与非空类型在编译期的检查机制
扩展函数 不支持 支持 扩展函数是静态方法,不修改原类结构
数据类 需手写toString/equals data class 自动生成getter/setter/toString/equals/hashCode
协程 需使用第三方库 内置支持 理解协程的挂起与恢复机制,suspend关键字

3. 常见面试题示例

Android框架核心机制

深入理解Android系统框架是进阶高级开发的必经之路。Handler消息机制、View绘制流程、Activity启动流程是三大核心支柱。

Handler消息机制原理

Handler机制由四个核心组件组成:Handler、Message、MessageQueue和Looper。

// Handler发送消息
handler.sendMessage(message);
// Looper循环取消息
while (true) {
    Message msg = queue.next(); // 可能阻塞
    if (msg != null) {
        msg.target.dispatchMessage(msg); // 分发给Handler
        msg.recycle();
    }
}

关键点:Looper.loop()是一个死循环,如果消息队列为空,线程会阻塞。主线程(UI线程)在Application启动时会自动创建Looper,因此可以在主线程中直接使用Handler更新UI。子线程默认没有Looper,需要手动调用Looper.prepare()和Looper.loop()。

View绘制流程

View的绘制从DecorView开始,经过measure、layout、draw三个阶段。

  • Measure:确定View的尺寸。通过onMeasure方法,递归测量子View。MeasureSpec由specSize和specMode组成,specMode包括EXACTLY、AT_MOST和UNSPECIFIED。
  • Layout:确定View的位置。通过onLayout方法,父View决定子View的左上右下四个坐标值。
  • Draw:绘制View的内容。通过onDraw方法,将View绘制到Canvas上。包括背景、内容、子View(dispatchDraw)、滚动条(onDrawScrollBars)。

面试题:为什么不能在子线程更新UI?
答案:因为ViewRootImpl的checkThread()方法会检查当前线程是否为主线程。此外,View的绘制流程涉及大量的线程同步操作,子线程更新UI可能导致竞态条件和界面显示异常。

Activity启动流程

Activity的启动涉及多个进程间的通信(Binder机制)。

Step 1
Client发起启动请求,调用ActivityManagerProxy(AMP)的startActivity方法。
Step 2
ActivityManagerService(AMS)接收到请求,检查权限和目标Activity信息。
Step 3
AMS通知Client进程创建Application和Activity实例。
Step 4
Client进程通过WindowManagerService创建窗口,并通知AMS启动完成。

核心类:ActivityManagerService (AMS), ActivityThread, ApplicationThread, Instrumentation。

Android架构设计与最佳实践

现代Android应用开发强调模块化、组件化和可维护性。MVC、MVP、MVVM是常见的架构模式,而Jetpack组件则是实现MVVM的有力工具。

1. 架构模式对比

模式 特点 优点 缺点 适用场景
MVC Model-View-Controller 简单直观 View层过重,Controller臃肿 小型项目
MVP Model-View-Presenter View薄,逻辑在Presenter 接口多,维护成本高 中型项目
MVVM Model-View-ViewModel 数据双向绑定,UI自动更新 调试困难,学习曲线陡 大型项目,复杂UI

2. Jetpack核心组件

3. 模块化与组件化

随着项目规模扩大,单体应用难以维护。组件化架构将应用拆分为多个独立模块,每个模块可以独立开发、测试和运行。核心模块提供公共能力,业务模块实现具体功能。通过ARouter等路由框架实现模块间解耦通信。

Android性能优化实战

性能优化是高级工程师面试的必考题。优化涉及启动速度、内存管理、UI流畅度、网络请求和电量消耗等多个方面。

1. 启动优化

启动时间分为冷启动和热启动。冷启动需要创建进程和Application,耗时较长。优化策略包括:

2. 内存优化

内存泄漏是Android开发中的常见问题。常见泄漏点包括:

泄漏场景 原因 解决方案
静态变量持有Activity 静态变量生命周期长,持有Activity引用 使用Application Context或弱引用
内部类/匿名内部类 隐式持有外部类引用 使用静态内部类+弱引用,或改为静态类
资源未关闭 Cursor、InputStream等未close 使用try-with-resources或finally块关闭
Handler消息队列 Handler持有Activity引用,消息未处理 移除回调,使用弱引用Context

3. UI流畅度优化

掉帧是用户感知最明显的性能问题。优化手段包括:

大厂高频面试题解析

以下是来自字节跳动、腾讯、阿里等大厂的真实面试题目,涵盖深度和广度。

1. 字节跳动

问题:请简述Android中的Binder机制原理。

解析:Binder是Android特有的IPC机制。它基于C/S架构,内核空间有Binder驱动程序,用户空间有ServiceManager、Server和Client。Binder通过mmap映射内存,实现零拷贝。Client通过Proxy对象发起调用,请求发送给Binder驱动,驱动转发给Server,Server处理后将结果返回。Binder的优势是安全、高效、支持多进程。

2. 腾讯

问题:Kotlin协程与RxJava相比有什么优势?

解析:协程是轻量级线程,由用户态调度,切换成本低;RxJava基于观察者模式,链式调用复杂,调试困难。协程支持挂起函数,代码同步风格,可读性更好。协程与Kotlin语言深度集成,支持结构化并发,避免内存泄漏。

3. 阿里

问题:如何设计一个高可用的Android网络请求库?

解析:需要考虑以下方面:1. 线程池管理:避免创建过多线程;2. 缓存策略:内存+磁盘+网络三级缓存;3. 重试机制:网络抖动时自动重试;4. 拦截器链:日志、签名、加密等横切关注点;5. 错误处理:统一异常封装;6. 取消请求:防止内存泄漏。

Android开发者职业规划指南

随着Flutter、React Native等跨平台技术的兴起,Android原生开发面临挑战,但仍有不可替代的价值。以下是不同阶段的职业发展建议。

1. 初级阶段(0-2年)

重点掌握Java/Kotlin基础、Android常用API、UI布局、Intent、BroadcastReceiver、ContentProvider等。能够独立完成简单APP开发。

2. 中级阶段(2-5年)

深入理解Android框架源码,掌握性能优化、内存管理、自定义View、组件化开发。熟悉Jetpack组件,能够搭建MVVM架构。

3. 高级阶段(5年以上)

具备架构设计能力,能够主导大型项目技术选型。关注跨平台技术(Flutter/RN)、AOP、插件化、热修复等前沿技术。具备团队管理和技术规划能力。

建议:保持学习热情,关注Google I/O大会,阅读官方文档,参与开源项目,积累技术博客写作经验。