Arraylist底层源码分析
时间: 2023-03-10 12:52:41 浏览: 115
Arraylist的底层源码是一个非常复杂的结构,它主要是由一组Object数组来实现的,并且它还使用一个计数器来跟踪元素的数量,以及一个可调节大小的容量来管理数组的大小。而且它在添加或删除元素时还会调整数组大小,以及当容量不足时会自动扩容。
相关问题
ArrayList扩容源码分析
ArrayList是Java中常用的动态数组实现,它可以根据需要动态地增加或缩小数组的大小。当ArrayList中的元素数量超过了初始容量时,ArrayList会自动扩容,以便能够存储更多的元素。下面我们来看一下ArrayList扩容的源码实现。
在ArrayList中,扩容是由ensureCapacity方法实现的。当元素数量超过了数组容量时,该方法会调用grow方法来扩容数组。
```
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(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);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
```
首先,ensureCapacityInternal方法会调用ensureExplicitCapacity方法,该方法会检查是否需要扩容,并在需要时调用grow方法。
grow方法会首先计算新的数组容量,它的计算方式是将原来的容量增加一半。然后,grow方法会检查新容量是否大于最大数组容量,如果是,则调用hugeCapacity方法来返回一个足够大的容量值。最后,grow方法会调用Arrays.copyOf方法来将原来的数组复制到新的数组中。
需要注意的是,在进行扩容操作时,ArrayList会创建一个新的数组,并将原来的元素复制到新的数组中。这个过程会占用一定的时间和空间,因此,在使用ArrayList时,应该尽量避免频繁地进行扩容操作,以提高性能。
ArrayList底层
ArrayList是基于数组实现的动态数组,其底层数据结构是一个Object类型的数组elementData,用于存储元素。
当我们向ArrayList中添加元素时,如果当前数组容量不够,就会自动扩容,扩容的方式是创建一个新的数组,并将原数组中的元素复制到新数组中,然后将新元素添加到新数组的末尾。
在Java 6及之前的版本中,ArrayList默认的初始容量是10,每次扩容都会增加当前容量的一半。而在Java 7及之后的版本中,ArrayList在第一次添加元素时会创建一个空的数组,初始容量为0,每次扩容都会增加当前容量的一半。
因此,ArrayList的底层实现主要依赖于数组的操作,包括数组的创建、访问、复制和扩容等。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![md](https://img-home.csdnimg.cn/images/20210720083646.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![whl](https://img-home.csdnimg.cn/images/20210720083646.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)