当没有剩余空间时,向ArrayList添加元素

时间:2016-04-14 09:03:42

标签: java arraylist

我试图从here了解Java中添加 ArrayList 类操作。以下是代码的一部分:

//Proprties:

  107       /**
  108        * The array buffer into which the elements of the ArrayList are stored.
  109        * The capacity of the ArrayList is the length of this array buffer.
  110        */
  111       private transient Object[] elementData;
  112   
  113       /**
  114        * The size of the ArrayList (the number of elements it contains).
  115        *
  116        * @serial
  117        */
  118       private int size;


  404       /**
  405        * Appends the specified element to the end of this list.
  406        *
  407        * @param e element to be appended to this list
  408        * @return <tt>true</tt> (as specified by {@link Collection#add})
  409        */
  410       public boolean add(E e) {
  411           ensureCapacityInternal(size + 1);  // Increments modCount!!
  412           elementData[size++] = e;
  413           return true;
  414       }

  183       private void ensureCapacityInternal(int minCapacity) {
  184           modCount++;
  185           // overflow-conscious code
  186           if (minCapacity - elementData.length > 0)
  187               grow(minCapacity);
  188       }

  198       /**
  199        * Increases the capacity to ensure that it can hold at least the
  200        * number of elements specified by the minimum capacity argument.
  201        *
  202        * @param minCapacity the desired minimum capacity
  203        */
  204       private void grow(int minCapacity) {
  205           // overflow-conscious code
  206           int oldCapacity = elementData.length;
  207           int newCapacity = oldCapacity + (oldCapacity >> 1);
  208           if (newCapacity - minCapacity < 0)
  209               newCapacity = minCapacity;
  210           if (newCapacity - MAX_ARRAY_SIZE > 0)
  211               newCapacity = hugeCapacity(minCapacity);
  212           // minCapacity is usually close to size, so this is a win:
  213           elementData = Arrays.copyOf(elementData, newCapacity);
  214       }

元素插入的步骤是:在插入新元素之前,通过调用 ensureCapacityInternal 来验证它是否确实存在足够的空间,以防我们调用的空间不足< strong> 增长 增加elementData容量的操作。

我的问题是,我无法看到 newCapacity - minCapacity&lt; 成长操作中的条件将满足。

你能解释一下这种情况的实用性,或举例说明这种情况会得到满足吗?

2 个答案:

答案 0 :(得分:4)

  

我的问题是我无法看到newCapacity - minCapacity的情况   &LT;生长操作中的0条件将满足。

     

你能告诉我这种情况的效用还是举个例子   哪个条件会满足?

整数溢出发生的情况怎么样?这是最好的情况,它描述了ArrayList不能再进一步增长。

答案 1 :(得分:2)

minCapacity大于newCapacity的情况不属于add,而是使用addAll方法。在那里,您可以提供Collection个元素,例如可以将100个新对象插入空ArrayList。在这种情况下,默认容量10将用于计算新容量:

int newCapacity = oldCapacity + (oldCapacity >> 1); (10 + 5 = 15)

在这种情况下,15不足以存储100个元素。在这种情况下,if (newCapacity - minCapacity < 0)将评估为true