前言

如你只拥有跟其他人一样的知识面,你将无任何竞争力,制造亮点深入吃透

项目

  • 你负责的工作
  • 项目中的亮点及难点

    Java

  • synchronized等待的线程和调用wait等待的线程,是否会占用cpu时间片

  • 如何保证多个线程执行到某个点等待其他线程,然后一起执行
  • 自定义线程池,参数意义,线程池工作原理
  • 如何保证线程同步
  • classloder 有哪些,双亲委托机制执行原理
  • synchronized等待线程谁先竞争到锁,竞争锁有什么策略吗
  • 泛型到底是什么,擦除的是什么
  • 方法注解如何获取注解参数,类注解如何获取类
  • socket的三次握手+(心跳数据+内容数据如何区分)

    Android

  • handler如何实现延迟发送,MessageQueue数据结构

  • binder原理,优缺点
  • servicemanger启动时机
  • AIDL主要函数
  • 三方库原理(Retrofit,Okhttp,Rxjava,Glide)
  • gradle task 任务,targetSdkVersion作用
  • MVC,MVP,MVVP,Clean
  • 与H5通信方式,webview加载原理
  • Looper是如何保证他的唯一性的,ThreadLocal

    性能优化

  • 启动性能优化

  • 内存优化
  • 网络优化
  • 冷启动过程
  • 内存泄漏、内存溢出,概念原理解决方案
  • 一个大数据量列表,频繁增删,采用什么数据结构
  • 实现一个图片列表,如何优化
  • 主线程竞争锁导致ANR,如何解
  • NDK OS 异常捕获

    网络

  • 网络请求有哪些协议,协议区别

  • 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,不管T是什么,内存中只有一个List类,在C#中,内存中就有List,List
兼容性好,1.4之前没有泛型,使用类型插除能兼容老版本
泛形类型无法当作真是类型使用,类型被插除了
类型强转时的运行时开销
类的签名信息中会保存泛型信息,可以通过反射拿到泛型类型