代码之家  ›  专栏  ›  技术社区  ›  Andremoniy

arraylist公共构造函数-“构造初始容量为10的空列表”-在哪里?[复制品]

  •  7
  • Andremoniy  · 技术社区  · 6 年前

    这个问题已经有了答案:

    请注意,它是 复制品 Why start an ArrayList with an initial capacity?

    正在查找的源代码 java.util.ArrayList 类,从至少Java 1.8开始,我看到下面的代码:

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

    在哪里?

    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
    

    虽然 javadoc 官方声明:

    构造初始容量为10的空列表。

    我概述: …初始容量为10 . 这是哪里 ?

    我是完全疯了还是错过了什么,或者这里只是一个javadoc bug?

    UPD: 之前Java 1.8的样子:

    public ArrayList(int initialCapacity) {
        super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        this.elementData = new Object[initialCapacity];
    }
    
    /**
     * Constructs an empty list with an initial capacity of ten.
     */
    public ArrayList() {
        this(10);
    }
    
    2 回复  |  直到 6 年前
        1
  •  7
  •   Eran    6 年前

    这是一个优化。开发人员决定初始化 ArrayList 使用空的备份数组,并且仅当开始向 List .

    添加第一个元素时(通过调用 add 它叫

    ensureCapacityInternal(size + 1);
    

    检查是否 elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA 如果是,则将容量设置为

    minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
    

    DEFAULT_CAPACITY 10 .

        2
  •  3
  •   xingbin    6 年前

    首次向列表中添加元素时,容量将设置为10。

    看到这个:

    /**
     * Default initial capacity.
     */
    private static final int DEFAULT_CAPACITY = 10;
    

    完整程序

    步骤1:

    public boolean add(E e) {
        modCount++;
        add(e, elementData, size);
        return true;
    }
    

    步骤2:

    private void add(E e, Object[] elementData, int s) {
        if (s == elementData.length)
            elementData = grow();
        elementData[s] = e;
        size = s + 1;
    }
    

    步骤3,列表 grows :

    private Object[] grow() {
        return grow(size + 1); // size is 0 here
    }
    
    private Object[] grow(int minCapacity) {
        return elementData = Arrays.copyOf(elementData,
                                           newCapacity(minCapacity));  // newCapacity(1) will return 10, see step 4, the elementData will have capacity 10.
    }
    

    步骤4,调用 newCapacity(1) :

    private int newCapacity(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity <= 0) {
            if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
                return Math.max(DEFAULT_CAPACITY, minCapacity);   // will  return 10 here !!!!
            if (minCapacity < 0) // overflow
                throw new OutOfMemoryError();
            return minCapacity;
        }
        return (newCapacity - MAX_ARRAY_SIZE <= 0)
            ? newCapacity
            : hugeCapacity(minCapacity);
    }