上一篇文章介绍了ArrayList和LinkedList的区别。其中将ArrayList的add()方法中的扩容跳过。现在结合源码(给予jdk1.8)详细讲一下ArrayList的扩容机制
首先 ArrayList的默认长度应该大家都很了解是10
在调用有参的构造方法时也是可以指定初始长度
add()方法中其实有两个步骤我们主要看第一步其中就包括扩容的部分
ensureCpacityInternal(int size)这个方法中还是有两个步骤
elementData就是我们维护的数组对象 minCapacity就是我们传入的数组所需的最小长度
calculateCapacity这个方法中是得到数组的最小长度
Math.max就是得到两个参数中大的一个返回
我们再来看看得到List的长度之后的ensureExplicitCapacity操作
这里面第一步修改次数+1
第二步将数组所需最小长度和维护的数组长度进行比较如果最小长度大于已有长度则调用grow扩容方法
oldCapacity是已有数组长度
这里面首先先得到一个newCapacity通过 就数组长度+(旧长度/2) >>就是右移运算 num >> 1 = num/2
也就是newCapacity是旧长度的1.5倍拿出手中的笔划重点
情况一:将new长度和最小需要长度比较 如果new小则将min长度赋值给new 这个时候扩容长度不确定
情况二:将new长度和数组允许最大长度比较 如果超过则调用hugeCapacity 这个时候数组最大长度只能限制在Integer的最大值2的31次方减一
情况三:也就是一般情况 就是1.5倍扩容
最后一个步骤就是赋值数组了
综上得到:在正常情况下ArrayList的扩容机制是 在不设置初始长度时长度10当第11个元素要放入时数组会创建一个长度为旧长度1.5倍的数组然后将就数组数据复制过去
注:其实我们平时调用的size()是数组中元素的个数和长度的关系是小于等于
本人个人QQ/wechat : 806751350