1. List集合基础与核心特性
Java集合框架中的List接口是最常用的数据结构之一,它代表一个有序的元素序列。与数组不同,List的长度是可变的,这为开发者提供了极大的灵活性。ArrayList和LinkedList是List接口的两个经典实现类,它们各自有着独特的内部实现机制。
ArrayList底层采用动态数组实现,初始容量默认为10。当元素数量超过当前容量时,会自动进行1.5倍的扩容(JDK1.8+)。这种实现使得ArrayList在随机访问时具有O(1)的时间复杂度,但在中间位置插入或删除元素时,需要移动后续所有元素,性能为O(n)。因此,ArrayList特别适合读多写少的场景。
java复制// ArrayList初始化与扩容示例
List<String> arrayList = new ArrayList<>(); // 初始容量10
for(int i=0; i<100; i++){
arrayList.add("item"+i); // 触发多次扩容
}
LinkedList采用双向链表实现,每个节点(Node)都包含前驱和后继指针。这使得LinkedList在任意位置插入或删除元素的时间复杂度都是O(1),但随机访问需要遍历链表,性能为O(n)。LinkedList还实现了Deque接口,可以作为队列或双端队列使用。
实际开发中选择建议:当需要频繁随机访问元素时优先使用ArrayList;当需要频繁在集合中间插入/删除元素时考虑LinkedList。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. List核心API深度解析
2.1 基础操作方法
List接口扩展了Collection的基础方法,添加了基于索引的操作能力:
E get(int index):获取指定位置元素E set(int index, E element):替换指定位置元素void add(int index, E element):在指定位置插入元素E remove(int index):移除指定位置元素
这些方法都依赖于具体的实现类。以ArrayList的remove方法为例,其内部会调用System.arraycopy()来移动元素:
java复制// ArrayList.remove(int index)源码片段
public E remove(int index) {
rangeCheck(index);
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index, numMoved);
elementData[--size] = null; // 清除引用,帮助GC
return oldValue;
}
2.2 批量操作与视图
List提供了高效的批量操作方法:
