刚开始面试的时候我真的是处处碰壁,面一家挂一家,面完之后怀疑自我,是不是自己真的太菜了找不到工作。工作本身就是双向选择,一家不行再换一家,总有合适的,千万不要因为别人的一句话就全盘否定自己,一定要自信。
面试战况(时间排序)
- 最右二面挂
- 猿辅导一面挂
- 伴鱼 offer(两轮技术 + 一轮 HR)
- 顺丰二面挂
- 百度二面挂
- 微博一面挂(一面就问意向薪资,面的还行,要多了没有后续了)
- 老虎证券 offer(两轮技术 + 一轮 HR)
- 滴滴一面挂
- 快手简历挂
- 字节 offer(三轮技术 + 一轮 HR)
- 美团 HR 面(三轮技术)
- 腾讯 HR 面(三轮技术)
对于离职原因,虽然实际上可能是由于薪资减少、工作环境不佳或缺乏成长机会等原因,但在面试中要尽量以个人发展为出发点来回答。尽量避免谈论现有公司的负面情况,因为这可能会让面试官对你的职业素养产生怀疑。如果你频繁更换工作或像作者这样在第一份工作不满两年,需要想好一个合理的离职理由,以避免在面试中引起不必要的麻烦。
在投递简历的顺序方面,如果你对自己非常有信心,可以直接投递自己的目标公司。然而,如果你感到有些不确定或缺乏经验,可以先面试几家规模相对较小的公司来积累经验和了解当前的市场情况,然后再投递自己真正心仪的公司。
在心态准备方面,既然你已经准备离职,就不应让其他事情干扰你的心态。保持积极的心态非常重要。我在初次面试时遭遇了许多挫折,甚至在一次面试中被面试官嘲讽,让我开始怀疑自己的能力。幸运的是,后来有一家公司给我发了 offer,让我明白问题不在他身上,而是市场和机会的选择。对于工作,要保持开放的心态,相信总会有一家公司适合你,不要因为别人的负面评价而对自己产生怀疑。
在技术准备方面,建议将所有面试问题总结在一起,整体考虑如何回答。这样可以帮助你更好地准备面试和了解常见的面试问题及解答思路。
项目复盘:
在项目上一定要重视,一定要能做到融汇贯通,不仅从技术上也要从业务上,还要知道这个需求为什么要这么做,这么做的收益是什么,如果产生问题应该如何解决,以此来进行判断。其次在技术细节上,要能够知道为什么要选择这种技术方案,这么做的好处是什么,以及能够进行横向纵向拓展。
比如我的项目中有一个地方用 JobService 实现了定时任务,那么可以横向拓展的点就有:Android 中实现定时任务的方式都有哪些,各自都有哪些好处和坏处,为什么在当时的场景下选择了 JobService?JobService 与普通 Service 的区别是什么?通过这种扩展能够对自己做的工作有更多的了解。
纵向扩展的话就有:JobService 的原理是什么?JobService 在参数配置上的一些细节是什么?JobService 是不是会严格按照你配置的时间运行?通过这种扩展可以对自己使用的工具或框架有更深入的了解。
除此之外,良好的表达能力也是非常重要的一环,如果不觉得麻烦的话可以在复盘项目的时候把自己做了什么,为什么这么做打个草稿,自己看自己的逻辑以及表达是否通顺,以此来做调整。
因此,在复盘项目的时候应该更加注重对整个项目的理解和思考,不要只局限于自己负责的部分,通过对整个项目的了解和分析,可以更好地发现自己的不足之处,提高自己的专业素养。
面试前的系统复习路线参考
面试:如果不准备充分的面试,完全是浪费时间,更是对自己的不负责!接下来分享的系统学习资源以详解各大互联网公司的 Android 常见面试题为主线,从面试的角度带你介绍必备知识点,以及该知识点在项目中的实际应用。
帮你在现在的基础上,重新梳理和建立 Android 开发的知识体系。无论是你短期内想提升 Android 内功实力,突破自己工作中的能力瓶颈,还是准备参加 Android 面试,都会在这份资料中有所一些收获。
由于面试内容比较多,篇幅有限,资料已经被整理成了 PDF 文档,有需要 2023 年 Android 中高级最全面试真题答案 完整文档的可
第一章 Java 方面
Java 基础部分
- 基本数据类型:int, long, float, double 等,注意包装类与基本类型的区别,自动装箱拆箱的陷阱。
- String 类:String 是不可变的,String Pool 机制,intern() 方法的作用,StringBuilder 与 StringBuffer 的区别。
- 异常处理:Checked Exception 与 Unchecked Exception,try-catch-finally 的执行顺序,自定义异常。
Java 集合
- List:ArrayList 基于数组,扩容机制;LinkedList 基于链表,插入删除快但随机访问慢。
- Map:HashMap 底层结构(数组 + 链表+红黑树),put/get 原理,线程安全问题(ConcurrentHashMap)。
- Set:HashSet 基于 HashMap,去重原理。
Java 多线程
- 线程创建:继承 Thread 类,实现 Runnable 接口,实现 Callable 接口。
- 线程池:ThreadPoolExecutor 的 7 个核心参数,拒绝策略,常用线程池类型(FixedThreadPool, CachedThreadPool)。
- 锁机制:synchronized 关键字,ReentrantLock,volatile 关键字可见性与禁止指令重排。
Java 虚拟机
- 内存区域:堆(Heap)、栈(Stack)、方法区、程序计数器、本地方法栈。
- 垃圾回收:GC Roots,标记 - 清除,复制算法,标记 - 整理,分代收集理论。
- 类加载:双亲委派模型,打破双亲委派的场景。
第二章 Android 方面
Android 四大组件相关
- Activity:生命周期,启动模式(Standard, SingleTop, SingleTask, SingleInstance),Intent 传递数据。
- Service:前台服务,绑定服务,IntentService,后台限制对 Service 的影响。
- BroadcastReceiver:静态注册与动态注册,有序广播与无序广播,LocalBroadcastManager。
- ContentProvider:跨进程数据共享,URI 匹配规则。
Android 异步任务和消息机制
- Handler 机制:MessageQueue, Looper, Handler 的关联关系,主线程 Looper 的初始化。
- AsyncTask:已废弃,理解其内部线程池机制。
- Thread:手动管理线程,配合 Handler 更新 UI。
Android UI 绘制相关
- View 绘制流程:measure, layout, draw 三个步骤。
- 事件分发:dispatchTouchEvent, onInterceptTouchEvent, onTouchEvent 的传递规则。
- 自定义 View:onMeasure, onLayout, onDraw 的重写,MeasureSpec 模式。
Android 性能调优相关
- 内存优化:LeakCanary 使用,Bitmap 压缩,避免内存泄漏。
- 启动优化:冷启动优化方案,延迟初始化,异步加载。
- 布局优化:ConstraintLayout 使用,merge, include, viewStub 标签,过度绘制检测。
Android 中的 IPC
- Binder:Binder 机制原理,AIDL 接口定义,ServiceConnection。
- Messenger:基于 Messenger 的轻量级 IPC。
- Socket:网络通信方式,适用于长连接。
Android 系统 SDK 相关
- Manifest 配置:权限声明,组件导出,intent-filter。
- Gradle 构建:依赖管理,多渠道打包,ProGuard 混淆规则。
第三方框架分析
- Retrofit:请求封装,拦截器链,RxJava 集成。
- Glide/Picasso:图片加载缓存策略,内存管理。
- Dagger/Hilt:依赖注入原理,模块与组件。
综合技术
- 架构模式:MVC, MVP, MVVM 的区别,Jetpack 组件应用。
- Kotlin 协程:suspend 函数,CoroutineScope,Dispatchers。
数据结构方面
- 数组与链表:存储结构与操作复杂度。
- 树与图:二叉树遍历,最短路径算法基础。
- 哈希表:冲突解决,负载因子。
设计模式
- 单例模式:双重检查锁定,静态内部类实现。
- 工厂模式:简单工厂,抽象工厂。
- 观察者模式:Observer, LiveData, EventBus。
计算机网络方面
- HTTP/HTTPS:握手过程,证书验证,状态码。
- TCP/IP:三次握手,四次挥手,滑动窗口。
- DNS:域名解析过程。
Kotlin 方面
- 空安全:? , !! , let, also 等安全调用运算符。
- 扩展函数:为已有类添加功能。
- 高阶函数:map, filter, reduce 的使用。
第三章 音视频开发高频面试题
为什么巨大的原始视频可以编码成很小的视频呢?这其中的技术是什么呢?
- 压缩原理:去除空间冗余(帧内压缩)和时间冗余(帧间预测),量化降低精度。
- 编码格式:H.264, H.265 (HEVC), VP9 等标准对比。
怎么做到直播秒开优化?
- 预加载:首屏关键资源提前加载。
- CDN 加速:边缘节点缓存,就近接入。
- 弱网对抗:自适应码率,丢包重传,前向纠错。
直方图在图像处理里面最重要的作用是什么?
- 亮度分布:反映图像明暗程度,用于曝光评估。
- 色彩统计:分析颜色构成,辅助调色。
数字图像滤波有哪些方法?
- 平滑滤波:均值滤波,高斯滤波,用于去噪。
- 锐化滤波:拉普拉斯算子,Sobel 算子,用于边缘检测。
图像可以提取的特征有哪些?
- 颜色特征:HSV 空间直方图。
- 纹理特征:灰度共生矩阵。
- 形状特征:轮廓描述子。
衡量图像重建好坏的标准有哪些?怎样计算?
- PSNR:峰值信噪比,数值越大越好。
- SSIM:结构相似性,更接近人眼感知。
第四章 Flutter 高频面试题
Dart 部分
- 类型系统:强类型,可选类型,泛型。
- 异步编程:Future, Stream, async/await。
- Isolate:并发模型,与 Worker 的区别。
Flutter 部分
- Widget 分类:StatelessWidget, StatefulWidget。
- 渲染流程:Element, RenderObject, Layer 三层架构。
- 热重载:Hot Reload 原理,保留 State。
第五章 算法高频面试题
如何高效寻找素数
- 埃拉托斯特尼筛法:时间复杂度 O(n log log n)。
如何运用二分查找算法
- 有序数组:找目标值,找边界,时间复杂度 O(log n)。
如何高效解决雨水问题
如何去除有序数组的重复元素
如何高效进行模幂运算
如何寻找最长回文子串
- 中心扩展法:枚举中心点,O(n^2)。
- Manacher 算法:线性时间复杂度解法。
第六章 Android Framework 方面
系统启动流程面试题解析
- Zygote 进程:SystemServer 启动,AMS 初始化。
- Bootanimation:开机动画播放时机。
Binder 面试题解析
- 驱动层:binder_dev, binder_node。
- 用户层:BpBinder, BBinder。
Handler 面试题解析
- Looper 死循环:while(true) 监听 MessageQueue。
- 消息阻塞:Message 的 target 字段。
AMS 面试题解析
- ActivityRecord:管理 Activity 状态。
- ProcessRecord:管理进程状态。
- PMS:Package 信息管理与权限校验。