Java 数据结构 -- 09.Java 8 数据结构 Vector

本文主要分析了Java List接口实现类Vector,指出Vector与ArrayList的相似性,并强调了Vector的线程安全性,适合对Java集合框架感兴趣的读者阅读。
摘要由CSDN通过智能技术生成

前言

书接上文,上一篇对 ArrayList 进行了分析,本篇将继续对 List 数据结构的最终实现类 Vector 进行分析。

Vector

/**
Vector 类实现了一个可增长的 objects 数组。就像数组一样,它包含可以通过整形下标访问的内容。但是,一个 Vector 类型的对象在创建后可以通过添加或者删除元素来根据需要增加或者缩小(长度)。
  
  每个 Vector 对象试图通过维护一个 capacity(容量)和一个 capacityIncrement(容量增长因子)来优化存储管理。容量总是至少和 vector 的长度相同。它通常会更大一些因为当内容添加进 vector 时,vector 会根据容量增长因子来以组块的方式增加存储。一个应用可以可以在插入大量内容之前增加 vector 的容量,这减少了增长导致的重新分配(空间)的次数。
  
fail-fast
本类 iterator() 方法返回的迭代器和 listIterator() 方法返回的迭代器是 fail-fast 的:如果 vector 在创建 迭代器后的任何时间点被结构化的改动了,除了使用迭代器自己的 ListIterator#remove 或者 ListIterator#add 方法,迭代器将会抛出一个 ConcurrentModificationException。因此,对于表面上的同步更改操作,迭代器失败的快速和干净,而不是在未来的某个不确定的时间点冒险做一些不确定的行为。elements() 方法返回的 Enumeration 对象不是 fail-fast 的。

注意一个迭代器的 fail-fast 行为是不能保证的,通常来说,不可能对任何现有的非线程安全并行修改操作做任何硬性的保证。建立在性能最优的基础上,Fail-fast 迭代器会抛出一个 ConcurrentModificationException 异常。因此,,建立在这中异常上写出的程序的正确性将会是不健壮的:迭代器的 fail-fast 行为应当植被用于检查 bugs。

正如 Java 1.2 版本,这个类被转型为实现了链表接口,让它成为了 Java 数据结构框架中的医院。不像新的数据结构实现,Vector 是线程安全的。如果一个线程安全实现类不是必须的,推荐使用 ArrayList,而不是 Vector
**/
public class Vector<E>
    extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
    /**存储 vector 对象中的内容的数组缓冲。vector 的容量就是这个数组缓冲的长度,它至少和能容乃所有 vector 元素的大小一样大,这里和 ArrayList 的 elementData 是一样的**/
    protected Object[] elementData;

    /**vector 对象中存在的内容个数,从 elementData[0] 到 elementData[elementCount-1] 是实际的元素**/
    protected int elementCount;

    /**当 voctor 的长度大于它的容量时,它的容量大小将自动增加。如果容量的增加小于或等于 0,vector 的容量将会在每次增长的时候成倍增长**/
    protected int capacityIncrement;

    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    private static final long serialVersionUID = -2767605614048989439L;

    /**接收 initialCapacity(初始化容量)参数与 capacityIncrement(容量增长因子)参数,构造一个空的 Vector 对象**/
    public Vector(int initialCapacity, int capacityIncrement) {
        super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        this.elementData = new Object[initialCapacity]; //新建一个长度为初始化容量的 Object 数组,并赋值给 elementData
        this.capacityIncrement = capacityIncrement; //将容量增长因子参数赋值给 vector 的 capacityIncrement
    }

    /**接收一个 initialCapacity(初始化容量)参数,构造一个空的 Vector 对象**/
    public Vector(int initialCapacity) {
        this(initialCapacity, 0); //容量增长因子为 0
    }

    /**构造一个空 vector,它的内部数组长度为 10,并且它的标准增长因子为 0**/
    public Vector() {
        this(10);
    }

    /**接收一个组对象参数,构造一个 Vector 对象,元素顺序与参数的迭代器中的顺序相同**/
    public Vector(Collection<? extends E> c) {
        elementData = c.toArray(); //组对象转换为数组
        elementCount = elementData.length; //将数组长度赋值给 elementCount
        if (elementData.getClass() != Object[].class)
            elementData = Arrays.copyOf(elementData, elementCount, Object[].class);
    }

    /**拷贝当前 vector 对象中的内容到一个 Object 数组中,vector 中 k 位置对应的元素被拷贝到数组中的 k 位置**/
    public synchronized void copyInto(Object[] anArray) {
        System.arraycopy(elementData, 0, anArray, 0, elementCount);
    }

    /**修剪当前 vector 对象的容量。如果容量大于长度,那么通过用一个更小的,替换了的数组 elementData 数组,使得容量等于长度。一个应用可以用这种方式来减少一个 vector 对象在的存储空间**/
    public synchronized void trimToSize() {
        modCount++;
        int oldCapacity = elementData.length;
        if (elementCount < oldCapacity) {
            elementData = Arrays.copyOf(elementData, elementCount);
        }
    }

    /**接收一个 minCapacity 参数,增加这个 vector 对象的容量,如果有必要,保证它能存放至少与 minCapacity 大小相同的元素数量,注意这是一个线程安全的方法**/
    public synchronized void ensureCapacity(int minCapacity) { //synchronized
        if (minCapacity > 0) {
            modCount++;
            ensureCapacityHelper(minCapacity);
        }
    }

    /**这个方法实现了 ensureCapcity 方法的非线程安全语义。这个类中的线程安全方法调用这个这个方法来避免导致多余的串行化**/
    private void ensureCapacityHelper(int minCapacity) {
        //越界意识
        if (minCapacity - elementData.length > 0) //如果 minCapacity 大于数组长度
            grow(minCapacity); //扩容
    }

    /**可分配容量的最大值,参考 ArrayList**/
    private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

		/**扩容方法,参考 ArrayList**/
    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);
    }

		/**巨大容量方法,参考 ArrayList**/
    private static int hugeCapacity(int minCapacity) {
        if (minCapacity < 0) // overflow
            throw new OutOfMemoryError();
        return (minCapacity > MAX_ARRAY_SIZE) ?
            Integer.MAX_VALUE :
            MAX_ARRAY_SIZE;
    }

    /**为 vector 对象设置新的长度。如果新的长度大于现有长度,vector 在将现有长度后面的元素全部置为 null,如果新长度小于现有长度,所有新长度之后的元素将被丢弃**/
    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;
    }

    /**返回 vector 的现在容量,要注意的是这里和 ArrayList 不同,ArrayList 中没有返回容量的方法**/
    public synchronized int capacity() { //线程安全
        return elementData.length;
    }

    /**返回 vector 中的元素个数**/
    public synchronized int size() { //线程安全
        return elementCount;
    }

    /**判断 vector 是否没有元素了**/
    public synchronized boolean isEmpty() { //线程安全
        return elementCount == 0;
    }

    /**返回一个当前 vector 对象的枚举器。返回的 Enumeration 在这个对象中产生所有的元素。最显产生的元素在 index 为 0 的位置,然后是 index 为 1 的位置,依次重复**/
    public Enumeration<E> elements() {
        return new Enumeration<E>() { //返回一个实现了 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");
            }
        };
    }

    /**判断当前 vector 中是否存在与参数对象相等的元素,参考 ArrayList#contains**/
    public boolean contains(Object o) {
        return indexOf(o, 0) >= 0; //调用 indexOf 方法,这里比 ArrayList 中的方法多了一个参数
    }

    /**返回参数对象在 vector 中第一次出现的位置值,参考 ArrayList#indexOf**/
    public int indexOf(Object o) {
        return indexOf(o, 0); //调用 index 方法,这里比 ArrayList 中的方法多了一个参数
    }

    /**接收 Object 参数和 index 参数,返回判断结果,参数 index 允许循环比对从 index 位置开始递增,参考 ArrayList#indexOf**/
    public synchronized int indexOf(Object o, int index) { //线程安全
        if (o == null) {
            for (int i = index ; i < elementCount ; i++)
                if (elementData[i]==null)
                    return i;
        } else {
            for (int i = index ; i < elementCount ; i++)
                if (o.equals(elementData[i]))
                    return i;
        }
        return -1;
    }

    /**返回参数在 vector 中最后一次出现的位置值,参考 ArrayList#lastIndexOf**/
    public synchronized int lastIndexOf(Object o) { //线程安全
        return lastIndexOf(o, elementCount-1); //调用 lastIndex 方法,这里比 ArrayList 方法多了一个参数
    }

    /**接收 Object 参数和 index 参数,返回判断结果,参数 index 允许循环对比从 index 位置开始递减,参考 ArrayList#lastIndexOf**/
    public synchronized int lastIndexOf(Object o, int index) { //线程安全
        if (index >= elementCount)
            throw new IndexOutOfBoundsException(index + " >= "+ elementCount);

        if (o == null) {
            for (int i = index; i >= 0; i--)
                if (elementData[i]==null)
                    return i;
        } else {
            for (int i = index; i >= 0; i--)
                if (o.equals(elementData[i]))
                    return i;
        }
        return -1;
    }

    /**接收一个 index 参数,返回对应位置的元素,参考 ArrayList#get**/
    public synchronized E elementAt(int index) { //线程安全
        if (index >= elementCount) {
            throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount);
        }

        return elementData(index);
    }

    /**返回 vector 中第一个元素(位置值为 0 的元素),ArrayLis 中没有此类方法**/
    public synchronized E firstElement() { //线程安全
        if (elementCount == 0) {
            throw new NoSuchElementException();
        }
        return elementData(0);
    }

    /**返回 Vector 中的最后一个元素(位置值为元素个数 - 1 的元素),ArrayList 中没有此类方法**/
    public synchronized E lastElement() { //线程安全 
        if (elementCount == 0) {
            throw new NoSuchElementException();
        }
        return elementData(elementCount - 1);
    }

    /**在 index 参数的位置设置 obj 对象,丢弃前一个在这个位置的对象,参考 ArrayList#set**/
    public synchronized void setElementAt(E obj, int index) { //线程安全
        if (index >= elementCount) {
            throw new ArrayIndexOutOfBoundsException(index + " >= " +
                                                     elementCount);
        }
        elementData[index] = obj;
    }

    /**删除 index 参数对应位置的元素,所以位置值大于或等于 index 参数的元素的位置值 - 1。vector 的长度 - 1,参考 ArrayList#remove**/
    public synchronized void removeElementAt(int index) { //线程安全
        modCount++;
        if (index >= elementCount) {
            throw new ArrayIndexOutOfBoundsException(index + " >= " +
                                                     elementCount);
        }
        else if (index < 0) {
            throw new ArrayIndexOutOfBoundsException(index);
        }
        int j = elementCount - index - 1;
        if (j > 0) {
            System.arraycopy(elementData, index + 1, elementData, index, j);
        }
        elementCount--;
        elementData[elementCount] = null; //GC
    }

    /**将 index 参数的对应位置插入一个元素,所有位置值大于或等于 index 参数的元素的位置值 + 1,参考 ArrayList#add**/
    public synchronized void insertElementAt(E obj, int index) { //线程安全
        modCount++;
        if (index > elementCount) {
            throw new ArrayIndexOutOfBoundsException(index
                                                     + " > " + elementCount);
        }
        ensureCapacityHelper(elementCount + 1);
        System.arraycopy(elementData, index, elementData, index + 1, elementCount - index);
        elementData[index] = obj;
        elementCount++;
    }

    /**在当前 vecotr 对象的末尾添加 obj 参数,增加它的长度。如果长度大于容量,容量将被扩容,参考 ArrayList#add**/
    public synchronized void addElement(E obj) { //线程安全
        modCount++;
        ensureCapacityHelper(elementCount + 1);
        elementData[elementCount++] = obj;
    }

    /**删除当前 vector 对象中存在的与 obj 参数相同的第一个(最小位置值)的对象。如果对象呗找到,每个位置值大于或等于元素位置值的元素的位置值 - 1,参考 ArrayList#remove**/
    public synchronized boolean removeElement(Object obj) { //线程安全
        modCount++;
        int i = indexOf(obj);
        if (i >= 0) {
            removeElementAt(i);
            return true;
        }
        return false;
    }

    /**删除 vector 中的所有对象并且将它的长度置为 0,参考 ArrayList#removeAll**/
    public synchronized void removeAllElements() { //线程安全
        modCount++;
        for (int i = 0; i < elementCount; i++) //GC
            elementData[i] = null;

        elementCount = 0;
    }

    /**Vector 中 clone() 方法的重写,返回一个当前 vector 的浅拷贝。拷贝将包含一个指向被拷贝后的数组的引用,而不是一个原来数组的引用,参考 ArrayList#clone**/
    public synchronized Object clone() { //线程安全
        try {
            @SuppressWarnings("unchecked")
                Vector<E> v = (Vector<E>) super.clone();
            v.elementData = Arrays.copyOf(elementData, elementCount);
            v.modCount = 0;
            return v;
        } catch (CloneNotSupportedException e) {
            throw new InternalError(e);
        }
    }

    /**将 vector 对象转换为一个数组,其实就是返回一个与 vector 中的数组相同的数组,参考 ArrayList#toArray*/
    public synchronized Object[] toArray() { //线程安全
        return Arrays.copyOf(elementData, elementCount);
    }

    /**接收一个范型数组参数,返回对应范型的数组,参考 ArrayList#toArray**/
    @SuppressWarnings("unchecked")
    public synchronized <T> T[] toArray(T[] a) { //线程安全
        if (a.length < elementCount)
            return (T[]) Arrays.copyOf(elementData, elementCount, a.getClass());

        System.arraycopy(elementData, 0, a, 0, elementCount);

        if (a.length > elementCount)
            a[elementCount] = null;

        return a;
    }

    //下标随机访问操作

    /**供线程安全方法调用的内部方法**/
    @SuppressWarnings("unchecked")
    E elementData(int index) {
        return (E) elementData[index];
    }

    /**接收 index 参数,返回对应位置的元素,参考 ArrayList#get**/
    public synchronized E get(int index) { //线程安全
        if (index >= elementCount)
            throw new ArrayIndexOutOfBoundsException(index);

        return elementData(index);
    }

    /**接收 index 参数和 elememnt 参数,将对应位置的元素设值,参考 ArrayList#set**/
    public synchronized E set(int index, E element) { //线程安全
        if (index >= elementCount)
            throw new ArrayIndexOutOfBoundsException(index);

        E oldValue = elementData(index);
        elementData[index] = element;
        return oldValue;
    }

    /**接收一个 E 参数,加载当前 vector 的末尾**/
    public synchronized boolean add(E e) { //线程安全
        modCount++;
        ensureCapacityHelper(elementCount + 1);
        elementData[elementCount++] = e;
        return true;
    }

    /**接收一个 Object 参数,删除 vector 中第一个与相同的元素。如果 vector 不包含这种元素,则不做任何改变,参考 ArrayList#remove**/
    public boolean remove(Object o) {
        return removeElement(o);
    }

    /**在 vector 中 index 参数的对应位置添加元素,参考 ArrayList#add,从 Javadoc 可以判断出,JDK 的作者是先写了 Vector 的源码才写 ArrayList 的(笑**/
    public void add(int index, E element) {
        insertElementAt(element, index);
    }

    /**删除 vector 中的 index 参数位置的元素,参考 ArrayList#remove**/
    public synchronized E remove(int index) { //线程安全
        modCount++;
        if (index >= elementCount)
            throw new ArrayIndexOutOfBoundsException(index);
        E oldValue = elementData(index);

        int numMoved = elementCount - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--elementCount] = null; //GC

        return oldValue;
    }

    /**清空 vector 中的所有元素,参考 ArrayLsit#clear**/
    public void clear() {
        removeAllElements(); //调用 removeAllElements 方法,所以它也是线程安全的
    }

    //扩展操作

    /**调用父类方法判断 vector 是否包含容器参数中的所有元素,参考 AbstractList#containsAll**/
    public synchronized boolean containsAll(Collection<?> c) {
        return super.containsAll(c);
    }

    /**在 Vector 的末端添加容器参数,参考 ArrayList#addAll**/
    public synchronized boolean addAll(Collection<? extends E> c) { //线程安全
        modCount++;
        Object[] a = c.toArray();
        int numNew = a.length;
        ensureCapacityHelper(elementCount + numNew);
        System.arraycopy(a, 0, elementData, elementCount, numNew);
        elementCount += numNew;
        return numNew != 0;
    }

    /**调用父类方法从 vector 中移除容器参数中的所有元素,参考 AbstractList#removeAll**/
    public synchronized boolean removeAll(Collection<?> c) { //线程安全
        return super.removeAll(c);
    }

    /**调用父类方法保留 vector 中容器参数中的所有元素,参考 Abstract#retainAll**/
    public synchronized boolean retainAll(Collection<?> c) { //线程安全
        return super.retainAll(c);
    }

    /**在容器 index 参数位置添加容器参数中的所有元素,index 参数原来的元素与其后的元素后移,参考 ArrayList#addAll**/
    public synchronized boolean addAll(int index, Collection<? extends E> c) { //线程安全
        modCount++;
        if (index < 0 || index > elementCount)
            throw new ArrayIndexOutOfBoundsException(index);

        Object[] a = c.toArray();
        int numNew = a.length;
        ensureCapacityHelper(elementCount + numNew);

        int numMoved = elementCount - index;
        if (numMoved > 0)
            System.arraycopy(elementData, index, elementData, index + numNew,
                             numMoved);

        System.arraycopy(a, 0, elementData, index, numNew);
        elementCount += numNew;
        return numNew != 0;
    }

    /**Vector 对 equals 方法的重写,参考 AbstractList#equals**/
    public synchronized boolean equals(Object o) { //线程安全
        return super.equals(o);
    }

    /**Vector 对 hashCode 方法的重写,参考 AbstractList#hashCode**/
    public synchronized int hashCode() { //线程安全
        return super.hashCode();
    }

    /**Vector 对 toString 方法的重写,参考 AbstractCollection#toString**/
    public synchronized String toString() { //线程安全
        return super.toString();
    }

    /**使用线程安全的方式,返回 fromIndex(闭区间)到 index(开区间)中的所有元素,参考 AbstractList#subList*/
    public synchronized List<E> subList(int fromIndex, int toIndex) { //线程安全
        return Collections.synchronizedList(super.subList(fromIndex, toIndex),
                                            this);
    }

    /**删除 vector 中从 fromIndex(闭区间)到 index(开区间)中的所有元素,参考 ArrayList#removeRange**/
    protected synchronized void removeRange(int fromIndex, int toIndex) { //线程安全
        modCount++;
        int numMoved = elementCount - toIndex;
        System.arraycopy(elementData, toIndex, elementData, fromIndex,
                         numMoved);

        //GC
        int newElementCount = elementCount - (toIndex-fromIndex);
        while (elementCount != newElementCount)
            elementData[--elementCount] = null;
    }

    /**对于 Serializable 的读实现,这里的实现与 ArrayList#readObject 不同**/
    private void readObject(ObjectInputStream in)
            throws IOException, ClassNotFoundException {
        ObjectInputStream.GetField gfields = in.readFields();
        int count = gfields.get("elementCount", 0);
        Object[] data = (Object[])gfields.get("elementData", null);
        if (count < 0 || data == null || count > data.length) {
            throw new StreamCorruptedException("Inconsistent vector internals");
        }
        elementCount = count;
        elementData = data.clone(); //这里的数组被重写赋值为一个浅拷贝
    }

    /**对于 Serializable 的写实现,这里的实现与 ArrayLsit#writeObject 不同**/
    private void writeObject(java.io.ObjectOutputStream s)
            throws java.io.IOException {
        final java.io.ObjectOutputStream.PutField fields = s.putFields();
        final Object[] data;
        synchronized (this) {
            fields.put("capacityIncrement", capacityIncrement);
            fields.put("elementCount", elementCount);
            data = elementData.clone();
        }
        fields.put("elementData", data);
        s.writeFields();
    }

    /**接收一个 int 参数,返回 Vector 的 ListIterator,参考 ArrayList#listIterator**/
    public synchronized ListIterator<E> listIterator(int index) { //线程安全
        if (index < 0 || index > elementCount)
            throw new IndexOutOfBoundsException("Index: "+index);
        return new ListItr(index);
    }

    /**返回 Vector 的 ListIterator,参考 ArrayList#listIterator**/
    public synchronized ListIterator<E> listIterator() { //线程安全
        return new ListItr(0);
    }

    /**返回一个包含所有正确顺序的元素的 iterator,参考 ArrayList#iterator**/
    public synchronized Iterator<E> iterator() { //线程安全
        return new Itr();
    }

    /**对于 AbstractList.Itr 的优化版本,这里可以参照 ArrayList 中的 Itr,大部分都是相同的,不同的是在对 vector 对象进行变更前,会先对 Vector 类上锁**/
    private class Itr implements Iterator<E> {
        int cursor;
        int lastRet = -1;
        int expectedModCount = modCount;

        public boolean hasNext() {
            return cursor != elementCount;
        }

        public E next() {
            synchronized (Vector.this) { //线程安全
                checkForComodification();
                int i = cursor;
                if (i >= elementCount)
                    throw new NoSuchElementException();
                cursor = i + 1;
                return elementData(lastRet = i);
            }
        }

        public void remove() {
            if (lastRet == -1)
                throw new IllegalStateException();
            synchronized (Vector.this) { //线程安全
                checkForComodification();
                Vector.this.remove(lastRet);
                expectedModCount = modCount;
            }
            cursor = lastRet;
            lastRet = -1;
        }

        @Override
        public void forEachRemaining(Consumer<? super E> action) {
            Objects.requireNonNull(action);
            synchronized (Vector.this) { //线程安全
                final int size = elementCount;
                int i = cursor;
                if (i >= size) {
                    return;
                }
        @SuppressWarnings("unchecked")
                final E[] elementData = (E[]) Vector.this.elementData;
                if (i >= elementData.length) {
                    throw new ConcurrentModificationException();
                }
                while (i != size && modCount == expectedModCount) {
                    action.accept(elementData[i++]);
                }
                cursor = i;
                lastRet = i - 1;
                checkForComodification();
            }
        }

        final void checkForComodification() {
            if (modCount != expectedModCount)
                throw new ConcurrentModificationException();
        }
    }

    /**对于 AbstractList.ListItr 的优化版本,这里可以参照 ArrayList 中的 ListItr,大部分都是相同的,不同的是在对 vector 对象进行变更前,会先对 Vector 类上锁**/
    final class ListItr extends Itr implements ListIterator<E> {
        ListItr(int index) {
            super();
            cursor = index;
        }

        public boolean hasPrevious() {
            return cursor != 0;
        }

        public int nextIndex() {
            return cursor;
        }

        public int previousIndex() {
            return cursor - 1;
        }

        public E previous() {
            synchronized (Vector.this) {
                checkForComodification();
                int i = cursor - 1;
                if (i < 0)
                    throw new NoSuchElementException();
                cursor = i;
                return elementData(lastRet = i);
            }
        }

        public void set(E e) {
            if (lastRet == -1)
                throw new IllegalStateException();
            synchronized (Vector.this) {
                checkForComodification();
                Vector.this.set(lastRet, e);
            }
        }

        public void add(E e) {
            int i = cursor;
            synchronized (Vector.this) {
                checkForComodification();
                Vector.this.add(i, e);
                expectedModCount = modCount;
            }
            cursor = i + 1;
            lastRet = -1;
        }
    }

		/**重写 Iterable 的 forEach 方法,参考 ArrayList#forEach 方法,完全相同**/
    @Override
    public synchronized void forEach(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        final int expectedModCount = modCount;
        @SuppressWarnings("unchecked")
        final E[] elementData = (E[]) this.elementData;
        final int elementCount = this.elementCount;
        for (int i=0; modCount == expectedModCount && i < elementCount; i++) {
            action.accept(elementData[i]);
        }
        if (modCount != expectedModCount) {
            throw new ConcurrentModificationException();
        }
    }

		/**Collection 中 removeIf 方法实现,参考 ArrayList#removeIf,完全相同**/
    @Override
    @SuppressWarnings("unchecked")
    public synchronized boolean removeIf(Predicate<? super E> filter) {
        Objects.requireNonNull(filter);
        // figure out which elements are to be removed
        // any exception thrown from the filter predicate at this stage
        // will leave the collection unmodified
        int removeCount = 0;
        final int size = elementCount;
        final BitSet removeSet = new BitSet(size);
        final int expectedModCount = modCount;
        for (int i=0; modCount == expectedModCount && i < size; i++) {
            @SuppressWarnings("unchecked")
            final E element = (E) elementData[i];
            if (filter.test(element)) {
                removeSet.set(i);
                removeCount++;
            }
        }
        if (modCount != expectedModCount) {
            throw new ConcurrentModificationException();
        }

        // shift surviving elements left over the spaces left by removed elements
        final boolean anyToRemove = removeCount > 0;
        if (anyToRemove) {
            final int newSize = size - removeCount;
            for (int i=0, j=0; (i < size) && (j < newSize); i++, j++) {
                i = removeSet.nextClearBit(i);
                elementData[j] = elementData[i];
            }
            for (int k=newSize; k < size; k++) {
                elementData[k] = null;  // Let gc do its work
            }
            elementCount = newSize;
            if (modCount != expectedModCount) {
                throw new ConcurrentModificationException();
            }
            modCount++;
        }

        return anyToRemove;
    }

		/**replaceAll 方法实现,参考 ArrayList#replaceAll,完全相同**/
    @Override
    @SuppressWarnings("unchecked")
    public synchronized void replaceAll(UnaryOperator<E> operator) {
        Objects.requireNonNull(operator);
        final int expectedModCount = modCount;
        final int size = elementCount;
        for (int i=0; modCount == expectedModCount && i < size; i++) {
            elementData[i] = operator.apply((E) elementData[i]);
        }
        if (modCount != expectedModCount) {
            throw new ConcurrentModificationException();
        }
        modCount++;
    }

		/**参考 ArrayList#sort 方法,完全相同**/
    @SuppressWarnings("unchecked")
    @Override
    public synchronized void sort(Comparator<? super E> c) {
        final int expectedModCount = modCount;
        Arrays.sort((E[]) elementData, 0, elementCount, c);
        if (modCount != expectedModCount) {
            throw new ConcurrentModificationException();
        }
        modCount++;
    }

    /**返回 Vector 的一个并行迭代器**/
    @Override
    public Spliterator<E> spliterator() {
        return new VectorSpliterator<>(this, null, 0, -1, 0);
    }

    /**Vector 类的并行迭代器,与 ArrayList 的并行迭代器类似*/
    static final class VectorSpliterator<E> implements Spliterator<E> {
        private final Vector<E> list;
        private Object[] array; //比 ArrayList 并行迭代器多维护一个数组
        private int index;
        private int fence;
        private int expectedModCount;

        /**使用参数构造一个 VectorSpliterator**/
        VectorSpliterator(Vector<E> list, Object[] array, int origin, int fence,
                          int expectedModCount) {
            this.list = list;
            this.array = array;
            this.index = origin;
            this.fence = fence;
            this.expectedModCount = expectedModCount;
        }

        private int getFence() {
            int hi;
            if ((hi = fence) < 0) {
                synchronized(list) { //线程安全
                    array = list.elementData;
                    expectedModCount = list.modCount;
                    hi = fence = list.elementCount;
                }
            }
            return hi;
        }

        public Spliterator<E> trySplit() {
            int hi = getFence(), lo = index, mid = (lo + hi) >>> 1;
            return (lo >= mid) ? null :
                new VectorSpliterator<E>(list, array, lo, index = mid,
                                         expectedModCount);
        }

        @SuppressWarnings("unchecked")
        public boolean tryAdvance(Consumer<? super E> action) {
            int i;
            if (action == null)
                throw new NullPointerException();
            if (getFence() > (i = index)) { //ArrayListSpliterator 对应方法的优化版本
                index = i + 1;
                action.accept((E)array[i]);
                if (list.modCount != expectedModCount)
                    throw new ConcurrentModificationException();
                return true;
            }
            return false;
        }

        @SuppressWarnings("unchecked")
        public void forEachRemaining(Consumer<? super E> action) {
            int i, hi;
            Vector<E> lst; Object[] a;
            if (action == null)
                throw new NullPointerException();
            if ((lst = list) != null) {
                if ((hi = fence) < 0) {
                    synchronized(lst) { //线程安全
                        expectedModCount = lst.modCount;
                        a = array = lst.elementData;
                        hi = fence = lst.elementCount;
                    }
                }
                else
                    a = array;
                if (a != null && (i = index) >= 0 && (index = hi) <= a.length) {
                    while (i < hi)
                        action.accept((E) a[i++]);
                    if (lst.modCount == expectedModCount)
                        return;
                }
            }
            throw new ConcurrentModificationException();
        }

        public long estimateSize() {
            return (long) (getFence() - index);
        }

        public int characteristics() {
            return Spliterator.ORDERED | Spliterator.SIZED | Spliterator.SUBSIZED;
        }
    }
}

通过 Vector 的源码可以看到,它的大部分实现是与 ArrayList 相同的,由于在上一篇中已经对 ArrayList 做了详细的分析,所以本篇的注释较少。不同的是 Vector 中大部分的操作都是线程安全的。

下一篇将对 LinkedList 进行分析。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值