ArrayList和Vector区别以及其扩容机制,arraylistvector
分享于 点击 5488 次 点评:210
ArrayList和Vector区别以及其扩容机制,arraylistvector
ArrayList和Vector区别以及其扩容机制相同点:
1、ArrayList和Vector都是继承了相同的父类和实现了相同的接口
(extends AbstractList implements List, Cloneable, Serializable, RandomAccess)
2、底层都是数组(Object[])实现的
3、初始默认长度都为10。
不同点:
1、同步性(Synchronization):
Vector中的public方法多数添加了synchronized关键字、以确保方法同步、也即是Vector线程安全、ArrayList线程不安全。
2、扩容(Resize):
ArrayList以1.5倍的方式在扩容、Vector 当扩容容量增量大于0时、新数组长度为原数组长度+扩容容量增量、否则新数组长度为原数组长度的2倍。
3、性能(Performance):
由于第一点的原因、在性能方便通常情况下ArrayList的性能更好、而Vector存在synchronized 的锁等待情况、需要等待释放锁这个过程、所以性能相对较差。
4、快速失败(fail-fast):
什么是fail-fast:参见另一边博文: // TODO
Vector 的 elements 方法返回的 Enumeration 不是 快速失败(fail-fast)的。而ArrayList是快速失败(fail-fast)
其底层的扩容方法grow()
ArrayList的扩容方法:
// jdk1.7.0_79
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
在满足扩容条件时、ArrayList以1.5倍的方式在扩容(oldCapacity
>> 1 结果为二分之一的oldCapacity)。Vector的扩容方法:
// jdk1.7.0_79
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
capacityIncrement : oldCapacity);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
Vector当扩容容量增量大于0时、新数组长度为原数组长度+扩容容量增量、否则新数组长度为原数组长度的2倍。之后讲新数组长度:newCapacity与所需的最小容量:minCapacity进行比较、较大者作为最终的新长度。
相关文章
- 暂无相关文章
用户点评