ArrayList和Vector的扩容机制
2016-03-28 11:02
645 查看
ArrayList和Vector都是继承了相同的父类和实现了相同的接口。如下
两者之间我认为主要有两个却别。
1、Vector中的public方法都添加了synchronized关键字,以确保方法同步。
2、内部属性不同,这也是导致扩容方式不同的原因所在。
我现在来说第二条,
ArrayList有两个属性,存储数据的数组elementData,和存储记录数目的size。
Vector有三个属性,存储数据的数组elementData,存储记录数目的elementCount,还有扩展数组大小的扩展因子capacityIncrement。
先来看ArrayList的扩展方法
重构下看起来更方便
可以看到,再满足扩容条件时,扩展后数组大小为((原数组长度*3)/2+1)与传递参数中较大者
再看看Vector的扩容方法
可以看到,相对于ArrayList的扩容方法,这个方法被一分为2,老实说我更喜欢这样,方法的职责更加明确。
int newCapacity = (capacityIncrement > 0) ?(oldCapacity + capacityIncrement) : (oldCapacity * 2);
当扩容因子大于0时,新数组长度为原数组长度+扩容因子,否子新数组长度为原数组长度的2倍。
if (newCapacity < minCapacity) {newCapacity = minCapacity;}
将上面生成的新数组长度与传递的参数要求长度作比较,较大者为最终的新长度。
public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable {} public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable {}
两者之间我认为主要有两个却别。
1、Vector中的public方法都添加了synchronized关键字,以确保方法同步。
2、内部属性不同,这也是导致扩容方式不同的原因所在。
我现在来说第二条,
ArrayList有两个属性,存储数据的数组elementData,和存储记录数目的size。
Vector有三个属性,存储数据的数组elementData,存储记录数目的elementCount,还有扩展数组大小的扩展因子capacityIncrement。
先来看ArrayList的扩展方法
public void ensureCapacity(int minCapacity) { modCount++;//父类中的属性,记录集合变化次数 int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { Object oldData[] = elementData; int newCapacity = (oldCapacity * 3)/2 + 1; if (newCapacity < minCapacity) newCapacity = minCapacity; elementData = (E[])new Object[newCapacity]; System.arraycopy(oldData, 0, elementData, 0, size); } }
重构下看起来更方便
public void ensureCapacity(int minCapacity) { modCount++;//父类中的属性,记录集合变化次数 int oldCapacity = elementData.length; if (minCapacity > oldCapacity) {//扩容的条件,数组需要的长度要大于实际长度 Object oldData[] = elementData; int newCapacity = ((oldCapacity * 3)/2 + 1)<minCapacity?minCapacity: ((oldCapacity * 3)/2 + 1); elementData = (E[])new Object[newCapacity]; System.arraycopy(oldData, 0, elementData, 0, size); } }
可以看到,再满足扩容条件时,扩展后数组大小为((原数组长度*3)/2+1)与传递参数中较大者
再看看Vector的扩容方法
public synchronized void ensureCapacity(int minCapacity) { modCount++;//父类中的属性,记录集合变化次数 ensureCapacityHelper(minCapacity); } private void ensureCapacityHelper(int minCapacity) { int oldCapacity = elementData.length; if (minCapacity > oldCapacity) {//扩容的条件,数组需要的长度要大于实际长度 Object[] oldData = elementData; int newCapacity = (capacityIncrement > 0) ? (oldCapacity + capacityIncrement) : (oldCapacity * 2); if (newCapacity < minCapacity) { newCapacity = minCapacity; } elementData = new Object[newCapacity]; System.arraycopy(oldData, 0, elementData, 0, elementCount); } }
可以看到,相对于ArrayList的扩容方法,这个方法被一分为2,老实说我更喜欢这样,方法的职责更加明确。
int newCapacity = (capacityIncrement > 0) ?(oldCapacity + capacityIncrement) : (oldCapacity * 2);
当扩容因子大于0时,新数组长度为原数组长度+扩容因子,否子新数组长度为原数组长度的2倍。
if (newCapacity < minCapacity) {newCapacity = minCapacity;}
将上面生成的新数组长度与传递的参数要求长度作比较,较大者为最终的新长度。
相关文章推荐
- SyntaxError: 'break' outside loop
- Yii2.0框架基础--布局
- Yii2.0框架基础--修改控制器ID指向控制器类
- 【转载】原来,开发者都喜欢看这些......
- C#图像处理(各种旋转、改变大小、柔化、锐化、雾化、底片、浮雕、黑白、滤镜效果)
- 互联网金融系列-支付清算体系例子-下
- iOS开发--传感器
- 安卓原生操作数据库时,使用ContentValues类
- Js使用word书签填充内容
- z-index使用以及失效的处理方法
- LeetCode-Range Sum Query - Mutable
- java研发常见问题总结2
- collection系列用法-namedtuple()
- 初涉RxAndroid结合Glide实现多图片加载操作
- Yii2.0框架基础--别名(Aliases)
- 看图识“字”(9)-重要的数据要强调
- 【Android和Unity交互】Android SDK下载速度慢无法更新?使用国内镜像站加速!
- 磁盘调度算法
- 初涉RxAndroid结合Glide实现多图片加载操作
- 设计模式(十)组合模式(Composite Pattern)