温馨提示:这篇文章已超过230天没有更新,请注意相关的内容是否还可用!
![java经典源码_代码示例 java经典源码_代码示例](https://www.guihejia.com/zb_users/upload/2023/11/202311251700872941389207.jpg)
1、Java经典源码中的一个示例是ArrayList类的源码。ArrayList是Java中常用的动态数组,它继承自AbstractList类,并实现了List接口。它的内部使用一个数组来存储元素,并且可以根据需要自动扩容。
下面是ArrayList类的部分源码示例:
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable {
// 默认初始容量
private static final int DEFAULT_CAPACITY = 10;
// 存储元素的数组
private transient Object[] elementData;
// 数组中实际存储的元素个数
private int size;
// 构造方法,初始化ArrayList
public ArrayList() {
this.elementData = new Object[DEFAULT_CAPACITY];
}
// 添加元素到ArrayList末尾
public boolean add(E e) {
ensureCapacityInternal(size + 1); // 检查是否需要扩容
elementData[size++] = e;
return true;
}
// 根据索引获取元素
public E get(int index) {
rangeCheck(index); // 检查索引是否越界
return elementData(index);
}
// 检查索引是否越界
private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException("Index: "+index+", Size: "+size);
}
// 扩容方法
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
// 真正的扩容方法
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
// 扩容具体实现
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
在上述代码中,ArrayList类使用了一个Object类型的数组elementData来存储元素。在构造方法中,初始化了一个默认容量为10的数组。当添加元素时,会先检查是否需要扩容,如果需要,则调用ensureCapacityInternal方法进行扩容。扩容方法中,会根据当前数组的长度计算出新的容量,并通过Arrays.copyOf方法将原数组的元素复制到新数组中。
ArrayList还提供了根据索引获取元素的get方法,并通过rangeCheck方法检查索引是否越界。这样,我们可以通过ArrayList类来实现动态数组的功能,方便地进行元素的添加、获取和扩容操作。