zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    iOS 添加微信分享
    IOS学习笔记——ViewController生命周期详解
    UI之CALayer详解(转)
    iOS CALayer讲解
    [leetcode] Minimum Path Sum
    [leetcode]Binary Tree Maximum Path Sum
    我是真的想去google啊
    C++ string 用法详解
    继续存博客
    bash中 2>&1 & 的解释
  • 原文地址:https://www.cnblogs.com/Mike_Chang/p/10442861.html
Copyright © 2011-2022 走看看