java.util系列源码解读之Vector

Vector是java中线程安全的list,每个公有方法均被synchronized修饰, 在多线程环境下推荐使用这个类来创建list.与Arraylist在一些区别是:
a. 容量会自动扩充和缩小
b. 容量扩充的大小通过构造方式传入或者默认的两倍

类定义

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

成员变量

修饰符 变量名 作用
protected int capacityIncrement 扩容大小
protected Object[] elementData 存储数据的数组对象
protected int elementCount list中存储数据的实际容量
protected transient int modCount 继承自AbstractList,记录elementCount变化的次数

构造方式

public Vector(int initialCapacity, int capacityIncrement)
创建一个容量大小为initialCapacity, 每次扩容增加capacityIncrement个位置的vector

public Vector(int initialCapacity)
创建一个容量大小为initialCapacity, 每次扩容到当前容量的两倍

public Vector()
创建一个容量大小为10, 每次扩容到当前容量的两倍

public Vector(Collection c)
从其他Collection创建vector

方法

public synchronized void setSize(int newSize)
设定当前vector的elementCount值, 如果newSize>elementCount,那么多余的位置用null填充,如果newSize

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 Enumeration elements()
返回这个vector数据结构的枚举类型表示

public Enumeration elements() {
    return new Enumeration() {
        int count = 0;

        public boolean hasMoreElements() {
            return count < elementCount;
        }

        public E nextElement() {
            // 这个方法的调用仍然会有多线程的问题, 多个线程遍历时,可能不会遍历到所有
            synchronized (Vector.this) {
                if (count < elementCount) {
                    return elementData(count++);
                }
            }
            throw new NoSuchElementException("Vector Enumeration");
        }
    };
}

public synchronized int indexOf(Object o, int index)
从索引index向后搜索o对象的索引位置, ArrayList中无此方法

public synchronized int lastIndexOf(Object o, int index)
从索引index向前搜索o的索引位置

public synchronized E elementAt(int index)
索引index处的对象,对应ArrayList中的get()方法

你可能感兴趣的:(java.util系列源码解读之Vector)