美文网首页
jdk源码之Vector

jdk源码之Vector

作者: 薛晨 | 来源:发表于2016-09-09 12:36 被阅读24次

    概要

    public class Vector<E> extends AbstractList<E> implements List<E>, 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

          本文链接:https://www.haomeiwen.com/subject/gfmeettx.html