android 面试题总结
2019-08-19 本文已影响0人
android源码探索
欢迎大家下载我个人开发的app安琪花园
android 常见的面试题
1. java中== equals hashCode的区别?
===
答:
===
- == 对于基本数据类型比较的是值是否相等,对于引用类型比较的是在内存当中的引用地址是否相等。
- equals 源代码当中比较的是两个对你在内存中的引用地址是否相等,当然了我们也可以复写这个方法,按照自己的规去判断对你是否相等
- hashCode
3. ViewGroup的绘制顺序
1566199093610.jpg4. hashMap, hashTable ConcurrentHashMap
区别: hashmap 线程不安全, concurrentHashMap是线程安全的, hashTable已经过时了,用得比较少
着重讲一下hashMap:
- hashMap 允许null作为key
- 哈希碰撞的处理是通过链表来实现的。hashmap中的每一个元素都是链表的头结点。当出现哈希碰撞的时候 则入链表里面插入数据。
- 为什么要用头插法。 因为在设计的时候,后插入的数据可能在访问频率上要高一点。所以当出现哈希碰撞的时候 也是直接往头结点插入数据的。
- hashMap 初始长度是16
- 为什么扩容的时候必须是2的幂。因为2的幂的数字在转换成二进制的时候,每一位都是1, 在与key的hashCode值做与运算的时候 ,得到的index的值就是hashCode的最后几位。
5. 进程间通信面试题
- 进程通信方式有如下: Binder, socket, Bundle, file, aidl, contentProvider, messager
6. handler面试题(从以下几点来掌握 )
- handler的内存泄漏
答: 出现内存泄漏是因为出现生命周期比较长的问题。主要是因为handle里面有一个循环,队列,导致出现了泄漏。 - 为什么不能在子线程创建handler
答: 子线程创建handler 会抛异常是因为从ThreadLocal里面取不到Looper导致了这个问题。
因为在new Handler的时候 里面会调用Looper.myLooper(), 而这个方法里面会调用threadLocal.get().因为 这个时候从ThreadLocal里面是取不到值的。所以才出现了问题。 - TextView.setText()只能在主线程执行是错误的
答: 因为底层做了线程判断 , 如果线程更新ui的线程不是主线程则会抛出异常 - new Handler的两种写法区别
答: 其实是有四种 创建handler的方式, 有传Callback的,有无参的,还有传入Looper的 - ThreadLocal的原理
答: 保存了Looper
handler的面试题理解这些就差不多了