引言
Java集合框架是Java语言中非常重要的一部分,它提供了各种数据结构来存储和操作集合中的对象。List接口是Java集合框架中的一个核心接口,它代表了一组有序的元素集合。本文将深入解析List接口的源码,帮助读者理解Java集合框架的核心原理与实现。
List接口概述
List接口继承自Collection接口,并添加了索引的概念,允许通过索引访问集合中的元素。List接口的主要实现有ArrayList、LinkedList和Vector等。
List接口特点
- 有序:元素在列表中保持一定的顺序。
- 可重复:可以包含重复的元素。
- 可索引:可以通过索引访问元素。
List接口方法
List接口定义了一系列方法,包括:
add(E e):在列表末尾添加元素。remove(int index):根据索引删除元素。get(int index):根据索引获取元素。size():获取列表长度。contains(Object o):检查列表是否包含指定元素。iterator():返回列表的迭代器。
ArrayList源码解析
ArrayList是List接口的一个非同步实现,它使用数组来存储元素。
构造函数
public ArrayList(int initialCapacity) {
if (initialCapacity >= 0) {
this.elementData = new Object[initialCapacity];
} else {
throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity);
}
}
ArrayList的构造函数接受一个初始容量参数,用于创建一个具有指定容量的数组。
add方法
public boolean add(E e) {
modCount++;
ensureCapacityInternal(size + 1);
elementData[size++] = e;
return true;
}
add方法首先检查容量是否足够,如果不足够,则扩容。然后将元素添加到数组的末尾。
get方法
public E get(int index) {
rangeCheck(index);
return (E) elementData[index];
}
get方法根据索引获取元素,并返回。
remove方法
public E remove(int 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; // clear to let GC do its work
return oldValue;
}
remove方法根据索引删除元素,并返回被删除的元素。
LinkedList源码解析
LinkedList是List接口的一个双向链表实现。
构造函数
public LinkedList() {
header = (Node<E>)new Node<>(null, null, null);
header.next = header.previous = header;
}
LinkedList的构造函数创建了一个双向链表的头节点。
add方法
public boolean add(E e) {
linkLast(e);
return true;
}
add方法将元素添加到链表的末尾。
get方法
public E get(int index) {
return node(index).item;
}
get方法根据索引获取元素。
remove方法
public E remove(int index) {
return node(index).item;
}
remove方法根据索引删除元素。
总结
通过解析List接口及其实现类的源码,我们可以深入理解Java集合框架的核心原理与实现。了解这些原理对于编写高效、可维护的Java代码具有重要意义。
