前言
如你只拥有跟其他人一样的知识面,你将无任何竞争力,制造亮点深入吃透
项目
- 你负责的工作
-
Java
synchronized等待的线程和调用wait等待的线程,是否会占用cpu时间片
- 如何保证多个线程执行到某个点等待其他线程,然后一起执行
- 自定义线程池,参数意义,线程池工作原理
- 如何保证线程同步
- classloder 有哪些,双亲委托机制执行原理
- synchronized等待线程谁先竞争到锁,竞争锁有什么策略吗
- 泛型到底是什么,擦除的是什么
- 方法注解如何获取注解参数,类注解如何获取类
-
Android
handler如何实现延迟发送,MessageQueue数据结构
- binder原理,优缺点
- servicemanger启动时机
- AIDL主要函数
- 三方库原理(Retrofit,Okhttp,Rxjava,Glide)
- gradle task 任务,targetSdkVersion作用
- MVC,MVP,MVVP,Clean
- 与H5通信方式,webview加载原理
-
性能优化
启动性能优化
- 内存优化
- 网络优化
- 冷启动过程
- 内存泄漏、内存溢出,概念原理解决方案
- 一个大数据量列表,频繁增删,采用什么数据结构
- 实现一个图片列表,如何优化
- 主线程竞争锁导致ANR,如何解
-
网络
网络请求有哪些协议,协议区别
- Okhttp底层网络发起原理 SPDY协议
- https通信原理
- 网络优化
handler如何实现延迟发送,MessageQueue数据结构
Message 是一个单链表结构
当hander 发送一个Message时,会判断当前message.when==0 || message.when < 链首Message.when 时即把当前元素作为链首,原链首元素为,链表中的第二个元素
当Looper获取消息执行时,直接获取链首元素执行
当Looper执行到一个延迟消息时,Looper会休眠延迟实行的时间点定时唤醒执行任务,有新消息时,也会从新唤醒looper继续消息循环
ThreadLocal原理
每个线程都拥有一个自己的ThreadLocalMap,ThreadLocal 在setValue时,会获取当前线程的ThreadLocalMap,如该线程未存在ThreadLocalMap,将为其创建一个,用来存储内容,key为ThreadLocal对象,value为ThreadLocal里的值,这样来保证存储的数据为每个线程私有.
实现一个图片列表,如何优化
1.流量优化
可以使用3级缓存,来优化流量,使用磁盘缓存优化内存,LRU算法淘汰资源,
2.绘制优化
图片根据控件大小进行分辨率压缩
3.滚动时
当内存中存有缓存,可以立即进行展示,滚动较慢时,可以加载磁盘缓存或网络缓存,根据应用业务需求控制
LRU算法原理
1.常用采用链表缓存数据
每次把最新的数据移到表头,当缓存空间不够时,淘汰链表尾的缓存数据,缺点是每次更新数据时,需要遍历,效率低
2.LRUCache的双向链表+HashMap实现
HashMap中存有每个缓存的节点数据,每次更新数据直接从HashMap中取到节点,然后更新链表,把当前节点置位链首,HashMap可以优化每次更新的遍历时间
泛型到底是什么,实现机制
- 类型插除从编译角度的细节
- 类型插除对运行时的影响
- 类型插除对反射的影响
- 对比不插除的语言
- 为什么Java选择类型插除
运行时内存占用少,比如List
兼容性好,1.4之前没有泛型,使用类型插除能兼容老版本
泛形类型无法当作真是类型使用,类型被插除了
类型强转时的运行时开销
类的签名信息中会保存泛型信息,可以通过反射拿到泛型类型