java编程

ArrayList的自动扩展算法分析

字号+ 作者:风潇潇 来源:原创 2017-03-31 12:58 我要评论( )

添加数组的方法。 /** * 添加数组的方法,传入元素e */ public boolean add(E e) { //当前数组必须有size+1的大小,因为前面(size-1)位置都已经被沾满了,所以必须保证当前还有一个位置存传入的元素 ensureCapacityInternal(size + 1); // Increments modC

添加数组的方法。
     /**
     * 添加数组的方法,传入元素e
     */
    public boolean add(E e) {
       //当前数组必须有size+1的大小,因为前面(size-1)位置都已经被沾满了,所以必须保证当前还有一个位置存传入的元素
        ensureCapacityInternal(size + 1);  // Increments modCount!!
     //将当前size位置 存入e
        elementData[size++] = e;
        return true;
    }


//扩展数组大小的方法
private void ensureCapacityInternal(int minCapacity) {
//如果当前数组是空的。
        if (elementData == EMPTY_ELEMENTDATA) {
//所需要的空间是默认或者所需最小空间大小的  最大值
            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
        }

        ensureExplicitCapacity(minCapacity);
    }


========================================分割线=========================
//扩展空间
 private void ensureExplicitCapacity(int minCapacity) {
        modCount++;
//如果所需要的空间不足,
        if (minCapacity - elementData.length > 0)
//扩展空间
            grow(minCapacity);
    }

=======================================分割线===========================
//这个是真正的扩展数组空间的方法,   minCapacity 最小的大小
private void grow(int minCapacity) {
       //老的数组大小
        int oldCapacity = elementData.length;
        //计划扩展的大小,这是扩展老空间的一半。确切的说是在原来基础上再加原来的的一半再多一个。
         int newCapacity = oldCapacity + (oldCapacity >> 1);
      //如果计划扩展还是不能满足,就用当前传入所需的值
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
      //如果当前所需空间大小超出arraylist可扩展的最大值,就用最大值
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
      //赋值老的元素到新的数组里取
        elementData = Arrays.copyOf(elementData, newCapacity);
    }



转载请注明出处。

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
网友点评
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)