ArrayList

ArrayList是.Net Framework提供的用于数据存储和检索的专用类,它是命名空间System.Collections下的一部分。它的大小是按照其中存储的数据来动态扩充与收缩的。所以,我们在声明ArrayList对象时并不需要指定它的长度。ArrayList继承了IList接口,所以它可以很方便的进行数据的添加。

以无参数构造方法创建 ArrayList 时,实际上初始化赋值的是一个空数组。当真正对数组进行添加元素操作时,才真正分配容量。即向数组中添加第一个元素时,数组容量扩为10。

扩容机制
  1. add()方法

    public boolean add(E e) {
            ensureCapacityInternal(size + 1); 
            elementData[size++] = e;
            return true;
        }
    
  2. ensureCapacityInternal()方法

    private void ensureCapacityInternal(int minCapacity) {
            if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {//获取默认的容量和传入的参数的较大值
                //当add第一个元素时,minCapacity为1,执行Math.max()之后取最大值10;
                minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
            }
    
            ensureExplicitCapacity(minCapacity);
        }
    
  3. ensureExplicitCapacity()方法

    private void ensureExplicitCapacity(int minCapacity) {
            modCount++;
    
            // overflow-conscious code
            if (minCapacity - elementData.length > 0)
                grow(minCapacity);
        }
    //add第一个元素时,elemtntData.length为0,此时minCapacity为10,执行grow()方法。
    //当第二次进入的时候,minCapacity为2,elementData.length为10所以不会执行grow()方法,直到添加到第11个元素,才执行扩容
    
  4. grow()方法。

    private void grow(int minCapacity) {
        //扩容数组,oldCapacity为旧容量,newCapacity为新容量
            int oldCapacity = elementData.length;
        //将oldCapacity 右移一位相当于oldCapacity /2,newCapacity的值为旧的1.5倍
            int newCapacity = oldCapacity + (oldCapacity >> 1);
            if (newCapacity - minCapacity < 0)
                newCapacity = minCapacity;
            if (newCapacity - MAX_ARRAY_SIZE > 0)
                //newCapacity大于最大容量,则执行hugeCapacity()比较minCapacity与MAX_ARRAY_SIZE
                newCapacity = hugeCapacity(minCapacity);
            // minCapacity is usually close to size, so this is a win:
            elementData = Arrays.copyOf(elementData, newCapacity);
        }
    
posted @ 2021-03-17 13:15  萝卜i  阅读(25)  评论(0编辑  收藏  举报