13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package java.util;
27
28 import java.util.function.Consumer;
29 import java.util.function.Predicate;
30 import java.util.function.UnaryOperator;
31
32 /**
33 * Resizable-array implementation of the <tt>List</tt> interface. Implements
34 * all optional list operations, and permits all elements, including
35 * <tt>null</tt>. In addition to implementing the <tt>List</tt> interface,
36 * this class provides methods to manipulate the size of the array that is
37 * used internally to store the list. (This class is roughly equivalent to
38 * <tt>Vector</tt>, except that it is unsynchronized.)
39 *
40 * <p>The <tt>size</tt>, <tt>isEmpty</tt>, <tt>get</tt>, <tt>set</tt>,
41 * <tt>iterator</tt>, and <tt>listIterator</tt> operations run in constant
42 * time. The <tt>add</tt> operation runs in <i>amortized constant time</i>,
43 * that is, adding n elements requires O(n) time. All of the other operations
44 * run in linear time (roughly speaking). The constant factor is low compared
45 * to that for the <tt>LinkedList</tt> implementation.
46 *
47 * <p>Each <tt>ArrayList</tt> instance has a <i>capacity</i>. The capacity is
48 * the size of the array used to store the elements in the list. It is always
49 * at least as large as the list size. As elements are added to an ArrayList,
50 * its capacity grows automatically. The details of the growth policy are not
51 * specified beyond the fact that adding an element has constant amortized
52 * time cost.
53 *
54 * <p>An application can increase the capacity of an <tt>ArrayList</tt> instance
55 * before adding a large number of elements using the <tt>ensureCapacity</tt>
56 * operation. This may reduce the amount of incremental reallocation.
57 *
58 * <p><strong>Note that this implementation is not synchronized.</strong>
59 * If multiple threads access an <tt>ArrayList</tt> instance concurrently,
60 * and at least one of the threads modifies the list structurally, it
61 * <i>must</i> be synchronized externally. (A structural modification is
62 * any operation that adds or deletes one or more elements, or explicitly
63 * resizes the backing array; merely setting the value of an element is not
64 * a structural modification.) This is typically accomplished by
65 * synchronizing on some object that naturally encapsulates the list.
66 *
67 * If no such object exists, the list should be "wrapped" using the
68 * {@link Collections#synchronizedList Collections.synchronizedList}
69 * method. This is best done at creation time, to prevent accidental
70 * unsynchronized access to the list:<pre>
71 * List list = Collections.synchronizedList(new ArrayList(...));</pre>
72 *
73 * <p><a name="fail-fast">
74 * The iterators returned by this class's {@link #iterator() iterator} and
75 * {@link #listIterator(int) listIterator} methods are <em>fail-fast</em>:</a>
76 * if the list is structurally modified at any time after the iterator is
77 * created, in any way except through the iterator's own
78 * {@link ListIterator#remove() remove} or
79 * {@link ListIterator#add(Object) add} methods, the iterator will throw a
80 * {@link ConcurrentModificationException}. Thus, in the face of
81 * concurrent modification, the iterator fails quickly and cleanly, rather
82 * than risking arbitrary, non-deterministic behavior at an undetermined
83 * time in the future.
84 *
85 * <p>Note that the fail-fast behavior of an iterator cannot be guaranteed
86 * as it is, generally speaking, impossible to make any hard guarantees in the
87 * presence of unsynchronized concurrent modification. Fail-fast iterators
88 * throw {@code ConcurrentModificationException} on a best-effort basis.
89 * Therefore, it would be wrong to write a program that depended on this
90 * exception for its correctness: <i>the fail-fast behavior of iterators
91 * should be used only to detect bugs.</i>
92 *
93 * <p>This class is a member of the
94 * <a href="{@docRoot}/../technotes/guides/collections/index.html">
95 * Java Collections Framework</a>.
96 *
97 * @author Josh Bloch
98 * @author Neal Gafter
99 * @see Collection
100 * @see List
101 * @see LinkedList
102 * @see Vector
103 * @since 1.2
104 */
105
106 public class ArrayList<E> extends AbstractList<E>
107 implements List<E>, RandomAccess, Cloneable, java.io.Serializable
108 {
109 private static final long serialVersionUID = 8683452581122892189L;
110
111 /**
112 * Default initial capacity.
113 */
114 private static final int DEFAULT_CAPACITY = 10;
115
116 /**
117 * Shared empty array instance used for empty instances.
118 */
119 private static final Object[] EMPTY_ELEMENTDATA = {};
120
121 /**
122 * The array buffer into which the elements of the ArrayList are stored.
123 * The capacity of the ArrayList is the length of this array buffer. Any
124 * empty ArrayList with elementData == EMPTY_ELEMENTDATA will be expanded to
125 * DEFAULT_CAPACITY when the first element is added.
126 */
127 transient Object[] elementData; // non-private to simplify nested class access
128
129 /**
130 * The size of the ArrayList (the number of elements it contains).
131 *
132 * @serial
133 */
134 private int size;
135
136 /**
137 * Constructs an empty list with the specified initial capacity.
138 *
139 * @param initialCapacity the initial capacity of the list
140 * @throws IllegalArgumentException if the specified initial capacity
141 * is negative
142 */
143 public ArrayList(int initialCapacity) {
144 super();
145 if (initialCapacity < 0)
146 throw new IllegalArgumentException("Illegal Capacity: "+
147 initialCapacity);
148 this.elementData = new Object[initialCapacity];
149 }
150
151 /**
152 * Constructs an empty list with an initial capacity of ten.
153 */
154 public ArrayList() {
155 super();
156 this.elementData = EMPTY_ELEMENTDATA;
157 }
158
159 /**
160 * Constructs a list containing the elements of the specified
161 * collection, in the order they are returned by the collection's
162 * iterator.
163 *
164 * @param c the collection whose elements are to be placed into this list
165 * @throws NullPointerException if the specified collection is null
166 */
167 public ArrayList(Collection<? extends E> c) {
168 elementData = c.toArray();
169 size = elementData.length;
170 // c.toArray might (incorrectly) not return Object[] (see 6260652)
171 if (elementData.getClass() != Object[].class)
172 elementData = Arrays.copyOf(elementData, size, Object[].class);
173 }
174
175 /**
176 * Trims the capacity of this <tt>ArrayList</tt> instance to be the
177 * list's current size. An application can use this operation to minimize
178 * the storage of an <tt>ArrayList</tt> instance.
179 */
180 public void trimToSize() {
181 modCount++;
182 if (size < elementData.length) {
183 elementData = Arrays.copyOf(elementData, size);
184 }
185 }
186
187 /**
188 * Increases the capacity of this <tt>ArrayList</tt> instance, if
189 * necessary, to ensure that it can hold at least the number of elements
190 * specified by the minimum capacity argument.
191 *
192 * @param minCapacity the desired minimum capacity
193 */
194 public void ensureCapacity(int minCapacity) {
195 int minExpand = (elementData != EMPTY_ELEMENTDATA)
196 // any size if real element table
197 ? 0
198 // larger than default for empty table. It's already supposed to be
199 // at default size.
200 : DEFAULT_CAPACITY;
201
202 if (minCapacity > minExpand) {
203 ensureExplicitCapacity(minCapacity);
204 }
205 }
206
207 private void ensureCapacityInternal(int minCapacity) {
208 if (elementData == EMPTY_ELEMENTDATA) {
209 minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
210 }
211
212 ensureExplicitCapacity(minCapacity);
213 }
214
215 private void ensureExplicitCapacity(int minCapacity) {
216 modCount++;
217
218 // overflow-conscious code
219 if (minCapacity - elementData.length > 0)
220 grow(minCapacity);
221 }
222
223 /**
224 * The maximum size of array to allocate.
225 * Some VMs reserve some header words in an array.
226 * Attempts to allocate larger arrays may result in
227 * OutOfMemoryError: Requested array size exceeds VM limit
228 */
247 }
248
249 private static int hugeCapacity(int minCapacity) {
250 if (minCapacity < 0) // overflow
251 throw new OutOfMemoryError();
252 return (minCapacity > MAX_ARRAY_SIZE) ?
253 Integer.MAX_VALUE :
254 MAX_ARRAY_SIZE;
255 }
256
257 /**
258 * Returns the number of elements in this list.
259 *
260 * @return the number of elements in this list
261 */
262 public int size() {
263 return size;
264 }
265
266 /**
267 * Returns <tt>true</tt> if this list contains no elements.
268 *
269 * @return <tt>true</tt> if this list contains no elements
270 */
271 public boolean isEmpty() {
272 return size == 0;
273 }
274
275 /**
276 * Returns <tt>true</tt> if this list contains the specified element.
277 * More formally, returns <tt>true</tt> if and only if this list contains
278 * at least one element <tt>e</tt> such that
279 * <tt>(o==null ? e==null : o.equals(e))</tt>.
280 *
281 * @param o element whose presence in this list is to be tested
282 * @return <tt>true</tt> if this list contains the specified element
283 */
284 public boolean contains(Object o) {
285 return indexOf(o) >= 0;
286 }
287
288 /**
289 * Returns the index of the first occurrence of the specified element
290 * in this list, or -1 if this list does not contain the element.
291 * More formally, returns the lowest index <tt>i</tt> such that
292 * <tt>(o==null ? get(i)==null : o.equals(get(i)))</tt>,
293 * or -1 if there is no such index.
294 */
295 public int indexOf(Object o) {
296 if (o == null) {
297 for (int i = 0; i < size; i++)
298 if (elementData[i]==null)
299 return i;
300 } else {
301 for (int i = 0; i < size; i++)
302 if (o.equals(elementData[i]))
303 return i;
304 }
305 return -1;
306 }
307
308 /**
309 * Returns the index of the last occurrence of the specified element
310 * in this list, or -1 if this list does not contain the element.
311 * More formally, returns the highest index <tt>i</tt> such that
312 * <tt>(o==null ? get(i)==null : o.equals(get(i)))</tt>,
313 * or -1 if there is no such index.
314 */
315 public int lastIndexOf(Object o) {
316 if (o == null) {
317 for (int i = size-1; i >= 0; i--)
318 if (elementData[i]==null)
319 return i;
320 } else {
321 for (int i = size-1; i >= 0; i--)
322 if (o.equals(elementData[i]))
323 return i;
324 }
325 return -1;
326 }
327
328 /**
329 * Returns a shallow copy of this <tt>ArrayList</tt> instance. (The
330 * elements themselves are not copied.)
331 *
332 * @return a clone of this <tt>ArrayList</tt> instance
333 */
334 public Object clone() {
335 try {
336 ArrayList<?> v = (ArrayList<?>) super.clone();
337 v.elementData = Arrays.copyOf(elementData, size);
338 v.modCount = 0;
339 return v;
340 } catch (CloneNotSupportedException e) {
341 // this shouldn't happen, since we are Cloneable
342 throw new InternalError(e);
343 }
344 }
345
346 /**
347 * Returns an array containing all of the elements in this list
348 * in proper sequence (from first to last element).
349 *
350 * <p>The returned array will be "safe" in that no references to it are
351 * maintained by this list. (In other words, this method must allocate
352 * a new array). The caller is thus free to modify the returned array.
355 * APIs.
356 *
357 * @return an array containing all of the elements in this list in
358 * proper sequence
359 */
360 public Object[] toArray() {
361 return Arrays.copyOf(elementData, size);
362 }
363
364 /**
365 * Returns an array containing all of the elements in this list in proper
366 * sequence (from first to last element); the runtime type of the returned
367 * array is that of the specified array. If the list fits in the
368 * specified array, it is returned therein. Otherwise, a new array is
369 * allocated with the runtime type of the specified array and the size of
370 * this list.
371 *
372 * <p>If the list fits in the specified array with room to spare
373 * (i.e., the array has more elements than the list), the element in
374 * the array immediately following the end of the collection is set to
375 * <tt>null</tt>. (This is useful in determining the length of the
376 * list <i>only</i> if the caller knows that the list does not contain
377 * any null elements.)
378 *
379 * @param a the array into which the elements of the list are to
380 * be stored, if it is big enough; otherwise, a new array of the
381 * same runtime type is allocated for this purpose.
382 * @return an array containing the elements of the list
383 * @throws ArrayStoreException if the runtime type of the specified array
384 * is not a supertype of the runtime type of every element in
385 * this list
386 * @throws NullPointerException if the specified array is null
387 */
388 @SuppressWarnings("unchecked")
389 public <T> T[] toArray(T[] a) {
390 if (a.length < size)
391 // Make a new array of a's runtime type, but my contents:
392 return (T[]) Arrays.copyOf(elementData, size, a.getClass());
393 System.arraycopy(elementData, 0, a, 0, size);
394 if (a.length > size)
395 a[size] = null;
420 * Replaces the element at the specified position in this list with
421 * the specified element.
422 *
423 * @param index index of the element to replace
424 * @param element element to be stored at the specified position
425 * @return the element previously at the specified position
426 * @throws IndexOutOfBoundsException {@inheritDoc}
427 */
428 public E set(int index, E element) {
429 rangeCheck(index);
430
431 E oldValue = elementData(index);
432 elementData[index] = element;
433 return oldValue;
434 }
435
436 /**
437 * Appends the specified element to the end of this list.
438 *
439 * @param e element to be appended to this list
440 * @return <tt>true</tt> (as specified by {@link Collection#add})
441 */
442 public boolean add(E e) {
443 ensureCapacityInternal(size + 1); // Increments modCount!!
444 elementData[size++] = e;
445 return true;
446 }
447
448 /**
449 * Inserts the specified element at the specified position in this
450 * list. Shifts the element currently at that position (if any) and
451 * any subsequent elements to the right (adds one to their indices).
452 *
453 * @param index index at which the specified element is to be inserted
454 * @param element element to be inserted
455 * @throws IndexOutOfBoundsException {@inheritDoc}
456 */
457 public void add(int index, E element) {
458 rangeCheckForAdd(index);
459
460 ensureCapacityInternal(size + 1); // Increments modCount!!
475 */
476 public E remove(int index) {
477 rangeCheck(index);
478
479 modCount++;
480 E oldValue = elementData(index);
481
482 int numMoved = size - index - 1;
483 if (numMoved > 0)
484 System.arraycopy(elementData, index+1, elementData, index,
485 numMoved);
486 elementData[--size] = null; // clear to let GC do its work
487
488 return oldValue;
489 }
490
491 /**
492 * Removes the first occurrence of the specified element from this list,
493 * if it is present. If the list does not contain the element, it is
494 * unchanged. More formally, removes the element with the lowest index
495 * <tt>i</tt> such that
496 * <tt>(o==null ? get(i)==null : o.equals(get(i)))</tt>
497 * (if such an element exists). Returns <tt>true</tt> if this list
498 * contained the specified element (or equivalently, if this list
499 * changed as a result of the call).
500 *
501 * @param o element to be removed from this list, if present
502 * @return <tt>true</tt> if this list contained the specified element
503 */
504 public boolean remove(Object o) {
505 if (o == null) {
506 for (int index = 0; index < size; index++)
507 if (elementData[index] == null) {
508 fastRemove(index);
509 return true;
510 }
511 } else {
512 for (int index = 0; index < size; index++)
513 if (o.equals(elementData[index])) {
514 fastRemove(index);
515 return true;
516 }
517 }
518 return false;
519 }
520
521 /*
522 * Private remove method that skips bounds checking and does not
538 public void clear() {
539 modCount++;
540
541 // clear to let GC do its work
542 for (int i = 0; i < size; i++)
543 elementData[i] = null;
544
545 size = 0;
546 }
547
548 /**
549 * Appends all of the elements in the specified collection to the end of
550 * this list, in the order that they are returned by the
551 * specified collection's Iterator. The behavior of this operation is
552 * undefined if the specified collection is modified while the operation
553 * is in progress. (This implies that the behavior of this call is
554 * undefined if the specified collection is this list, and this
555 * list is nonempty.)
556 *
557 * @param c collection containing elements to be added to this list
558 * @return <tt>true</tt> if this list changed as a result of the call
559 * @throws NullPointerException if the specified collection is null
560 */
561 public boolean addAll(Collection<? extends E> c) {
562 Object[] a = c.toArray();
563 int numNew = a.length;
564 ensureCapacityInternal(size + numNew); // Increments modCount
565 System.arraycopy(a, 0, elementData, size, numNew);
566 size += numNew;
567 return numNew != 0;
568 }
569
570 /**
571 * Inserts all of the elements in the specified collection into this
572 * list, starting at the specified position. Shifts the element
573 * currently at that position (if any) and any subsequent elements to
574 * the right (increases their indices). The new elements will appear
575 * in the list in the order that they are returned by the
576 * specified collection's iterator.
577 *
578 * @param index index at which to insert the first element from the
579 * specified collection
580 * @param c collection containing elements to be added to this list
581 * @return <tt>true</tt> if this list changed as a result of the call
582 * @throws IndexOutOfBoundsException {@inheritDoc}
583 * @throws NullPointerException if the specified collection is null
584 */
585 public boolean addAll(int index, Collection<? extends E> c) {
586 rangeCheckForAdd(index);
587
588 Object[] a = c.toArray();
589 int numNew = a.length;
590 ensureCapacityInternal(size + numNew); // Increments modCount
591
592 int numMoved = size - index;
593 if (numMoved > 0)
594 System.arraycopy(elementData, index, elementData, index + numNew,
595 numMoved);
596
597 System.arraycopy(a, 0, elementData, index, numNew);
598 size += numNew;
599 return numNew != 0;
600 }
601
719 // even if c.contains() throws.
720 if (r != size) {
721 System.arraycopy(elementData, r,
722 elementData, w,
723 size - r);
724 w += size - r;
725 }
726 if (w != size) {
727 // clear to let GC do its work
728 for (int i = w; i < size; i++)
729 elementData[i] = null;
730 modCount += size - w;
731 size = w;
732 modified = true;
733 }
734 }
735 return modified;
736 }
737
738 /**
739 * Save the state of the <tt>ArrayList</tt> instance to a stream (that
740 * is, serialize it).
741 *
742 * @serialData The length of the array backing the <tt>ArrayList</tt>
743 * instance is emitted (int), followed by all of its elements
744 * (each an <tt>Object</tt>) in the proper order.
745 */
746 private void writeObject(java.io.ObjectOutputStream s)
747 throws java.io.IOException{
748 // Write out element count, and any hidden stuff
749 int expectedModCount = modCount;
750 s.defaultWriteObject();
751
752 // Write out size as capacity for behavioural compatibility with clone()
753 s.writeInt(size);
754
755 // Write out all elements in the proper order.
756 for (int i=0; i<size; i++) {
757 s.writeObject(elementData[i]);
758 }
759
760 if (modCount != expectedModCount) {
761 throw new ConcurrentModificationException();
762 }
763 }
764
765 /**
766 * Reconstitute the <tt>ArrayList</tt> instance from a stream (that is,
767 * deserialize it).
768 */
769 private void readObject(java.io.ObjectInputStream s)
770 throws java.io.IOException, ClassNotFoundException {
771 elementData = EMPTY_ELEMENTDATA;
772
773 // Read in size, and any hidden stuff
774 s.defaultReadObject();
775
776 // Read in capacity
777 s.readInt(); // ignored
778
779 if (size > 0) {
780 // be like clone(), allocate array based upon size not capacity
781 ensureCapacityInternal(size);
782
783 Object[] a = elementData;
784 // Read in all elements in the proper order.
785 for (int i=0; i<size; i++) {
786 a[i] = s.readObject();
|
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package java.util;
27
28 import java.util.function.Consumer;
29 import java.util.function.Predicate;
30 import java.util.function.UnaryOperator;
31
32 /**
33 * Resizable-array implementation of the {@code List} interface. Implements
34 * all optional list operations, and permits all elements, including
35 * {@code null}. In addition to implementing the {@code List} interface,
36 * this class provides methods to manipulate the size of the array that is
37 * used internally to store the list. (This class is roughly equivalent to
38 * {@code Vector}, except that it is unsynchronized.)
39 *
40 * <p>The {@code size}, {@code isEmpty}, {@code get}, {@code set},
41 * {@code iterator}, and {@code listIterator} operations run in constant
42 * time. The {@code add} operation runs in <i>amortized constant time</i>,
43 * that is, adding n elements requires O(n) time. All of the other operations
44 * run in linear time (roughly speaking). The constant factor is low compared
45 * to that for the {@code LinkedList} implementation.
46 *
47 * <p>Each {@code ArrayList} instance has a <i>capacity</i>. The capacity is
48 * the size of the array used to store the elements in the list. It is always
49 * at least as large as the list size. As elements are added to an ArrayList,
50 * its capacity grows automatically. The details of the growth policy are not
51 * specified beyond the fact that adding an element has constant amortized
52 * time cost.
53 *
54 * <p>An application can increase the capacity of an {@code ArrayList} instance
55 * before adding a large number of elements using the {@code ensureCapacity}
56 * operation. This may reduce the amount of incremental reallocation.
57 *
58 * <p><strong>Note that this implementation is not synchronized.</strong>
59 * If multiple threads access an {@code ArrayList} instance concurrently,
60 * and at least one of the threads modifies the list structurally, it
61 * <i>must</i> be synchronized externally. (A structural modification is
62 * any operation that adds or deletes one or more elements, or explicitly
63 * resizes the backing array; merely setting the value of an element is not
64 * a structural modification.) This is typically accomplished by
65 * synchronizing on some object that naturally encapsulates the list.
66 *
67 * If no such object exists, the list should be "wrapped" using the
68 * {@link Collections#synchronizedList Collections.synchronizedList}
69 * method. This is best done at creation time, to prevent accidental
70 * unsynchronized access to the list:<pre>
71 * List list = Collections.synchronizedList(new ArrayList(...));</pre>
72 *
73 * <p><a name="fail-fast">
74 * The iterators returned by this class's {@link #iterator() iterator} and
75 * {@link #listIterator(int) listIterator} methods are <em>fail-fast</em>:</a>
76 * if the list is structurally modified at any time after the iterator is
77 * created, in any way except through the iterator's own
78 * {@link ListIterator#remove() remove} or
79 * {@link ListIterator#add(Object) add} methods, the iterator will throw a
80 * {@link ConcurrentModificationException}. Thus, in the face of
81 * concurrent modification, the iterator fails quickly and cleanly, rather
82 * than risking arbitrary, non-deterministic behavior at an undetermined
83 * time in the future.
84 *
85 * <p>Note that the fail-fast behavior of an iterator cannot be guaranteed
86 * as it is, generally speaking, impossible to make any hard guarantees in the
87 * presence of unsynchronized concurrent modification. Fail-fast iterators
88 * throw {@code ConcurrentModificationException} on a best-effort basis.
89 * Therefore, it would be wrong to write a program that depended on this
90 * exception for its correctness: <i>the fail-fast behavior of iterators
91 * should be used only to detect bugs.</i>
92 *
93 * <p>This class is a member of the
94 * <a href="{@docRoot}/../technotes/guides/collections/index.html">
95 * Java Collections Framework</a>.
96 *
97 * @param <E> the type of elements in this list
98 *
99 * @author Josh Bloch
100 * @author Neal Gafter
101 * @see Collection
102 * @see List
103 * @see LinkedList
104 * @see Vector
105 * @since 1.2
106 */
107
108 public class ArrayList<E> extends AbstractList<E>
109 implements List<E>, RandomAccess, Cloneable, java.io.Serializable
110 {
111 private static final long serialVersionUID = 8683452581122892189L;
112
113 /**
114 * Default initial capacity.
115 */
116 private static final int DEFAULT_CAPACITY = 10;
117
118 /**
119 * Shared empty array instance used for empty instances.
120 */
121 private static final Object[] EMPTY_ELEMENTDATA = {};
122
123 /**
124 * Shared empty array instance used for default sized empty instances. We
125 * distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when
126 * first element is added.
127 */
128 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
129
130 /**
131 * The array buffer into which the elements of the ArrayList are stored.
132 * The capacity of the ArrayList is the length of this array buffer. Any
133 * empty ArrayList with elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
134 * will be expanded to DEFAULT_CAPACITY when the first element is added.
135 */
136 transient Object[] elementData; // non-private to simplify nested class access
137
138 /**
139 * The size of the ArrayList (the number of elements it contains).
140 *
141 * @serial
142 */
143 private int size;
144
145 /**
146 * Constructs an empty list with the specified initial capacity.
147 *
148 * @param initialCapacity the initial capacity of the list
149 * @throws IllegalArgumentException if the specified initial capacity
150 * is negative
151 */
152 public ArrayList(int initialCapacity) {
153 if (initialCapacity > 0) {
154 this.elementData = new Object[initialCapacity];
155 } else if (initialCapacity == 0) {
156 this.elementData = EMPTY_ELEMENTDATA;
157 } else {
158 throw new IllegalArgumentException("Illegal Capacity: "+
159 initialCapacity);
160 }
161 }
162
163 /**
164 * Constructs an empty list with an initial capacity of ten.
165 */
166 public ArrayList() {
167 this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
168 }
169
170 /**
171 * Constructs a list containing the elements of the specified
172 * collection, in the order they are returned by the collection's
173 * iterator.
174 *
175 * @param c the collection whose elements are to be placed into this list
176 * @throws NullPointerException if the specified collection is null
177 */
178 public ArrayList(Collection<? extends E> c) {
179 elementData = c.toArray();
180 if ((size = elementData.length) != 0) {
181 // c.toArray might (incorrectly) not return Object[] (see 6260652)
182 if (elementData.getClass() != Object[].class)
183 elementData = Arrays.copyOf(elementData, size, Object[].class);
184 } else {
185 // replace with empty array.
186 this.elementData = EMPTY_ELEMENTDATA;
187 }
188 }
189
190 /**
191 * Trims the capacity of this {@code ArrayList} instance to be the
192 * list's current size. An application can use this operation to minimize
193 * the storage of an {@code ArrayList} instance.
194 */
195 public void trimToSize() {
196 modCount++;
197 if (size < elementData.length) {
198 elementData = (size == 0)
199 ? EMPTY_ELEMENTDATA
200 : Arrays.copyOf(elementData, size);
201 }
202 }
203
204 /**
205 * Increases the capacity of this {@code ArrayList} instance, if
206 * necessary, to ensure that it can hold at least the number of elements
207 * specified by the minimum capacity argument.
208 *
209 * @param minCapacity the desired minimum capacity
210 */
211 public void ensureCapacity(int minCapacity) {
212 int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
213 // any size if not default element table
214 ? 0
215 // larger than default for default empty table. It's already
216 // supposed to be at default size.
217 : DEFAULT_CAPACITY;
218
219 if (minCapacity > minExpand) {
220 ensureExplicitCapacity(minCapacity);
221 }
222 }
223
224 private void ensureCapacityInternal(int minCapacity) {
225 if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
226 minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
227 }
228
229 ensureExplicitCapacity(minCapacity);
230 }
231
232 private void ensureExplicitCapacity(int minCapacity) {
233 modCount++;
234
235 // overflow-conscious code
236 if (minCapacity - elementData.length > 0)
237 grow(minCapacity);
238 }
239
240 /**
241 * The maximum size of array to allocate.
242 * Some VMs reserve some header words in an array.
243 * Attempts to allocate larger arrays may result in
244 * OutOfMemoryError: Requested array size exceeds VM limit
245 */
264 }
265
266 private static int hugeCapacity(int minCapacity) {
267 if (minCapacity < 0) // overflow
268 throw new OutOfMemoryError();
269 return (minCapacity > MAX_ARRAY_SIZE) ?
270 Integer.MAX_VALUE :
271 MAX_ARRAY_SIZE;
272 }
273
274 /**
275 * Returns the number of elements in this list.
276 *
277 * @return the number of elements in this list
278 */
279 public int size() {
280 return size;
281 }
282
283 /**
284 * Returns {@code true} if this list contains no elements.
285 *
286 * @return {@code true} if this list contains no elements
287 */
288 public boolean isEmpty() {
289 return size == 0;
290 }
291
292 /**
293 * Returns {@code true} if this list contains the specified element.
294 * More formally, returns {@code true} if and only if this list contains
295 * at least one element {@code e} such that
296 * <tt>(o==null ? e==null : o.equals(e))</tt>.
297 *
298 * @param o element whose presence in this list is to be tested
299 * @return {@code true} if this list contains the specified element
300 */
301 public boolean contains(Object o) {
302 return indexOf(o) >= 0;
303 }
304
305 /**
306 * Returns the index of the first occurrence of the specified element
307 * in this list, or -1 if this list does not contain the element.
308 * More formally, returns the lowest index {@code i} such that
309 * <tt>(o==null ? get(i)==null : o.equals(get(i)))</tt>,
310 * or -1 if there is no such index.
311 */
312 public int indexOf(Object o) {
313 if (o == null) {
314 for (int i = 0; i < size; i++)
315 if (elementData[i]==null)
316 return i;
317 } else {
318 for (int i = 0; i < size; i++)
319 if (o.equals(elementData[i]))
320 return i;
321 }
322 return -1;
323 }
324
325 /**
326 * Returns the index of the last occurrence of the specified element
327 * in this list, or -1 if this list does not contain the element.
328 * More formally, returns the highest index {@code i} such that
329 * <tt>(o==null ? get(i)==null : o.equals(get(i)))</tt>,
330 * or -1 if there is no such index.
331 */
332 public int lastIndexOf(Object o) {
333 if (o == null) {
334 for (int i = size-1; i >= 0; i--)
335 if (elementData[i]==null)
336 return i;
337 } else {
338 for (int i = size-1; i >= 0; i--)
339 if (o.equals(elementData[i]))
340 return i;
341 }
342 return -1;
343 }
344
345 /**
346 * Returns a shallow copy of this {@code ArrayList} instance. (The
347 * elements themselves are not copied.)
348 *
349 * @return a clone of this {@code ArrayList} instance
350 */
351 public Object clone() {
352 try {
353 ArrayList<?> v = (ArrayList<?>) super.clone();
354 v.elementData = Arrays.copyOf(elementData, size);
355 v.modCount = 0;
356 return v;
357 } catch (CloneNotSupportedException e) {
358 // this shouldn't happen, since we are Cloneable
359 throw new InternalError(e);
360 }
361 }
362
363 /**
364 * Returns an array containing all of the elements in this list
365 * in proper sequence (from first to last element).
366 *
367 * <p>The returned array will be "safe" in that no references to it are
368 * maintained by this list. (In other words, this method must allocate
369 * a new array). The caller is thus free to modify the returned array.
372 * APIs.
373 *
374 * @return an array containing all of the elements in this list in
375 * proper sequence
376 */
377 public Object[] toArray() {
378 return Arrays.copyOf(elementData, size);
379 }
380
381 /**
382 * Returns an array containing all of the elements in this list in proper
383 * sequence (from first to last element); the runtime type of the returned
384 * array is that of the specified array. If the list fits in the
385 * specified array, it is returned therein. Otherwise, a new array is
386 * allocated with the runtime type of the specified array and the size of
387 * this list.
388 *
389 * <p>If the list fits in the specified array with room to spare
390 * (i.e., the array has more elements than the list), the element in
391 * the array immediately following the end of the collection is set to
392 * {@code null}. (This is useful in determining the length of the
393 * list <i>only</i> if the caller knows that the list does not contain
394 * any null elements.)
395 *
396 * @param a the array into which the elements of the list are to
397 * be stored, if it is big enough; otherwise, a new array of the
398 * same runtime type is allocated for this purpose.
399 * @return an array containing the elements of the list
400 * @throws ArrayStoreException if the runtime type of the specified array
401 * is not a supertype of the runtime type of every element in
402 * this list
403 * @throws NullPointerException if the specified array is null
404 */
405 @SuppressWarnings("unchecked")
406 public <T> T[] toArray(T[] a) {
407 if (a.length < size)
408 // Make a new array of a's runtime type, but my contents:
409 return (T[]) Arrays.copyOf(elementData, size, a.getClass());
410 System.arraycopy(elementData, 0, a, 0, size);
411 if (a.length > size)
412 a[size] = null;
437 * Replaces the element at the specified position in this list with
438 * the specified element.
439 *
440 * @param index index of the element to replace
441 * @param element element to be stored at the specified position
442 * @return the element previously at the specified position
443 * @throws IndexOutOfBoundsException {@inheritDoc}
444 */
445 public E set(int index, E element) {
446 rangeCheck(index);
447
448 E oldValue = elementData(index);
449 elementData[index] = element;
450 return oldValue;
451 }
452
453 /**
454 * Appends the specified element to the end of this list.
455 *
456 * @param e element to be appended to this list
457 * @return {@code true} (as specified by {@link Collection#add})
458 */
459 public boolean add(E e) {
460 ensureCapacityInternal(size + 1); // Increments modCount!!
461 elementData[size++] = e;
462 return true;
463 }
464
465 /**
466 * Inserts the specified element at the specified position in this
467 * list. Shifts the element currently at that position (if any) and
468 * any subsequent elements to the right (adds one to their indices).
469 *
470 * @param index index at which the specified element is to be inserted
471 * @param element element to be inserted
472 * @throws IndexOutOfBoundsException {@inheritDoc}
473 */
474 public void add(int index, E element) {
475 rangeCheckForAdd(index);
476
477 ensureCapacityInternal(size + 1); // Increments modCount!!
492 */
493 public E remove(int index) {
494 rangeCheck(index);
495
496 modCount++;
497 E oldValue = elementData(index);
498
499 int numMoved = size - index - 1;
500 if (numMoved > 0)
501 System.arraycopy(elementData, index+1, elementData, index,
502 numMoved);
503 elementData[--size] = null; // clear to let GC do its work
504
505 return oldValue;
506 }
507
508 /**
509 * Removes the first occurrence of the specified element from this list,
510 * if it is present. If the list does not contain the element, it is
511 * unchanged. More formally, removes the element with the lowest index
512 * {@code i} such that
513 * <tt>(o==null ? get(i)==null : o.equals(get(i)))</tt>
514 * (if such an element exists). Returns {@code true} if this list
515 * contained the specified element (or equivalently, if this list
516 * changed as a result of the call).
517 *
518 * @param o element to be removed from this list, if present
519 * @return {@code true} if this list contained the specified element
520 */
521 public boolean remove(Object o) {
522 if (o == null) {
523 for (int index = 0; index < size; index++)
524 if (elementData[index] == null) {
525 fastRemove(index);
526 return true;
527 }
528 } else {
529 for (int index = 0; index < size; index++)
530 if (o.equals(elementData[index])) {
531 fastRemove(index);
532 return true;
533 }
534 }
535 return false;
536 }
537
538 /*
539 * Private remove method that skips bounds checking and does not
555 public void clear() {
556 modCount++;
557
558 // clear to let GC do its work
559 for (int i = 0; i < size; i++)
560 elementData[i] = null;
561
562 size = 0;
563 }
564
565 /**
566 * Appends all of the elements in the specified collection to the end of
567 * this list, in the order that they are returned by the
568 * specified collection's Iterator. The behavior of this operation is
569 * undefined if the specified collection is modified while the operation
570 * is in progress. (This implies that the behavior of this call is
571 * undefined if the specified collection is this list, and this
572 * list is nonempty.)
573 *
574 * @param c collection containing elements to be added to this list
575 * @return {@code true} if this list changed as a result of the call
576 * @throws NullPointerException if the specified collection is null
577 */
578 public boolean addAll(Collection<? extends E> c) {
579 Object[] a = c.toArray();
580 int numNew = a.length;
581 ensureCapacityInternal(size + numNew); // Increments modCount
582 System.arraycopy(a, 0, elementData, size, numNew);
583 size += numNew;
584 return numNew != 0;
585 }
586
587 /**
588 * Inserts all of the elements in the specified collection into this
589 * list, starting at the specified position. Shifts the element
590 * currently at that position (if any) and any subsequent elements to
591 * the right (increases their indices). The new elements will appear
592 * in the list in the order that they are returned by the
593 * specified collection's iterator.
594 *
595 * @param index index at which to insert the first element from the
596 * specified collection
597 * @param c collection containing elements to be added to this list
598 * @return {@code true} if this list changed as a result of the call
599 * @throws IndexOutOfBoundsException {@inheritDoc}
600 * @throws NullPointerException if the specified collection is null
601 */
602 public boolean addAll(int index, Collection<? extends E> c) {
603 rangeCheckForAdd(index);
604
605 Object[] a = c.toArray();
606 int numNew = a.length;
607 ensureCapacityInternal(size + numNew); // Increments modCount
608
609 int numMoved = size - index;
610 if (numMoved > 0)
611 System.arraycopy(elementData, index, elementData, index + numNew,
612 numMoved);
613
614 System.arraycopy(a, 0, elementData, index, numNew);
615 size += numNew;
616 return numNew != 0;
617 }
618
736 // even if c.contains() throws.
737 if (r != size) {
738 System.arraycopy(elementData, r,
739 elementData, w,
740 size - r);
741 w += size - r;
742 }
743 if (w != size) {
744 // clear to let GC do its work
745 for (int i = w; i < size; i++)
746 elementData[i] = null;
747 modCount += size - w;
748 size = w;
749 modified = true;
750 }
751 }
752 return modified;
753 }
754
755 /**
756 * Save the state of the {@code ArrayList} instance to a stream (that
757 * is, serialize it).
758 *
759 * @serialData The length of the array backing the {@code ArrayList}
760 * instance is emitted (int), followed by all of its elements
761 * (each an {@code Object}) in the proper order.
762 */
763 private void writeObject(java.io.ObjectOutputStream s)
764 throws java.io.IOException{
765 // Write out element count, and any hidden stuff
766 int expectedModCount = modCount;
767 s.defaultWriteObject();
768
769 // Write out size as capacity for behavioural compatibility with clone()
770 s.writeInt(size);
771
772 // Write out all elements in the proper order.
773 for (int i=0; i<size; i++) {
774 s.writeObject(elementData[i]);
775 }
776
777 if (modCount != expectedModCount) {
778 throw new ConcurrentModificationException();
779 }
780 }
781
782 /**
783 * Reconstitute the {@code ArrayList} instance from a stream (that is,
784 * deserialize it).
785 */
786 private void readObject(java.io.ObjectInputStream s)
787 throws java.io.IOException, ClassNotFoundException {
788 elementData = EMPTY_ELEMENTDATA;
789
790 // Read in size, and any hidden stuff
791 s.defaultReadObject();
792
793 // Read in capacity
794 s.readInt(); // ignored
795
796 if (size > 0) {
797 // be like clone(), allocate array based upon size not capacity
798 ensureCapacityInternal(size);
799
800 Object[] a = elementData;
801 // Read in all elements in the proper order.
802 for (int i=0; i<size; i++) {
803 a[i] = s.readObject();
|