集合框架核心组件对比
特性对比 | ArrayList | Vector | LinkedList |
---|---|---|---|
线程安全 | 非同步 | 同步方法 | 非同步 |
扩容机制 | 增长50% | 翻倍增长 | 无扩容 |
线程安全实现机制
Vector通过方法级同步锁线程安全,每个操作方法都包含synchronized关键字。但在高并发场景下,这种粗粒度锁机制会导致性能瓶颈,建议使用Collections.synchronizedList进行包装或直接采用CopyOnWriteArrayList。
同步代码示例:
List<String> syncList = Collections.synchronizedList(new ArrayList<>());
// 迭代时需要手动同步
synchronized(syncList) {
Iterator<String> it = syncList.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
哈希表实现原理
JDK8的HashMap采用数组+链表+红黑树三位一体的存储结构。当链表长度超过8且桶数量达到64时,链表自动转换为红黑树,将查询时间复杂度从O(n)优化至O(log n)。
哈希冲突解决方案:
- 链地址法:冲突元素形成链表
- 再哈希法:采用双重哈希函数
- 开放寻址法:线性探测下一个空槽
集合框架高频考点
HashSet去重机制
当添加新元素时,首先计算hashCode确定存储位置。若该位置已有元素,则通过equals方法比较对象内容。hashCode和equals方法必须遵循规范:两个对象相等则hashCode必须相同,但hashCode相同不一定对象相等。
TreeMap排序原理
基于红黑树实现的可排序映射表,可通过Comparator实现自定义排序。删除操作涉及复杂的树结构调整,包括颜色变换和节点旋转,删除后仍维持红黑树特性。
性能优化实践
初始化HashMap时建议预设容量:new HashMap<>(initialCapacity)。当已知元素数量为N时,初始容量设置为N/0.75 +1,可避免多次扩容带来的性能损耗。
容量计算公式:
static final int tableSizeFor(int cap) { int n = cap - 1; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16; return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1; }