Java中的ArrayList是一种动态数组数据结构,底层通过数组实现,其大小可以随时增加或缩小。ArrayList可以存储任何类型的数据,而不仅仅是对象。下面将介绍Java ArrayList的底层实现方法。
一、数据结构
ArrayList底层的数据结构是数组,其构造方法为:
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
其中elementData
是一个Object类型的数组,表示ArrayList中存储元素的数组,而DEFAULTCAPACITY_EMPTY_ELEMENTDATA
是一个空数组,初始大小为0.
在添加元素时,ArrayList首先检查elementData
数组是否为空,如果是,则重新创建一个大小为10的数组。
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
private static final int DEFAULT_CAPACITY = 10;
public boolean add(E e) {
ensureCapacityInternal(size + 1);
elementData[size++] = e;
return true;
}
private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
private void grow(int minCapacity) {
// overflow-conscious code
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会调用ensureCapacityInternal
方法来确保elementData
数组的容量足够,如果不够则调用grow
方法进行扩容。grow
方法会创建一个新的数组,并将旧数组中的元素复制到新数组中。
二、例子
添加元素
ArrayList<String> list = new ArrayList<>();
list.add("Hello");
list.add("World");
在这个例子中,我们创建了一个ArrayList对象,并向其中添加了两个元素。当添加第一个元素时,elementData
数组为空,ArrayList会创建一个大小为10的数组。当添加第二个元素时,elementData
数组大小为1,由于ArrayList底层实现为动态数组,因此会自动扩容为20,将旧数组中的元素复制到新数组中,并添加新的元素。
删除元素
list.remove(0);
在这个例子中,我们通过索引删除了ArrayList中的第一个元素。ArrayList删除元素会涉及到数组的移位操作,因此效率不如添加元素高。
三、总结
Java ArrayList底层实现方法是通过动态数组来实现的,其数据结构为数组,每次添加或删除元素时,ArrayList会检查elementData
数组容量是否足够,如果不够则扩容并复制旧数组中的元素到新数组中。由于ArrayList底层实现为数组,删除元素需要涉及到数组的移位操作,因此效率不高。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java ArrayList的底层实现方法 - Python技术站