10.17

ArrayList:底层是Object数组,默认容量10,扩容是1.5倍(oldCap + (oldCap >> 1))。随机访问O(1),中间插入O(n)。

LinkedList:双向链表,头尾操作O(1),随机访问O(n)。实际项目里用得少,因为ArrayList的连续内存对CPU缓存更友好。

HashMap:数组+链表+红黑树。默认容量16,负载因子0.75,扩容翻倍。链表长度超过8且数组长度≥64转红黑树。为什么是8?泊松分布算出来概率极低,防止频繁树化。为什么容量是2的幂?因为hash & (n-1)等价于取模,位运算更快。

ConcurrentHashMap:JDK7分段锁,JDK8改成CAS+synchronized锁单个桶。get不加锁,put只锁当前桶。

HashSet:底层就是HashMap,value是固定的PRESENT对象。

posted @ 2026-10-17 12:35  一水尘风  阅读(4)  评论(0)    收藏  举报