jdk源码之Vector

2016-09-09  本文已影响24人  薛晨

概要

public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{
}

实现

Vector是从JDK1.2就已提供的List实现,与ArrayList一样,也是基于Object数组的方式来实现的。

public Vector() {    this(10);}

public Vector(int initialCapacity) {    this(initialCapacity, 0);}

public Vector(int initialCapacity, int capacityIncrement) {    
  super();    
  if (initialCapacity < 0)        
    throw new IllegalArgumentException("Illegal Capacity: "+                                           initialCapacity);    
  this.elementData = new Object[initialCapacity];    
  this.capacityIncrement = capacityIncrement;
}
public synchronized boolean add(E e) {    
  modCount++;    
  ensureCapacityHelper(elementCount + 1);    
  elementData[elementCount++] = e;    
  return true;
}

add方法加了synchronized关键字,因此,此方法是线程安全的。

private void ensureCapacityHelper(int minCapacity) {    
  // overflow-conscious code    
  if (minCapacity - elementData.length > 0)        
    grow(minCapacity);
}

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扩大数组的方式与ArrayList不同,若capacityIncrement > 0, 则数组大小扩大为现有size加上capacityIncrement,若capacityIncrement < 0, 则扩大为现有size的两倍。这种容量控制策略比ArrayList更为可控。

除其调用的removeElement方法上有synchronized关键字外,和ArrayList完全相同。

除该方法上有synchronized关键字外,和ArrayList完全相同。

注:

  1. Vector 是基于 Synchronized 实现的线程安全的 ArrayList, 但在插入元素时容量扩充与ArrayList不同,可通过传入capacityIncrement来控制容量的扩充。
上一篇 下一篇

猜你喜欢

热点阅读