ArrayList动态扩容

1.JDK 1.6

 (1)默认的构造函数 初试化时的长度为10:

[cpp]  view plain  copy
  1. public ArrayList() {  
  2. this(10);  
  3. }  

带参数的构造函数, 初始化了一个长度为初始容量的数组

[java]  view plain  copy
  1. public ArrayList(int initialCapacity) {  
  2. super();  
  3.        if (initialCapacity < 0)  
  4.            throw new IllegalArgumentException("Illegal Capacity: "+  
  5.                                               initialCapacity);  
  6. this.elementData = new Object[initialCapacity];  
  7.    }  

(2)add方法:

[java]  view plain  copy
  1.  public boolean add(E e) {  
  2. ensureCapacity(size + 1);  // Increments modCount!!  
  3. elementData[size++] = e;  
  4. return true;  
  5. }  


(3)扩容方法:

[java]  view plain  copy
  1.  public void ensureCapacity(int minCapacity) {  
  2. modCount++;  
  3. int oldCapacity = elementData.length;  
  4. if (minCapacity > oldCapacity) {  
  5.     Object oldData[] = elementData;  
  6.     int newCapacity = (oldCapacity * 3)/2 + 1;  
  7.         if (newCapacity < minCapacity)  
  8.     newCapacity = minCapacity;  
  9.            // minCapacity is usually close to size, so this is a win:  
  10.            elementData = Arrays.copyOf(elementData, newCapacity);  
  11. }  
  12.    }  


此方法里,一旦发现容量不足,会自动扩充容量,新的大小是:
[java]  view plain  copy
  1. int newCapacity = (oldCapacity * 3)/2 + 1  

也就是原有容量的1.5倍+1。然后通过底层的复制方法将原有数据复制过来:

[java]  view plain  copy
  1. elementData = Arrays.copyOf(elementData, newCapacity);  

2.JDK1.7

 (1)默认的构造函数 初试化时的长度为10:

[cpp]  view plain  copy
  1. public ArrayList() {  
  2. this(10);  
  3. }  

带参数的构造函数, 初始化了一个长度为初始容量的数组

[java]  view plain  copy
  1. public ArrayList(int initialCapacity) {  
  2.         super();  
  3.         if (initialCapacity < 0)  
  4.             throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);  
  5.         this.elementData = new Object[initialCapacity];  
  6.     }  
(2)add方法:

[java]  view plain  copy
  1. public boolean add(E e) {  
  2.         ensureCapacityInternal(size + 1);  // Increments modCount!!  
  3.         elementData[size++] = e;  
  4.         return true;  
  5.  }  

(3)扩容方法:

[java]  view plain  copy
  1. private void ensureCapacityInternal(int minCapacity) {  
  2.         modCount++;  
  3.         // overflow-conscious code  
  4.         if (minCapacity - elementData.length > 0)  
  5.             grow(minCapacity);  
  6. }  

这是JDK1.7 ArrayList扩容的关键方法:

[java]  view plain  copy
  1. private void grow(int minCapacity) {  
  2.         // overflow-conscious code  
  3.         int oldCapacity = elementData.length;  
  4.         int newCapacity = oldCapacity + (oldCapacity >> 1);  
  5.         if (newCapacity - minCapacity < 0)  
  6.             newCapacity = minCapacity;  
  7.         if (newCapacity - MAX_ARRAY_SIZE > 0)  
  8.             newCapacity = hugeCapacity(minCapacity);  
  9.         // minCapacity is usually close to size, so this is a win:  
  10.         elementData = Arrays.copyOf(elementData, newCapacity);  
  11.     }  

此方法里,一旦发现容量不足,会自动扩充容量,新的大小是:
[java]  view plain  copy
  1. int newCapacity = oldCapacity + (oldCapacity >> 1);  

也就是原有容量加上自己除以2的值。然后通过底层的复制方法将原有数据复制过来:

[java]  view plain  copy
  1. elementData = Arrays.copyOf(elementData, newCapacity);  

综述所述,JDK1.6和JDK1.7的ArrayList在扩容方面是不同的,JDK1.7通过位移的方式,效率更高些。


原文:https://blog.csdn.net/liuzongxi/article/details/44756687

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值