您的位置:首页 > 其它

ArrayList的动态扩容机制

2018-01-31 12:01 253 查看


要明确一点:arrayllist不能指定扩容因子。按照规定的1.5倍进行扩容

  一般问的时候应该是用jdk1.6回答;jdk1.7之后也要知道;




ArrayList动态扩容机制

初始化:有三种方式


默认的构造器,将会以默认的大小来初始化内部的数组:
public ArrayList();


用一个ICollection对象来构造,并将该集合的元素添加到ArrayList:
  public ArrayList(Collection<?
extends E> c)


用指定的大小来初始化内部的数组:
 public ArrayList(int
initialCapacity) 


  

这里我们来重点关注一下无参数构造器的实现过程:

通过代码可是它的初始容量为0。而在之前JDK1,6中,初始容量为10。 


  发生扩容的条件:

根据传入的最小需要容量minCapacity来和数组的容量长度对比,若minCapactity大于或等于数组容量,则需要进行扩容。(
如果实际存储数组是空数组,则最小需要容量就是默认容量)

实现扩容:
jdk7中采用
>>位运算,右移动一位。 容量相当于扩大了1.5倍;
[/code]

举例说明:添加20个元素到ArrayList中 

当第一次插入元素时才分配10(默认)个对象空间。之后扩容会按照1.5倍增长。

也就是当添加第11个数据的时候,Arraylist继续扩容变为10*1.5=15;

当添加第16个数据时,继续扩容变为15 * 1.5 =22个;
总结:
在JDK1.7中,如果通过无参构造的话,初始数组容量为0,当真正对数组进行添加时,才真正分配容量。
每次按照1.5倍(位运算)的比率通过copeOf的方式扩容。
在JKD1.6中,如果通过无参构造的话,初始数组容量为10.每次通过copeOf的方式扩容后容量为原来的1.5倍加1.以上就是动态扩容的原理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  集合