ArrayList 是怎么扩容的
时间: 2023-08-20 13:03:06 浏览: 47
ArrayList和LinkedList都是Java中的集合类,它们的主要区别在于底层数据结构不同。ArrayList是基于动态数组实现的,而LinkedList是基于双向链表实现的。
由于ArrayList底层是数组,所以它的随机访问速度比LinkedList快,但是在插入和删除元素时需要移动其他元素,所以效率较低。而LinkedList在插入和删除元素时只需要改变指针指向,所以效率较高,但是随机访问速度较慢。
因此,如果需要频繁进行插入和删除操作,建议使用LinkedList;如果需要频繁进行随机访问操作,建议使用ArrayList。
相关问题
arraylist的扩容
当ArrayList中的元素数量超过了当前数组的容量时,就需要对数组进行扩容。ArrayList的扩容机制是,如果当前数组的容量不足以容纳新的元素,就新建一个更大的数组,并将原数组中的所有元素复制到新数组中。新数组的大小通常是原数组的1.5倍。
例如,如果当前数组的容量是10,当前ArrayList中有9个元素,那么当我们再往ArrayList中添加第10个元素时,就需要扩容。此时,新数组的大小就是10*1.5=15。
在Java中,ArrayList是通过调用ensureCapacity()方法来实现扩容的。这个方法会检查当前数组的容量是否足够,如果不够就会新建一个更大的数组,并将原数组中的所有元素复制到新数组中。
这样做的好处是可以避免频繁地进行扩容,提高了ArrayList的效率。但是,如果预估ArrayList中元素的数量不准确,可能会导致浪费空间。因此,如果知道ArrayList中元素的数量,可以使用带参数的构造函数来指定数组的初始容量,以避免浪费空间。
arraylist如何扩容
ArrayList 是基于数组实现的动态数组,因此需要在元素数量增加时动态扩容。当 ArrayList 容量不足以存储新元素时,系统会自动为其分配更大的内存空间,然后将原数组中的元素复制到新数组中。
具体扩容的实现方式如下:
1. 首先,判断当前 ArrayList 容量是否足够存储新元素,如果不够,就需要扩容。
2. 计算新的容量大小,一般是原来的容量大小加上一个增量。增量的大小可以自定义,也可以使用默认值。
3. 创建一个新数组,将原数组中的元素复制到新数组中。
4. 使 ArrayList 的数组引用指向新数组。
5. 最后,将新元素添加到 ArrayList 中。
以下是 ArrayList 扩容的示例代码:
```
public void add(E e) {
// 判断容量是否足够,如果不够,就需要扩容
if (size == elementData.length) {
// 计算新的容量大小
int newCapacity = elementData.length + (elementData.length >> 1); // 新容量为原来的1.5倍
// 创建一个新数组,将原数组中的元素复制到新数组中
elementData = Arrays.copyOf(elementData, newCapacity);
}
// 添加新元素到 ArrayList 中
elementData[size++] = e;
}
```
需要注意的是,ArrayList 扩容的过程是相对耗时的,因此在实际使用中,应该尽可能减少扩容的次数,可以通过在创建 ArrayList 时指定初始容量来避免多次扩容。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_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)
![](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)
![](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)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)