ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Java 集合 List、Set、Map 简易对比

Java 集合 List、Set、Map 简易对比 1. 引言Java 集合框架Collection Framework是日常开发中使用频率最高的工具之一也是面试中的必考点。本文系统梳理 Java 中所有常用集合从接口层级、实现类、线程安全、底层结构、性能差异等多个维度进行全方位对比助你彻底掌握集合选型。2. 集合框架整体结构Java 集合框架主要分为两大体系Collection单列集合和Map双列集合。IterableCollectionListSetQueueArrayListLinkedListVectorHashSetLinkedHashSetTreeSetPriorityQueueMapHashMapLinkedHashMapTreeMapHashtableConcurrentHashMapCollection存储单列元素包含 List、Set、Queue 三大子接口。Map存储键值对键不可重复值可重复。3. List 体系对比List 是有序、可重复的集合允许存储 null。对比项ArrayListLinkedListVector底层结构动态数组双向链表动态数组线程安全非线程安全非线程安全线程安全方法加 synchronized随机访问快O(1)慢O(n)快O(1)插入/删除中间插入慢需移动元素快只需修改指针中间插入慢需移动元素内存占用连续内存有扩容开销每个节点额外存储前后指针连续内存有扩容开销扩容机制默认容量 101.5 倍扩容无容量概念默认容量 102 倍扩容适用场景频繁查询、遍历频繁增删已过时不推荐使用// ArrayList随机访问快ListStringlistnewArrayList();list.add(a);list.get(0);// O(1)// LinkedList增删快ListStringlist2newLinkedList();list2.add(0,x);// O(1)注意Vector已过时并发场景推荐使用CopyOnWriteArrayList。4. Set 体系对比Set 是无序、不可重复的集合用于去重场景。对比项HashSetLinkedHashSetTreeSet底层结构HashMapLinkedHashMapTreeMap红黑树顺序无序插入顺序自然排序/自定义排序是否允许 null允许一个 null允许一个 null不允许 null线程安全非线程安全非线程安全非线程安全时间复杂度O(1)O(1)O(log n)适用场景快速去重需要保持插入顺序的去重需要排序的去重// HashSet快速去重SetStringsetnewHashSet();set.add(a);set.add(a);// 不会重复添加// TreeSet自动排序SetIntegertreeSetnewTreeSet();treeSet.add(3);treeSet.add(1);treeSet.add(2);// 遍历顺序为 1, 2, 3注意TreeSet要求元素实现Comparable或在构造时传入Comparator。5. Queue 体系对比Queue 是先进先出FIFO的队列集合。对比项PriorityQueueArrayDequeLinkedList作为队列底层结构二叉堆循环数组双向链表排序按优先级出队按插入顺序按插入顺序是否允许 null不允许不允许允许线程安全非线程安全非线程安全非线程安全适用场景任务调度、TopK双端队列、栈普通队列// PriorityQueue按优先级出队QueueIntegerpqnewPriorityQueue();pq.offer(3);pq.offer(1);pq.offer(2);pq.poll();// 返回 1最小元素优先// ArrayDeque双端队列DequeStringdequenewArrayDeque();deque.addFirst(a);deque.addLast(b);注意PriorityQueue默认是最小堆可通过Comparator改为最大堆。6. Map 体系对比Map 存储键值对键不可重复。对比项HashMapLinkedHashMapTreeMapHashtableConcurrentHashMap底层结构数组链表红黑树数组链表红黑树双向链表红黑树数组链表数组链表红黑树线程安全非线程安全非线程安全非线程安全线程安全线程安全是否允许 null key允许允许不允许不允许不允许是否允许 null value允许允许不允许不允许不允许顺序无序插入顺序自然排序/自定义排序无序无序锁机制无无无方法级 synchronizedCAS synchronized分段/桶级锁时间复杂度O(1)O(1)O(log n)O(1)O(1)适用场景通用键值存储需要保持插入顺序需要排序已过时高并发场景// HashMap通用存储MapString,IntegermapnewHashMap();map.put(a,1);map.get(a);// 1// LinkedHashMap保持插入顺序MapString,IntegerlinkedMapnewLinkedHashMap();linkedMap.put(a,1);linkedMap.put(b,2);// 遍历顺序为 a, b// TreeMap自动排序MapString,IntegertreeMapnewTreeMap();treeMap.put(b,2);treeMap.put(a,1);// 遍历顺序为 a, b// ConcurrentHashMap并发安全MapString,IntegerconcurrentMapnewConcurrentHashMap();concurrentMap.put(a,1);注意Hashtable已过时并发场景一律推荐ConcurrentHashMap。7. HashMap 底层原理详解HashMap 是 Java 中使用最频繁的集合其底层原理是面试高频考点。7.1 数据结构JDK 1.7数组 链表。JDK 1.8数组 链表 红黑树。数组Node[]链表hash 冲突时红黑树链表长度 ≥ 8 且数组长度 ≥ 64 时7.2 关键参数参数默认值说明初始容量16必须是 2 的幂加载因子0.75扩容阈值 容量 × 加载因子树化阈值8链表长度 ≥ 8 时转为红黑树反树化阈值6红黑树节点 ≤ 6 时转回链表最小树化容量64数组长度 ≥ 64 才允许树化7.3 put 流程// 简化版 put 流程inthashkey.hashCode()^(key.hashCode()16);// 扰动函数intindex(n-1)hash;// 计算桶下标// 1. 数组为空 → 扩容初始化// 2. 桶为空 → 直接放入// 3. 桶不为空 → 链表遍历key 相同则覆盖否则尾插// 4. 链表长度 ≥ 8 → 转红黑树// 5. 元素个数 阈值 → 扩容注意HashMap的容量始终是 2 的幂目的是让(n - 1) hash均匀分布。8. 线程安全集合对比并发场景下需要选择线程安全的集合。集合锁粒度读并发写并发适用场景Hashtable整表锁低低已过时Collections.synchronizedXxx整表锁低低简单包装ConcurrentHashMap桶级锁CAS synchronized高高高并发读写CopyOnWriteArrayList写时复制极高低读多写少CopyOnWriteArraySet写时复制极高低读多写少ConcurrentLinkedQueue无锁CAS高高高并发队列BlockingQueue 系列锁 条件队列中中生产者-消费者// 读多写少CopyOnWriteArrayListListStringcowListnewCopyOnWriteArrayList();cowList.add(a);// 写时复制整个数组// 高并发读写ConcurrentHashMapMapString,IntegerchmnewConcurrentHashMap();chm.put(a,1);// 生产者-消费者BlockingQueueBlockingQueueStringqueuenewArrayBlockingQueue(10);queue.put(task);// 队列满时阻塞Stringtaskqueue.take();// 队列空时阻塞9. 集合选型速查表需求推荐集合理由频繁随机访问ArrayListO(1) 随机访问频繁头尾增删LinkedList / ArrayDequeO(1) 增删去重且无序HashSetO(1) 查重去重且保持插入顺序LinkedHashSet去重 有序去重且需要排序TreeSet自动排序键值存储HashMapO(1) 读写键值存储且保持插入顺序LinkedHashMap有序 O(1)键值存储且需要排序TreeMap自动排序高并发键值存储ConcurrentHashMap桶级锁性能高读多写少列表CopyOnWriteArrayList读无锁生产者-消费者BlockingQueue阻塞队列任务按优先级处理PriorityQueue堆结构10. 常见面试追问10.1 HashMap 和 Hashtable 有什么区别对比项HashMapHashtable线程安全非线程安全线程安全null key/value允许不允许初始容量1611扩容倍数1.5 倍2 倍迭代器fail-fastfail-fast10.2 HashMap 和 ConcurrentHashMap 有什么区别对比项HashMapConcurrentHashMap线程安全非线程安全线程安全null key/value允许不允许锁粒度无锁桶级锁JDK8性能高高并发场景适用场景单线程多线程10.3 ArrayList 和 Vector 有什么区别对比项ArrayListVector线程安全非线程安全线程安全扩容倍数1.5 倍2 倍性能高低有锁开销推荐度推荐已过时10.4 HashSet 和 TreeSet 有什么区别对比项HashSetTreeSet底层结构HashMapTreeMap红黑树顺序无序排序时间复杂度O(1)O(log n)null允许一个不允许比较方式equals() hashCode()Comparable / Comparator11. 总结Java 集合框架的核心选型原则可以概括为List有序可重复ArrayList查快、LinkedList改快。Set无序不可重复HashSet去重、LinkedHashSet保序、TreeSet排序。Map键值存储HashMap通用、LinkedHashMap保序、TreeMap排序、ConcurrentHashMap并发。线程安全单线程用普通集合多线程用ConcurrentHashMap、CopyOnWriteArrayList、BlockingQueue。理解底层数据结构数组、链表、红黑树、哈希表是掌握集合的关键面试时结合对比表格和代码示例回答能显著提升说服力。
返回列表