765 字
2 分钟
Java集合框架详解
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(); // 1Map 接口
HashMap
最常用的Map实现,底层是数组+链表/红黑树(Java 8+)。
Map<String, Integer> map = new HashMap<>();map.put("键1", 1);map.get("键1"); // 1map.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); // 转为线程安全最佳实践
- 选对集合——ArrayList vs LinkedList,HashMap vs TreeMap,用错场景性能差很多
- 指定初始容量——
new ArrayList<>(100)避免频繁扩容 - 使用泛型——
List<String>而不是List - 遍历时删除用迭代器——for-each删除会抛异常
- 多线程用并发集合——别自己加synchronized,ConcurrentHashMap比手动同步效率高
💡 实战贴士: HashMap在并发场景下可能出现死循环(Java 7及以前),因为扩容时头插法会导致环形链表。Java 8改成了尾插法解决了这个问题,但并发场景还是推荐用ConcurrentHashMap,别图省事用HashMap加synchronized,性能差很多。
分享
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时
相关文章 智能推荐
1
Java数组与集合详解
Java 从数组到集合框架,这是每个Java开发者都会经历的进阶之路。ArrayList和HashMap用起来确实方便,但搞懂底层实现才是面试不翻车的关键。
2
Java注解详解
Java 刚学Java时觉得注解不就是几个@符号嘛,后来用Spring Boot才发现注解能玩出这么多花样——从编译检查到运行时注入,注解远不止看起来那么简单。
3
Java NIO详解
Java NIO的Selector模型让我第一次感受到了单线程处理万级连接的魅力。相比传统IO的阻塞读写,Channel加Buffer的组合简直是为高性能网络编程量身定做。
4
Java Stream API详解
Java Stream API让Java从命令式编程迈向了函数式编程的大门。从filter/map/reduce开始,你会爱上这种链式处理集合数据的写法。
5
Java IO操作详解
Java Java的IO体系虽然庞大,但掌握了装饰器模式再看InputStream和Reader的继承关系,一切都豁然开朗了。






