ArrayList的自动扩充机制

用一道选择题作为本文的开始吧!
ArrayList list = new ArrayList(20);中的list扩充几次
A.0
B.1
C.2
D.3
答案:A

1、ArrayList的默认初始容量为10,当然也可以自定义指定初始容量,随着动态的向其中添加元素,其容量可能会动态的增加,那么扩容的公式为:
新容量 = 旧容量/2 + 旧容量
比如:初始容量为4,其容量的每次扩充后的新容量为:4->6->9->13->19->…
即每次扩充至原有基础的1.5倍

ArrayList的构造函数总共有三个:
(1)ArrayList()构造一个初始容量为 10 的空列表。
(2)ArrayList(Collection<? extends E> c)构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。
(3)ArrayList(int initialCapacity)构造一个具有指定初始容量的空列表。

调用的是第三个构造函数,直接初始化为大小为20的list,没有扩容,所以选择A
如果初始化为ArrayList(0),则会在新容量计算完毕后,增加至1;
另外与之类似的还有,

2、HashMap的初始大小为16,增长时,直接容量翻番,如源代码。

void addEntry(int hash, K key, V value, int bucketIndex) {  
       if ((size >= threshold) && (null != table[bucketIndex])) {  
           resize(2 * table.length);//原容量2倍  
           hash = (null != key) ? hash(key) : 0;  
           bucketIndex = indexFor(hash, table.length);  
       }  

       createEntry(hash, key, value, bucketIndex);  
}  

3、Vector的初始大小为10,如果没有指定每次增长的大小,则默认是翻倍增长。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ArrayList自动扩容机制是指,当数组不足以容纳元素时,自动扩容。其内部实现是在添加元素时判断数组容量是否足够,如果不够就创建一个原数组长度两倍的新数组,并将原数组中的元素复制到新数组中,然后把新元素添加到新数组中。 下面是ArrayList自动扩容机制的代码实现: ``` 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); } private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; private static int hugeCapacity(int minCapacity) {...} ``` 这段代码中,首先调用ensureCapacityInternal方法进行容量确认,然后如果需要扩容,会调用ensureExplicitCapacity方法进行扩容,这个方法又调用grow方法实现扩容。在grow方法内部,首先计算新容量,然后调用Arrays.copyOf方法将原数组复制到新数组中,完成扩容操作。 其中,MAX_ARRAY_SIZE是一个限制数组大小的常量,因为Java虚拟机规定数组的长度不能超过Integer.MAX_VALUE - 8,因此在扩容时需要考虑这个限制,避免出现数组长度溢出的情况。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值