ArrayList和Vector区别以及其扩容机制

来源:互联网 发布:淘宝被扣48分怎么解封 编辑:程序博客网 时间:2024/05/21 07:50
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_79private 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);}
在满足扩容条件时、ArrayList1.5倍的方式在扩容(oldCapacity >> 1 结果为二分之一的oldCapacity)。

Vector的扩容方法:

// jdk1.7.0_79private 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进行比较、较大者作为最终的新长度。









Flag Counter

0 0
原创粉丝点击