mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
765 字
2 分钟
Java集合框架详解
2026-02-06

Java集合框架的源码我翻来覆去看了好几遍,每次看都有新收获。从ArrayList到ConcurrentHashMap,每个集合背后都有精妙的设计思想。这篇文章把我对集合框架的理解整理了出来,希望能帮你理清这些类之间的关系。

Java集合框架详解#

集合框架是什么?#

集合框架就是Java官方帮我们实现好的一系列数据结构的接口和类,省得自己手写数组扩容、链表操作这些底层的东西。要是每次用个列表都得自己实现动态数组,那得多累啊。

层次结构#

Collection 接口#

所有集合的根接口:

  • List:有序,允许重复
  • Set:无序,不允许重复
  • Queue:队列,FIFO

Map 接口#

键值对映射,不继承Collection:

  • HashMap:哈希表,无序
  • LinkedHashMap:保持插入顺序
  • TreeMap:红黑树,排序
  • Hashtable:线程安全(但效率低,基本被ConcurrentHashMap取代了)

List 接口#

ArrayList#

  • 底层:动态数组
  • 特点:查询快,增删慢
  • 适用:查询频繁的场景

LinkedList#

  • 底层:双向链表
  • 特点:增删快,查询慢
  • 适用:频繁增删的场景

Vector#

  • 底层:动态数组
  • 特点:线程安全,但效率低
  • 现在基本不用了,有更好的替代方案

常用方法#

List<String> list = new ArrayList<>();
list.add("元素1");
list.add(1, "元素2"); // 指定位置插入
list.get(0); // 获取
list.set(0, "新元素"); // 修改
list.remove(0); // 删除
list.size(); // 大小
list.contains("元素1"); // 是否包含

遍历方式#

// for-each(最简洁)
for (String element : list) { ... }
// 迭代器(需要删除时用)
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String element = it.next();
if (element.equals("xxx")) {
it.remove(); // 安全删除
}
}

Set 接口#

HashSet#

  • 底层:哈希表
  • 无序,不允许重复
  • 查询速度快

LinkedHashSet#

  • 保持插入顺序
  • 其他同HashSet

TreeSet#

  • 红黑树实现
  • 自动排序(自然顺序或自定义比较器)
Set<String> set = new HashSet<>();
set.add("元素1");
set.add("元素1"); // 重复元素,不会添加
set.size(); // 1

Map 接口#

HashMap#

最常用的Map实现,底层是数组+链表/红黑树(Java 8+)。

Map<String, Integer> map = new HashMap<>();
map.put("键1", 1);
map.get("键1"); // 1
map.remove("键1");
// 遍历键值对
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}

其他Map实现#

  • LinkedHashMap:保持插入顺序,适合实现LRU缓存
  • TreeMap:键自动排序
  • ConcurrentHashMap:线程安全,高并发场景首选

Queue 和 Stack#

Queue#

Queue<String> queue = new LinkedList<>();
queue.offer("元素1"); // 添加
queue.poll(); // 获取并移除队首
queue.peek(); // 获取不移除

Stack(不推荐用)#

Java的Stack类继承自Vector,性能差。推荐用Deque代替:

Deque<String> stack = new ArrayDeque<>();
stack.push("元素1");
stack.pop();
stack.peek();

并发集合#

位于java.util.concurrent包:

  • ConcurrentHashMap:线程安全的HashMap,分段锁设计
  • CopyOnWriteArrayList:读多写少场景,写时复制
  • BlockingQueue:阻塞队列,生产者-消费者模式利器

Collections 工具类#

Collections.sort(list);
Collections.reverse(list);
Collections.shuffle(list);
Collections.binarySearch(list, key);
Collections.synchronizedList(list); // 转为线程安全

最佳实践#

  1. 选对集合——ArrayList vs LinkedList,HashMap vs TreeMap,用错场景性能差很多
  2. 指定初始容量——new ArrayList<>(100) 避免频繁扩容
  3. 使用泛型——List<String> 而不是 List
  4. 遍历时删除用迭代器——for-each删除会抛异常
  5. 多线程用并发集合——别自己加synchronized,ConcurrentHashMap比手动同步效率高

💡 实战贴士: HashMap在并发场景下可能出现死循环(Java 7及以前),因为扩容时头插法会导致环形链表。Java 8改成了尾插法解决了这个问题,但并发场景还是推荐用ConcurrentHashMap,别图省事用HashMap加synchronized,性能差很多。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

部分信息可能已经过时

目录