Java 常见集合类详解

发布于:2025-09-12 ⋅ 阅读:(21) ⋅ 点赞:(0)

Java 提供了功能强大的集合框架(Collection Framework),它极大地方便了数据的存储、操作和管理。在日常开发和面试中,集合类是高频考点。本文将系统介绍 Java 常见的集合类及其特点。


一、Java 集合框架体系结构

Java 集合大致可以分为两大类:

  1. Collection 接口:存储单个元素的集合,常见子接口有

    • List:有序,可重复

    • Set:无序,不可重复

    • Queue:队列,支持先进先出或优先级排序

  2. Map 接口:存储键值对(key-value),key 不允许重复,value 可重复

集合框架图解

Collection
 ├── List
 │    ├── ArrayList
 │    ├── LinkedList
 │    └── Vector / Stack
 │
 ├── Set
 │    ├── HashSet
 │    ├── LinkedHashSet
 │    └── TreeSet
 │
 └── Queue
      ├── PriorityQueue
      └── ArrayDeque

Map
 ├── HashMap
 ├── LinkedHashMap
 ├── TreeMap
 └── ConcurrentHashMap

二、常见的 List 实现类

1. ArrayList

  • 底层结构:动态数组

  • 特点

    • 有序,可重复

    • 支持随机访问(get、set O(1))

    • 插入、删除效率低(需要移动元素)

  • 应用场景:查询多、增删少的场景

  • 例子

    List<String> list = new ArrayList<>(); list.add("Java"); list.add("Python"); System.out.println(list.get(0));


2. LinkedList

  • 底层结构:双向链表

  • 特点

    • 有序,可重复

    • 插入、删除效率高(只需修改指针)

    • 随机访问效率低(O(n))

  • 应用场景:增删多,查询少的场景

  • 例子

    List<Integer> linkedList = new LinkedList<>(); linkedList.add(1); linkedList.add(2); linkedList.remove(0);


3. Vector / Stack

  • Vector:线程安全版的 ArrayList(通过 synchronized 实现),但性能较差,已较少使用

  • Stack:继承自 Vector,后进先出(LIFO)

    Stack<Integer> stack = new Stack<>(); stack.push(1); stack.push(2); System.out.println(stack.pop()); // 2


三、常见的 Set 实现类

1. HashSet

  • 底层结构:基于 HashMap 实现

  • 特点

    • 无序,不重复

    • 元素存放顺序与 hash 值相关

  • 应用场景:去重、快速查找

  • 例子

    Set<String> set = new HashSet<>(); set.add("Java"); set.add("Python"); set.add("Java"); // 不会重复


2. LinkedHashSet

  • 底层结构:HashSet + 双向链表

  • 特点

    • 保证元素插入顺序

    • 适合需要去重又保留顺序的场景


3. TreeSet

  • 底层结构:红黑树

  • 特点

    • 元素有序(自然顺序或自定义 Comparator)

    • 查询性能 O(log n)

  • 应用场景:需要排序的集合

  • 例子

    Set<Integer> treeSet = new TreeSet<>(); treeSet.add(3); treeSet.add(1); treeSet.add(2); System.out.println(treeSet); // [1, 2, 3]


四、常见的 Queue / Deque 实现类

1. PriorityQueue

  • 底层结构:小顶堆(默认)

  • 特点

    • 元素出队时按优先级排序

    • 默认自然排序,可以自定义 Comparator

  • 应用场景:任务调度、优先级队列

  • 例子

    PriorityQueue<Integer> pq = new PriorityQueue<>(); pq.offer(5); pq.offer(1); pq.offer(3); System.out.println(pq.poll()); // 1


2. ArrayDeque

  • 底层结构:可变长数组实现的双端队列

  • 特点

    • 可作为队列(FIFO)或栈(LIFO)

    • 比 Stack、LinkedList 更高效

  • 例子

    Deque<String> deque = new ArrayDeque<>(); deque.addFirst("A"); deque.addLast("B"); System.out.println(deque.pollFirst()); // A


五、常见的 Map 实现类

1. HashMap

  • 底层结构:数组 + 链表 + 红黑树(JDK1.8 之后)

  • 特点

    • key 无序,不重复,允许一个 null key

    • value 可重复,允许多个 null value

  • 应用场景:最常用的键值对存储


2. LinkedHashMap

  • 底层结构:HashMap + 双向链表

  • 特点

    • 保证插入顺序或访问顺序

    • 常用于实现 LRU 缓存

  • 例子(LRU 实现)

    LinkedHashMap<Integer, String> lru = new LinkedHashMap<>(16, 0.75f, true); lru.put(1, "A"); lru.put(2, "B"); lru.get(1); // 访问 1


3. TreeMap

  • 底层结构:红黑树

  • 特点

    • key 有序(自然顺序或自定义 Comparator)

    • 查询、插入、删除时间复杂度 O(log n)

  • 应用场景:需要排序的 Map


4. ConcurrentHashMap

  • 底层结构

    • JDK1.7:Segment + HashEntry(分段锁)

    • JDK1.8:Node 数组 + CAS + synchronized

  • 特点

    • 线程安全,高性能

    • key、value 都不允许为 null

  • 应用场景:并发环境下的缓存、计数器


六、集合类对比总结

类名 底层结构 是否有序 是否允许重复 是否线程安全 适用场景
ArrayList 动态数组 有序 查询多
LinkedList 双向链表 有序 插入/删除多
HashSet HashMap 无序 去重
LinkedHashSet HashMap+链表 插入顺序 去重+保持顺序
TreeSet 红黑树 排序 有序集合
HashMap 数组+链表+红黑树 无序 key ❌,value ✅ 常用 Map
LinkedHashMap HashMap+链表 插入/访问顺序 key ❌,value ✅ LRU 缓存
TreeMap 红黑树 排序 key ❌,value ✅ 有序 Map
ConcurrentHashMap Node 数组+CAS 无序 key ❌,value ✅ 并发场景

七、总结

  • List:有序可重复,常见的 ArrayList、LinkedList。

  • Set:无序不可重复,常见的 HashSet、TreeSet。

  • Queue:先进先出或优先级,常见的 PriorityQueue、ArrayDeque。

  • Map:键值对存储,常见的 HashMap、LinkedHashMap、TreeMap、ConcurrentHashMap。

掌握集合类不仅要会使用,还要理解其 底层原理与适用场景,这样在面试和开发中才能灵活应用。

一句话总结:集合类是 Java 的“数据结构工具箱”,选择合适的集合,能让代码既高效又简洁。


网站公告

今日签到

点亮在社区的每一天
去签到