以下是Java ArrayList的简化版本源代码分析:
public class ArrayList<E> {
private static final int DEFAULT_CAPACITY = 10;
private Object[] elements;
private int size;
public ArrayList() {
this.elements = new Object[DEFAULT_CAPACITY];
this.size = 0;
}
public void add(E element) {
if (size == elements.length) {
increaseCapacity();
}
elements[size] = element;
size++;
}
public E get(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
}
return (E) elements[index];
}
public void remove(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
}
for (int i = index; i < size - 1; i++) {
elements[i] = elements[i + 1];
}
elements[size - 1] = null;
size--;
}
public int size() {
return size;
}
private void increaseCapacity() {
int newCapacity = elements.length * 2;
Object[] newElements = new Object[newCapacity];
for (int i = 0; i < size; i++) {
newElements[i] = elements[i];
}
elements = newElements;
}
}
以上代码是一个简化版本的ArrayList实现。它使用一个数组来存储元素,并根据需要动态调整数组的容量。下面是对代码的一些关键解释:
DEFAULT_CAPACITY
:默认初始容量为10。elements
:用于存储元素的数组。size
:ArrayList中当前存储的元素数量。ArrayList()
:构造函数,初始化数组和大小。add(E element)
:向ArrayList末尾添加元素。如果数组已满,调用increaseCapacity()
方法来增加容量。get(int index)
:获取指定索引处的元素。如果索引超出范围,抛出IndexOutOfBoundsException
异常。remove(int index)
:移除指定索引处的元素,并将后续元素向前移动一个位置。如果索引超出范围,抛出IndexOutOfBoundsException
异常。size()
:返回ArrayList中当前存储的元素数量。increaseCapacity()
:增加ArrayList的容量。创建一个新的更大的数组,将原有元素复制到新数组中。请注意,这只是一个简化版本的ArrayList实现,实际的Java ArrayList源代码要更为复杂,包含了更多功能和优化。此处的代码只是为了演示ArrayList的基本原理和核心操作。
好的,接下来我们继续分析Java ArrayList的源代码。
以下是Java ArrayList类中的一些其他方法:
public class ArrayList<E> {
// ...
public void clear() {
for (int i = 0; i < size; i++) {
elements[i] = null;
}
size = 0;
}
public boolean isEmpty() {
return size == 0;
}
public boolean contains(E element) {
return indexOf(element) >= 0;
}
public int indexOf(E element) {
if (element == null) {
for (int i = 0; i < size; i++) {
if (elements[i] == null) {
return i;
}
}
} else {
for (int i = 0; i < size; i++) {
if (element.equals(elements[i])) {
return i;
}
}
}
return -1;
}
public void set(int index, E element) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
}
elements[index] = element;
}
public void add(int index, E element) {
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
}
if (size == elements.length) {
increaseCapacity();
}
for (int i = size; i > index; i--) {
elements[i] = elements[i - 1];
}
elements[index] = element;
size++;
}
// ...
}
这些方法提供了ArrayList的一些常见功能:
clear()
:清空ArrayList中的所有元素,将数组中的元素全部置为null,并将大小设置为0。isEmpty()
:检查ArrayList是否为空,即大小是否为0。contains(E element)
:检查ArrayList是否包含指定元素。使用indexOf(element)
方法来查找元素的索引,如果索引大于等于0,则表示ArrayList包含该元素。indexOf(E element)
:查找指定元素在ArrayList中的索引。如果找到匹配的元素,则返回第一个匹配的索引;如果未找到匹配的元素,则返回-1。该方法使用equals()
方法来比较元素。set(int index, E element)
:将指定索引处的元素替换为新的元素。add(int index, E element)
:在指定索引处插入一个元素,并将原有元素及后续元素向后移动一个位置。如果索引超出范围,抛出IndexOutOfBoundsException
异常。如果数组已满,调用increaseCapacity()
方法来增加容量。这些方法进一步丰富了ArrayList的功能,使其可以进行元素查找、插入、替换等操作。
请注意,这里的源代码仍然是一个简化版本,实际的Java ArrayList源代码中还有更多的方法和实现细节。但是以上提供的代码足以理解ArrayList的基本实现和核心功能。
原文链接:codingdict.net