jdk源码之Vector

概要

  • 类继承关系
    java.lang.Object
    java.util.AbstractCollection
    java.util.AbstractList
    java.util.Vector

  • 定义

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

实现

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

  • 创建
    默认创建大小为10的Object数组,并将capacityIncrement设置为0。
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;
}
  • 添加元素 add(E)
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更为可控。

  • 删除 remove(Object)

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

  • 获取 get(int)

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

注:

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

你可能感兴趣的:(jdk源码之Vector)