源码分析-----ArrayList初始化为10的理解

看过很多文章,都说ArrayList初始大小为10.但是看了源码发现构造方法中并不是这么回事,令我产生了怀疑。我一直坚信计算机是门科学,是有科学依据的。下面是我对ArrayList的源码收获。

首先看下两个初始化构造方法

public ArrayList(int initialCapacity) {
        if (initialCapacity > 0) {
            this.elementData = new Object[initialCapacity];
        } else if (initialCapacity == 0) {
            this.elementData = EMPTY_ELEMENTDATA;
        } else {
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        }
    }

    /**
     * Constructs an empty list with an initial capacity of ten.
     */
    public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; 
    }

其中无参构造方法复制常量 DEFAULTCAPACITY_EMPTY_ELEMENTDATA 是个Object[]数组

 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

这是我产生了疑问,为什么这么设计,初始化是个空呢?不是都说初始默认为10嘛?

我坚信java大牛们这么做一定都道理,带着疑问继续查看源码发现,在add方法中做了如下操作

  public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }

 private void ensureCapacityInternal(int minCapacity) {
        ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
    }


private static int calculateCapacity(Object[] elementData, int minCapacity) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            return Math.max(DEFAULT_CAPACITY, minCapacity);
        }
        return minCapacity;
    }

看出奥秘了,原来初始化中并没有设置10,而是在add方法时动态判断应该对出多大空间。如果为初始化,如果为add单一元素,则就是使用默认初始值10,如果是添加多个,就与初始值10进行比较,哪个大是哪个。真是把空间利用到极致了。

学习源码,乐趣无穷。

猜你喜欢

转载自blog.csdn.net/qq314499182/article/details/88063790