Android
-
Activity启动流程
- Zygote启动流程(小米)
- ActivityRecord是什么、Activity的四种启动模式(小米、百度)
- Launcher启动App的流程,中间有几种跨进程通信(滴滴)
- Launcher启动图标,有几个进程(滴滴)
- ActivityThread的main方法里面做了什么事,什么时候启动第一个Activity(斗鱼)
-
View的绘制流程
- 详细的绘制流程(腾讯、滴滴)
- 结合Activity的声明周期,View是在什么时候进行显示的(小米)
- 屏幕刷新机制、双重缓冲,三重缓冲,黄油模型(斗鱼)
- onCreate,onResume,onStart里面,什么地方可以获得宽高(斗鱼)
- view.post可以获得宽高,有看过view.post的源码吗(斗鱼)
- 自定义LinearLayout,怎么测量子View宽高(字节)
- setFactory和setFactory2有什么区别(字节)
- 怎么优化xml inflate的时间,涉及IO与反射。了解compose吗(字节)
- checkthread的问题包括thread是什么时候被赋值的,从Window到ViewRootImpl的创建,几者之间的关系(字节、腾讯)
- Window跟View的关系(字节)
- onMeasure方法、MeasureSpec的理解(滴滴、vipkid)
- Activity.setContentView中的xml文件是如何转化成View并显示到Activity中的(小米)
- LayoutInflater是如何把xml布局文件转换成View对象的(小米)
-
事件分发机制
- 事件分发机制流程(滴滴、小米、vipkid)
- 滑动冲突如何解决(美团、小米、vipkid)
- RecyclerView是怎么处理内部ViewClick冲突的(Vivo)
- ViewPager中嵌套ViewPager怎么处理滑动冲突(腾讯、小米)
- 怎么写一个不能滑动的ViewPager(斗鱼)
- ViewGroup在Action_Move时onIntercept返回true,事件怎么传递(滴滴)
- setOnTouchListener,onClickeListener和onTouchEvent的关系(字节)
-
RecyclerView
- RecyclerView的特点和缓存(滴滴、百度)
- RecyclerView的缓存机制(B站)
- RecyclerView 缓存结构,RecyclerView预取,RecyclerView局部刷新(字节)
-
Service
- 两种启动模式的区别
- 多个Activity共同bind一个service,一个Activity destory,问service的情况(字节)
-
Handler
- Handler是怎么切换线程的,Handler同步屏障(Vivo、百度)
- 同步消息,异步消息(斗鱼)
- Handler机制了解吗、一个线程有几个Looper(猿辅导)
- Handler内存泄漏的GCRoot是什么(滴滴)
- IdleHandler用过吗、它的调用时机(滴滴、字节、新浪)
- Handler休眠是怎样的?epoll的原理是什么?如何实现延时消息,如果移除一个延时消息会解除休眠吗(字节)
- ThreadLocal干嘛的?用法和原理(京东)
- MessageQueue中的Message是如何排列的(京东)
- Looper.loop( )为何不会阻塞进程(小米)
-
Binder
- 经过几次copy、从哪里copy到哪里(小米、百度)
- 多进程怎么实现?如果启动一个多进程APP,会有几个进程运行(滴滴)
- AIDL in out oneWay代表什么意思(字节、小米)
- 跨进程通信了解多少?管道了解吗(字节、百度)
- binder是cs架构,Server端的binder都是运行在同一个线程里面么(百度)
-
SharedParence
- SharedParence可以跨进程通信吗(网易云、字节)
- commit和apply的区别(网易云、字节)
- SharedPreference原理、读取xml是在哪个线程(滴滴)
- SharedPreference线程安全性,锁的对象是谁(字节)
-
序列化
- Serializable与Parceable的区别(网易云)
- Bundle是什么数据结构、利用什么传递数据(网易云)
-
LifeCycle
- LifeCycle的原理(斗鱼)
-
WebView
- h5与native通信是怎么进行的(B站、百度)
- WebView秒开的一些优化(网易云)
- WebView性能优化做过什么工作(字节)
-
屏幕适配
- 屏幕适配做过什么工作(B站)
-
Apk打包过程
- 了解APK打包的过程吗(滴滴、小米)
- 为什么会有R文件这个映射表?直接使用资源的路径不好么(小米)
性能优化
- 什么是OOM、ANR(新浪)
- ANR了解过吗?有没有实际的ANR定位问题的经历(Vivo、小米)
- 性能优化你做过哪些?(Vivo)
- Android中Bitmap内存大小的计算(滴滴、新浪、vipkid)
- drawable资源下Bitmap的加载顺序、drawable-hdpi、drawable-xhdpi、drawable-xxhdpi(京东)
- 有做过什么Bitmap优化的实际经验、比如Bitmap如何压缩、缩略图、大图加载优化(Vivo、百度)
- 有什么实际解决UI卡顿优化的经历(Vivo)
- App启动优化做过什么工作?如果首页就要用到的初始化(滴滴)
- xml的解析耗时在哪些方面,反射,读文件,解析(字节)
- app瘦身、包体积如何优化(字节、京东)
第三方框架
-
插件化
- 实现原理(小米、猿辅导、字节)
- 资源的插件化id重复如何解决(斗鱼)
- 插件化的原理是什么、有没有什么非运行时插件化的解决方案(滴滴)
- 插件化换肤方案(字节)
-
热修复
- 热修复的原理(快手、滴滴)
- tinker的原理(B站)
- tinker的patch文件如何生成,patch文件是全部加载dex文件首部么(滴滴)
- 资源的热修复的原理,会不会有资源冲突的问题(腾讯)
-
OkHttp
- OkHttp怎么实现连接池、里面怎么处理SSL(腾讯、滴滴)
- OkHttp的缓存逻辑实现,CacheInterceptor源码实现(字节)
- OkHttp的重试机制(滴滴)
-
Retrofit
- Retrofit的实现原理、涉及到的设计者模式(滴滴)
- Retrofit怎么做post请求(网易云)
-
RxJava
- RxJava怎么切换线程(尚德、腾讯)
-
Glide
- Glide源码实现(滴滴)
- Glide是如何对图片进行缓存的(Vivo)
-
ARouter
- 组件化之间如何去除强依赖(京东)
- ARouter详细原理(Vivo、腾讯、猿辅导、滴滴)
- ARouter怎么实现接口调用(腾讯)
- ARouter怎么实现页面拦截(腾讯)
- ARouter的原理是怎样的?注解处理器是处理java还是字节码(滴滴)
-
LeakCanary
- LeakCanary的原理(百度)
- 为什么不用虚引用?引用队列里面存的是什么(百度)
-
bugly
- bugly日志收集的原理是什么(滴滴)
- 怎么收集java的crash,native的crash(字节)
Java
-
泛型
- 泛型擦除、协变和逆变(美团、小米)
- 泛型是怎么解析的,比如在retrofit中的泛型是怎么解析的(B站)
- 泛型为什么要擦除(滴滴)
-
反射
- 反射是什么,在哪里用到,怎么利用反射创建一个对象(尚德)
- 反射可以反射final修饰的字段吗(滴滴)
- 既然泛型有编译期类型擦除,那么运行时无法获取到具体类型;而反射能在运行时获取到Class的类型(京东)
-
注解
- 编译期注解处理的是字节码还是java文件(猿辅导)
- Source和Class、Runtime注解的区别(滴滴)
-
线程
- 线程池的种类(快手、滴滴)
- 线程间同步的方法(B站)
- 阿里编程规范不建议使用线程池,为什么(滴滴)
- 如何让两个线程循环交替打印
- 怎么中止一个线程,Thread.interrupt()一定有效吗(滴滴)
- 进程和线程的区别(vipkid)
-
锁相关
- Java中的多线程数据安全问题、JMM(新浪)
- 写一个单例,volatile的作用,为什么需要(快手)
- volatile如何实现内存屏障(快手、斗鱼)
- volatile 修饰 boolean能保证原子性么(字节)
- synchronized底层原理是什么(尚德)
- synchronized的对象锁和类锁有什么不同(字节、滴滴)
- JMM可见性,原子性,有序性,synchronized可以保证什么(滴滴)
- synchronized和volatile的区别(快手、字节、百度、vipkid)
- synchronized是公平锁还是非公平锁,ReentrantLock是公平锁吗?是怎么实现的(B站、百度、vipkid)
- 什么是CAS(快手、vipkid)
- 源码中有哪里用到了AtomicInt(滴滴)
-
HashMap
- HashMap的数据结构,扰动函数,扩容(快手、京东、小米)
- HashMap的原理(斗鱼)
- HashMap查找的时间复杂度是多少(滴滴)
- hashCode的扰动算法,涉及到一个数字,31,这个31是怎么来的(字节)
-
ConcurrentHashMap
- 实现原理,put方法,树化,扩容,继承了谁,扩容的时候,其余桶怎么感知(字节)
- HashTable和ConcurrentHashMap的区别(京东)
-
LinkedHashMap
- LinkedHashMap的数据结构(B站)
- LinkedHashMap是线程安全的么、如何实现线程安全(京东)
- LRU如何实现的(京东、滴滴)
ArrayList和LinkedList区别(快手)
SparseArray和ArrayMap。具体实现原理和特性(滴滴、小米)
强引用、弱引用、软引用、虚引用的区别(小米)
equals,==有什么区别(快手)
自动装箱发生在什么时候?编译期还是运行期(滴滴)
接口和抽象类的区别,接口中可以有属性么(滴滴)
Aop、AspectJ、ASM了解么(滴滴)
类的static属性字段,比如 public static int a = 1,被赋值几次(字节)
JVM
-
垃圾回收算法、GC
- 如何让GC不回收(快手)
- GCRoot是什么、什么可以作为GCRoot(猿辅导、百度)
- 新生代和老年代分别用什么算法(斗鱼、小米)
-
内存模型
- 内存模型分区、哪些是线程私有的、哪些是线程共享的(美团、斗鱼、小米)
- JVM堆和栈的区别(小米)
-
类的加载机制
- 什么是双亲委派机制(京东呢)
- 对象加载的过程,属性先加载还是方法先加载(尚德)
- 静态方法,静态对象为什么不能继承(尚德)
- PathClassLoader与DexClassLoader有什么区别(网易云、斗鱼、字节)
- JVM类加载机制了解吗,类什么时候会被加载,类加载的过程具体生命周期是怎样的(滴滴)
- class文件的组成?常量池里面有什么内容(滴滴)
- java和字节码有什么区别(滴滴)
Kolin
- 说一下kotlin的优缺点,let和with的区别(滴滴)
- kotlin的in、out(小米)
- kotlin ?的原理(快手、滴滴)
- lazy使用(网易云)
- kotlin与Java互相调用有什么问题(网易云)
- kotlinc与javac编译字节码有什么区别(滴滴)
- 说说你对协程的理解(快手)
- 协程有什么作用、可以完全取代rxjava吗(猿辅导)
- 协程可以在Java项目中使用吗(滴滴)
- 协程介绍一下,讲一个协程的scope与context,协程的+号代表什么(字节)
设计者模式
- 设计模式的6大原则(小米)
- 单例的几种实现方式(小米)
- 代理模式中静态代理和动态代理区别与实现(快手、滴滴)
- 动态代理有什么作用(猿辅导)
- 策略模式和桥接模式的区别(滴滴)
- 代理模式与装饰模式的区别(尚德、字节)
- 装饰器模式,适配器模式区别(字节)
- Android源码中有哪些设计模式(腾讯)
- 手写一个单例模式(斗鱼)
- 动画里面用到了什么设计模式(滴滴)
- OkHttp里面用到了什么设计模式(滴滴)
网络相关
- http请求包、响应包(美团)
- tcp/ip协议分层(美团)
- tcp和udp的区别(小米)
- tcp的三次握手、四次挥手(快手)
- http-1.0、1.1、2.0有什么区别(网易云)
- https链接过程(美团、小米)
- 滑动窗口的最大值(小米)
算法
- 最大回文字串(小米)
- 随机打印k个数(小米)
- 链表去重(美团)
- 翻转链表(快手)
- 按层打印二叉树(快手)
- 反转数组(快手)
- 链表求和(快手)
- 二叉树的最大深度(快手)
- 二叉树最长结点集合(猿辅导)
- K个一组反转链表(猿辅导)
- 不同面值的几个硬币,怎么求满足条件的最小值(猿辅导)
- 一个大致有序的数组如何排序,最快时间复杂度(B站)
- 斐波那契台阶(字节)
- 二叉树的每一层最左边节点(字节)
- 生产消费者模型(字节)
- 数组里的元素,组合起来求最大值(腾讯)
- 两个用单链表表示的大数相加,求他们的和。单链表元素的值为0~9(滴滴)
- 求单链表的倒数第n个结点,时间复杂度为O(1)的解法(百度)
- 遍历目录及其子目录,使用非递归的方式(百度)
设计及思考
- 如果让你来实现一个网络框架,你会考虑什么(腾讯、猿辅导)
- 如何封装一个字符串转数字的工具类(滴滴)
- 设计一个埋点数据上报库,需要哪几个模块,提供哪样的接口(字节)
- 实现一个文件下载上传功能(腾讯)
- 设计一个云相册的功能(腾讯)