Vector

Vector源码分析

public class Vector<E>
    extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
        // 底层数组
        protected Object[] elementData;
        // 相当于ArrayList的size属性
        protected int elementCount;
        // 容量扩展增量
        protected int capacityIncrement;
        
        private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;    
        
        public synchronized int size() {
            return elementCount;
        }        
        
        public Vector() {
            // 默认的容量大小是10
            this(10);
        }
        
        public Vector(int initialCapacity) {
            // 默认的容量增量是0
            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;
        }
            
        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 boolean add(E e) {
            modCount++;
            // /ɪn'ʃʊə/ 确保 /kəˈpæsəti/ 容量
            ensureCapacityHelper(elementCount + 1);
            // 把新元素添加到了末尾
            elementData[elementCount++] = e;
            return true;
        }
        
        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;
        }
        
        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)
                // 适用于addAll()方法
                newCapacity = minCapacity;
            if (newCapacity - MAX_ARRAY_SIZE > 0)
                /* private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;    
                 * 扩展至Integer的最大值
                 */
                newCapacity = hugeCapacity(minCapacity);
            elementData = Arrays.copyOf(elementData, newCapacity);
        }
        
        private static int hugeCapacity(int minCapacity) {
            if (minCapacity < 0) // overflow
                throw new OutOfMemoryError();
            return (minCapacity > MAX_ARRAY_SIZE) ?
                Integer.MAX_VALUE :
                MAX_ARRAY_SIZE;
        }        
}
View Code
原文地址:https://www.cnblogs.com/Mike_Chang/p/10442861.html