1. ArrayList的底层实现与扩容机制
ArrayList作为Java集合框架中最常用的动态数组实现,其底层采用Object[]数组存储元素。与普通数组不同,ArrayList具备自动扩容能力,这使得它在实际开发中更加灵活。
初始容量默认为10,当添加第11个元素时会触发扩容。扩容过程通过int newCapacity = oldCapacity + (oldCapacity >> 1)计算新容量(即原容量的1.5倍),然后调用Arrays.copyOf()创建新数组并复制数据。这个设计在空间利用和性能之间取得了平衡:
java复制// JDK中的扩容代码片段
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
elementData = Arrays.copyOf(elementData, newCapacity);
}
重要提示:频繁扩容会导致性能下降,若能预估数据量,建议通过ArrayList(int initialCapacity)构造函数指定初始容量。
随机访问时间复杂度为O(1),这得益于数组的连续内存特性。但在中间位置插入/删除元素需要移动后续元素,时间复杂度为O(n)。例如在索引为2的位置插入元素:
code复制原始数组:[A, B, C, D, E]
插入X后:[A, B, X, C, D, E]
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数组与List的互转技巧
实际开发中经常需要在数组和List之间转换,Java提供了多种实现方式:
2.1 数组转List
Arrays.asList()是最常用的方法,但需要注意:
- 返回的ArrayList是Arrays的内部类,非java.util.ArrayList
- 固定大小,不支持add/remove等修改操作
- 修改原数组会影响List中的元素
java复制String[] arr = {"a", "b", "c"};
List<String> list = Arrays.asList(arr); // 转换
arr[0] = "modified"; // 会同步影响list中的元素
如果需要可变List,可以这样处理:
java复制List<String> realList = new ArrayList<>(Arrays.asList(arr));
2.2 List转数组
toArray()方法有两个重载版本:
java复制Object[] toArray
