JDK Vector源码学习

本文详细解析了Java中的Vector类,介绍了其线程安全特性及与ArrayList的主要区别。通过四个构造函数说明了Vector如何初始化,并深入探讨了ensureCapacity和setSize等方法的工作原理。
public class Vector<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable

 

里面的方法 多为 synchronized  的因此Vector是线程安全的

 

Vector里面的好多api和 ArrayList是相似的

区别是线程安全与否 与  动态增长的时候的增长速率不同   动态增长会申请大的空间然后调用Arrays.copyOf()复制过去  这里又调用了System.arrayCopy() 这个是个native 方法

 

 

 

4个构造函数

 

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;
}


    protected int capacityIncrement; //与自动增长有关的一个量

 

public Vector(Collection<? extends E> c) {
     elementData = c.toArray();
     elementCount = elementData.length;
     // c.toArray might (incorrectly) not return Object[] (see 6260652)
     if (elementData.getClass() != Object[].class)
         elementData = Arrays.copyOf(elementData, elementCount, Object[].class);
}

 

与自动增长有关的方法

public synchronized void ensureCapacity(int minCapacity) {
     modCount++;
     ensureCapacityHelper(minCapacity);
}

 

private void ensureCapacityHelper(int minCapacity) {
 int oldCapacity = elementData.length;
 if (minCapacity > oldCapacity) {
     Object[] oldData = elementData;
     int newCapacity = (capacityIncrement > 0) ?            // vector 中的 capacityIncrement若是被设定了 就增长这么多
  (oldCapacity + capacityIncrement) : (oldCapacity * 2);   若是没有就增长2倍
         if (newCapacity < minCapacity) {
          newCapacity = minCapacity;
     }
            elementData = Arrays.copyOf(elementData, newCapacity);
   }
}

 

public synchronized void setSize(int newSize) {// 可能扩充 可能裁剪
    modCount++;
    if (newSize > elementCount) {
        ensureCapacityHelper(newSize);
    } else {
        for (int i = newSize ; i < elementCount ; i++) {
          elementData[i] = null;
       }
   }
   elementCount = newSize;

}

 

public synchronized boolean add(E e) {
    modCount++;
    ensureCapacityHelper(elementCount + 1);
    elementData[elementCount++] = e;
    return true;
}

public synchronized int capacity() {   //返回可容纳的容量
 return elementData.length;
}

 

public synchronized int size() {  // 返回现有元素个数
 return elementCount;
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值