1. Java集合框架概述:从C++到Java的平滑过渡
作为一名从C++转向Java的后端学习者,我深刻理解两种语言在数据结构实现上的异同。Java集合框架(Java Collections Framework)相当于C++标准模板库(STL)的Java版本,但设计更加统一和面向对象。整个框架围绕几个核心接口展开:Collection(所有集合的根接口)、List(有序集合)、Set(不重复集合)、Queue(队列)和Map(键值对映射)。
与C++的STL相比,Java集合框架有几个显著特点:
- 完全面向对象的设计,所有集合都是类而非模板
- 统一的迭代器接口(Iterator)
- 内置的并发安全版本(如ConcurrentHashMap)
- 更丰富的工具类(Collections)
重要提示:Java集合只能存储对象,不能存储基本类型(int, char等)。但通过自动装箱(auto-boxing)机制,我们可以直接使用类似
list.add(1)的写法,编译器会自动转换为list.add(Integer.valueOf(1))
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. List接口详解:有序集合的实战选择
2.1 ArrayList:动态数组的最佳实践
ArrayList是日常开发中最常用的List实现,底层基于Object[]数组实现。它的核心优势在于:
- 随机访问时间复杂度O(1)
- 内存连续,CPU缓存友好
- 尾部插入/删除效率高
初始化时建议指定初始容量(特别是已知数据量时):
java复制// 最佳实践:预估容量避免频繁扩容
List<String> list = new ArrayList<>(100);
扩容机制是ArrayList的关键特性。默认初始容量为10,当size超过capacity时,会自动扩容为原来的1.5倍(int newCapacity = oldCapacity + (oldCapacity >> 1))。扩容涉及数组拷贝,是相对耗时的操作。
java复制// 扩容源码片段(JDK17)
private Object[] grow(int minCapacity) {
int oldCapacity = elementData.length;
if (oldCapacity > 0 || elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
int newCapacity = ArraysSupport.newLength(
oldCapacity,
minCapacity - oldCapacity, /* minimum growth */
oldCapacity >> 1 /* preferred growth */);
return elementData = Arrays.copyOf(elementData, newCapacity);
} else {
return elementData = new Object[Math.max(DEFAULT_CAPACITY, minCapacity)];
