Java 面试题:集合 HashMap/CHM/ArrayList

一、HashMap 与 ConcurrentHashMap

维度 HashMap (JDK8) ConcurrentHashMap (JDK8)
结构 数组+链表+红黑树 同左
并发 线程不安全 CAS + synchronized(锁头节点)
扩容 单线程 多线程协助迁移
size int baseCount + CounterCell 分段

HashMap 树化条件:链表长度 > 8 且数组容量 ≥ 64。hash 扰动:h ^ (h >>> 16) 降低碰撞。

二、ArrayList vs LinkedList

  • ArrayList 随机访问 O(1)、中间插入 O(n);
  • LinkedList 头尾增删 O(1)、随机访问 O(n),且额外指针开销;
  • 绝大多数场景用 ArrayList。

三、fail-fast

遍历时用非迭代器方式结构性修改集合会抛 ConcurrentModificationException。多线程用 CopyOnWriteArrayList 或并发容器,或用迭代器 remove()。