上篇聊完架构师技术决策,这篇进入滴滴Java基础专项。Java基础是Android面试的必考内容——HashMap底层实现(红黑树转换)、ConcurrentHashMap并发安全、ThreadLocal线程隔离、WeakReference内存管理。
今天8道题覆盖滴滴Java基础面试核心考点。
Q1:HashMap什么时候链表转红黑树?
条件:同一hash桶链表长度>=8且数组长度>=64时,链表转红黑树。数组<64优先扩容。
为什么是8:根据泊松分布,链表达到8的概率极低(<0.00000006)。8是空间和时间的平衡。
红黑树特性:查找/插入/删除O(logn)(链表O(n))。节点占用空间是链表的2倍。树节点<=6时退化回链表。
追问:HashMap的hash计算为什么用(h = key.hashCode()) ^ (h >>> 16)?高16位异或低16位,让高位也参与hash计算,减少hash冲突(尤其是数组较小时只用低位容易导致冲突)。
Q2:ConcurrentHashMap怎么保证线程安全?
JDK 1.7:分段锁(Segment数组,每个Segment独立加锁)。并发度=Segment数量(默认16个)。
JDK 1.8:CAS + synchronized。空桶用CAS直接写入,非空桶用synchronized锁住链表头节点