【Java面试必考】集合框架全解析:HashMap底层图解、线程安全与性能选型
1. 核心大厂必问HashMap 底层原理HashMap 是面试永远的神必须拿下数据结构JDK 1.7数组 链表头插法易死循环。JDK 1.8数组 链表 红黑树尾插法。为什么要引入红黑树通俗解释当发生哈希冲突时很多元素挤在同一个数组位置形成链表。链表太长的话找东西就像顺藤摸瓜很慢O(n)O(n)O(n)。引入红黑树就像把单向胡同改成了立体交通图查找速度飙升到了O(logn)O(\log n)O(logn)。转换阈值链表长度大于8且数组长度大于64时转为红黑树红黑树节点数小于等于6时退化为链表。扩容机制Resize默认初始容量16负载因子0.75。当元素数量达到$16 \times 0.75 12$时触发扩容每次扩容为原来的2倍。扩容时需要重新计算 Hash 或将旧数据迁移到新数组。2. 线程安全集合选型普通的集合ArrayList、HashMap在多线程下会报错ConcurrentModificationException。多线程并发 MapHashtable老古董全表加锁synchronized效率极低就像一家银行只有一个窗口办事。✅ConcurrentHashMap1.7分段锁Segment相当于银行开了多个窗口互不影响。1.8CAS synchronized直接锁头节点。粒度更细性能起飞。多线程并发 List✅CopyOnWriteArrayList写时复制。通俗理解当有人要修改名单时先复印一份副本来改改完再替换旧名单。适合读多写少的场景。3. 性能选型指南背诵表格集合类型底层数据结构适用场景线程安全版本ArrayList动态数组查改快增删慢适合大部分场景CopyOnWriteArrayListLinkedList双向链表增删快查改慢适合头部尾部频繁插数据ConcurrentLinkedQueue等HashMap数组链表红黑树单线程键值对存储查询快ConcurrentHashMapTreeMap红黑树需要对 Key 进行自然排序或自定义排序ConcurrentSkipListMapHashSet依赖 HashMap需要存储不重复元素的场景CopyOnWriteArraySet总结无脑首选ArrayList和HashMap。涉及并发果断上ConcurrentHashMap。