我试图从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; 成长操作中的条件将满足。
你能解释一下这种情况的实用性,或举例说明这种情况会得到满足吗?
答案 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
。