编程语言
首页 > 编程语言> > ArrayList源码分析

ArrayList源码分析

作者:互联网

ArrayList源码分析

一只java小白

最近学到集合,于是想分析一下ArrayList的源码。

 public boolean add(E e) {
     modCount++;
     //参数解释:
     //    e:形参,elementData:存放的数据,size:此时存放多个数据(默认是0)
     
     add(e, elementData, size);
     return true;
 }
//继续跟踪,发现是在这个if语句中进行了扩容
 private void add(E e, Object[] elementData, int s) {
    //数组长度也是0,条件为true
     if (s == elementData.length)
         elementData = grow();
     elementData[s] = e;
     size = s + 1;
 }

private Object[] grow() {
    //实参变为1
    return grow(size + 1);
}
private Object[] grow(int minCapacity) {
    int oldCapacity = elementData.length;
    //先不分析,这是创建ArrayList对象时指定长度或者第一次扩容之后再次扩容,才进到这里
	//
    if (oldCapacity > 0 || elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        //扩容为之前的1.5倍取整
        int newCapacity = ArraysSupport.newLength(oldCapacity,
                                                  minCapacity - oldCapacity, /* minimum growth */
                                                  oldCapacity >> 1           /* preferred growth */);
        // public static int newLength(int oldLength, int minGrowth, int prefGrowth) {
        // assert oldLength >= 0
        // assert minGrowth > 0

        //   int newLength = Math.max(minGrowth, prefGrowth) + oldLength;
        // if (newLength - MAX_ARRAY_LENGTH <= 0) {
        //   return newLength;
        // }
        //	return hugeLength(oldLength, minGrowth);
        //}
        //赋值给新创建出的数组,旧的数组自动回收!!!
        return elementData = Arrays.copyOf(elementData, newCapacity);
    } else {
        
        //跳到这里,都明白了,在10和size中取最大值,进行第一次扩容
        return elementData = new Object[Math.max(DEFAULT_CAPACITY, minCapacity)];
    }
}

有必要总结下泛型:),继续努力!!!

标签:分析,elementData,newLength,int,ArrayList,Object,源码,数组
来源: https://www.cnblogs.com/cwhan/p/13965926.html