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 /**
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) {
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
709 // even if c.contains() throws.
710 if (r != size) {
711 System.arraycopy(elementData, r,
712 elementData, w,
713 size - r);
714 w += size - r;
715 }
716 if (w != size) {
717 // clear to let GC do its work
718 for (int i = w; i < size; i++)
719 elementData[i] = null;
720 modCount += size - w;
721 size = w;
722 modified = true;
723 }
724 }
725 return modified;
726 }
727
728 /**
729 * Save the state of the <tt>ArrayList</tt> instance to a stream (that
730 * is, serialize it).
731 *
732 * @serialData The length of the array backing the <tt>ArrayList</tt>
733 * instance is emitted (int), followed by all of its elements
734 * (each an <tt>Object</tt>) in the proper order.
735 */
736 private void writeObject(java.io.ObjectOutputStream s)
737 throws java.io.IOException{
738 // Write out element count, and any hidden stuff
739 int expectedModCount = modCount;
740 s.defaultWriteObject();
741
742 // Write out size as capacity for behavioural compatibility with clone()
743 s.writeInt(size);
744
745 // Write out all elements in the proper order.
746 for (int i=0; i<size; i++) {
747 s.writeObject(elementData[i]);
748 }
749
750 if (modCount != expectedModCount) {
751 throw new ConcurrentModificationException();
752 }
753 }
754
755 /**
756 * Reconstitute the <tt>ArrayList</tt> instance from a stream (that is,
757 * deserialize it).
758 */
759 private void readObject(java.io.ObjectInputStream s)
760 throws java.io.IOException, ClassNotFoundException {
761 elementData = EMPTY_ELEMENTDATA;
762
763 // Read in size, and any hidden stuff
764 s.defaultReadObject();
765
766 // Read in capacity
767 s.readInt(); // ignored
768
769 if (size > 0) {
770 // be like clone(), allocate array based upon size not capacity
771 ensureCapacityInternal(size);
772
773 Object[] a = elementData;
774 // Read in all elements in the proper order.
775 for (int i=0; i<size; i++) {
776 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 /**
126 * empty ArrayList with elementData == EMPTY_ELEMENTDATA will be expanded to
127 * DEFAULT_CAPACITY when the first element is added.
128 */
129 transient Object[] elementData; // non-private to simplify nested class access
130
131 /**
132 * The size of the ArrayList (the number of elements it contains).
133 *
134 * @serial
135 */
136 private int size;
137
138 /**
139 * Constructs an empty list with the specified initial capacity.
140 *
141 * @param initialCapacity the initial capacity of the list
142 * @throws IllegalArgumentException if the specified initial capacity
143 * is negative
144 */
145 public ArrayList(int initialCapacity) {
146 if (initialCapacity < 0)
147 throw new IllegalArgumentException("Illegal Capacity: "+
148 initialCapacity);
149 this.elementData = (initialCapacity > 0)
150 ? new Object[initialCapacity]
151 : EMPTY_ELEMENTDATA;
152 }
153
154 /**
155 * Constructs an empty list with an initial capacity of ten.
156 */
157 public ArrayList() {
158 this.elementData = EMPTY_ELEMENTDATA;
159 }
160
161 /**
162 * Constructs a list containing the elements of the specified
163 * collection, in the order they are returned by the collection's
164 * iterator.
165 *
166 * @param c the collection whose elements are to be placed into this list
167 * @throws NullPointerException if the specified collection is null
168 */
169 public ArrayList(Collection<? extends E> c) {
170 if (!c.isEmpty()) {
171 elementData = c.toArray();
172 size = elementData.length;
173 // c.toArray might (incorrectly) not return Object[] (see 6260652)
174 if (elementData.getClass() != Object[].class)
175 elementData = Arrays.copyOf(elementData, size, Object[].class);
176 } else {
177 this.elementData = EMPTY_ELEMENTDATA;
178 }
179 }
180
181 /**
182 * Trims the capacity of this {@code ArrayList} instance to be the
183 * list's current size. An application can use this operation to minimize
184 * the storage of an {@code ArrayList} instance.
185 */
186 public void trimToSize() {
187 modCount++;
188 if (size < elementData.length) {
189 elementData = Arrays.copyOf(elementData, size);
190 }
191 }
192
193 /**
194 * Increases the capacity of this {@code ArrayList} instance, if
195 * necessary, to ensure that it can hold at least the number of elements
196 * specified by the minimum capacity argument.
197 *
198 * @param minCapacity the desired minimum capacity
199 */
200 public void ensureCapacity(int minCapacity) {
201 int minExpand = (elementData != EMPTY_ELEMENTDATA)
202 // any size if real element table
203 ? 0
204 // larger than default for empty table. It's already supposed to be
205 // at default size.
206 : DEFAULT_CAPACITY;
207
208 if (minCapacity > minExpand) {
209 ensureExplicitCapacity(minCapacity);
210 }
211 }
212
213 private void ensureCapacityInternal(int minCapacity) {
214 if (elementData == EMPTY_ELEMENTDATA) {
253 }
254
255 private static int hugeCapacity(int minCapacity) {
256 if (minCapacity < 0) // overflow
257 throw new OutOfMemoryError();
258 return (minCapacity > MAX_ARRAY_SIZE) ?
259 Integer.MAX_VALUE :
260 MAX_ARRAY_SIZE;
261 }
262
263 /**
264 * Returns the number of elements in this list.
265 *
266 * @return the number of elements in this list
267 */
268 public int size() {
269 return size;
270 }
271
272 /**
273 * Returns {@code true} if this list contains no elements.
274 *
275 * @return {@code true} if this list contains no elements
276 */
277 public boolean isEmpty() {
278 return size == 0;
279 }
280
281 /**
282 * Returns {@code true} if this list contains the specified element.
283 * More formally, returns {@code true} if and only if this list contains
284 * at least one element {@code e} such that
285 * {@code (o==null ? e==null : o.equals(e))}.
286 *
287 * @param o element whose presence in this list is to be tested
288 * @return {@code true} if this list contains the specified element
289 */
290 public boolean contains(Object o) {
291 return indexOf(o) >= 0;
292 }
293
294 /**
295 * Returns the index of the first occurrence of the specified element
296 * in this list, or -1 if this list does not contain the element.
297 * More formally, returns the lowest index {@code i} such that
298 * {@code (o==null ? get(i)==null : o.equals(get(i)))},
299 * or -1 if there is no such index.
300 */
301 public int indexOf(Object o) {
302 if (o == null) {
303 for (int i = 0; i < size; i++)
304 if (elementData[i]==null)
305 return i;
306 } else {
307 for (int i = 0; i < size; i++)
308 if (o.equals(elementData[i]))
309 return i;
310 }
311 return -1;
312 }
313
314 /**
315 * Returns the index of the last occurrence of the specified element
316 * in this list, or -1 if this list does not contain the element.
317 * More formally, returns the highest index {@code i} such that
318 * {@code (o==null ? get(i)==null : o.equals(get(i)))},
319 * or -1 if there is no such index.
320 */
321 public int lastIndexOf(Object o) {
322 if (o == null) {
323 for (int i = size-1; i >= 0; i--)
324 if (elementData[i]==null)
325 return i;
326 } else {
327 for (int i = size-1; i >= 0; i--)
328 if (o.equals(elementData[i]))
329 return i;
330 }
331 return -1;
332 }
333
334 /**
335 * Returns a shallow copy of this {@code ArrayList} instance. (The
336 * elements themselves are not copied.)
337 *
338 * @return a clone of this {@code ArrayList} instance
339 */
340 public Object clone() {
341 try {
342 ArrayList<?> v = (ArrayList<?>) super.clone();
343 v.elementData = Arrays.copyOf(elementData, size);
344 v.modCount = 0;
345 return v;
346 } catch (CloneNotSupportedException e) {
347 // this shouldn't happen, since we are Cloneable
348 throw new InternalError(e);
349 }
350 }
351
352 /**
353 * Returns an array containing all of the elements in this list
354 * in proper sequence (from first to last element).
355 *
356 * <p>The returned array will be "safe" in that no references to it are
357 * maintained by this list. (In other words, this method must allocate
358 * a new array). The caller is thus free to modify the returned array.
361 * APIs.
362 *
363 * @return an array containing all of the elements in this list in
364 * proper sequence
365 */
366 public Object[] toArray() {
367 return Arrays.copyOf(elementData, size);
368 }
369
370 /**
371 * Returns an array containing all of the elements in this list in proper
372 * sequence (from first to last element); the runtime type of the returned
373 * array is that of the specified array. If the list fits in the
374 * specified array, it is returned therein. Otherwise, a new array is
375 * allocated with the runtime type of the specified array and the size of
376 * this list.
377 *
378 * <p>If the list fits in the specified array with room to spare
379 * (i.e., the array has more elements than the list), the element in
380 * the array immediately following the end of the collection is set to
381 * {@code null}. (This is useful in determining the length of the
382 * list <i>only</i> if the caller knows that the list does not contain
383 * any null elements.)
384 *
385 * @param a the array into which the elements of the list are to
386 * be stored, if it is big enough; otherwise, a new array of the
387 * same runtime type is allocated for this purpose.
388 * @return an array containing the elements of the list
389 * @throws ArrayStoreException if the runtime type of the specified array
390 * is not a supertype of the runtime type of every element in
391 * this list
392 * @throws NullPointerException if the specified array is null
393 */
394 @SuppressWarnings("unchecked")
395 public <T> T[] toArray(T[] a) {
396 if (a.length < size)
397 // Make a new array of a's runtime type, but my contents:
398 return (T[]) Arrays.copyOf(elementData, size, a.getClass());
399 System.arraycopy(elementData, 0, a, 0, size);
400 if (a.length > size)
401 a[size] = null;
426 * Replaces the element at the specified position in this list with
427 * the specified element.
428 *
429 * @param index index of the element to replace
430 * @param element element to be stored at the specified position
431 * @return the element previously at the specified position
432 * @throws IndexOutOfBoundsException {@inheritDoc}
433 */
434 public E set(int index, E element) {
435 rangeCheck(index);
436
437 E oldValue = elementData(index);
438 elementData[index] = element;
439 return oldValue;
440 }
441
442 /**
443 * Appends the specified element to the end of this list.
444 *
445 * @param e element to be appended to this list
446 * @return {@code true} (as specified by {@link Collection#add})
447 */
448 public boolean add(E e) {
449 ensureCapacityInternal(size + 1); // Increments modCount!!
450 elementData[size++] = e;
451 return true;
452 }
453
454 /**
455 * Inserts the specified element at the specified position in this
456 * list. Shifts the element currently at that position (if any) and
457 * any subsequent elements to the right (adds one to their indices).
458 *
459 * @param index index at which the specified element is to be inserted
460 * @param element element to be inserted
461 * @throws IndexOutOfBoundsException {@inheritDoc}
462 */
463 public void add(int index, E element) {
464 rangeCheckForAdd(index);
465
466 ensureCapacityInternal(size + 1); // Increments modCount!!
481 */
482 public E remove(int index) {
483 rangeCheck(index);
484
485 modCount++;
486 E oldValue = elementData(index);
487
488 int numMoved = size - index - 1;
489 if (numMoved > 0)
490 System.arraycopy(elementData, index+1, elementData, index,
491 numMoved);
492 elementData[--size] = null; // clear to let GC do its work
493
494 return oldValue;
495 }
496
497 /**
498 * Removes the first occurrence of the specified element from this list,
499 * if it is present. If the list does not contain the element, it is
500 * unchanged. More formally, removes the element with the lowest index
501 * {@code i} such that
502 * {@code (o==null ? get(i)==null : o.equals(get(i)))}
503 * (if such an element exists). Returns {@code true} if this list
504 * contained the specified element (or equivalently, if this list
505 * changed as a result of the call).
506 *
507 * @param o element to be removed from this list, if present
508 * @return {@code true} if this list contained the specified element
509 */
510 public boolean remove(Object o) {
511 if (o == null) {
512 for (int index = 0; index < size; index++)
513 if (elementData[index] == null) {
514 fastRemove(index);
515 return true;
516 }
517 } else {
518 for (int index = 0; index < size; index++)
519 if (o.equals(elementData[index])) {
520 fastRemove(index);
521 return true;
522 }
523 }
524 return false;
525 }
526
527 /*
528 * Private remove method that skips bounds checking and does not
544 public void clear() {
545 modCount++;
546
547 // clear to let GC do its work
548 for (int i = 0; i < size; i++)
549 elementData[i] = null;
550
551 size = 0;
552 }
553
554 /**
555 * Appends all of the elements in the specified collection to the end of
556 * this list, in the order that they are returned by the
557 * specified collection's Iterator. The behavior of this operation is
558 * undefined if the specified collection is modified while the operation
559 * is in progress. (This implies that the behavior of this call is
560 * undefined if the specified collection is this list, and this
561 * list is nonempty.)
562 *
563 * @param c collection containing elements to be added to this list
564 * @return {@code true} if this list changed as a result of the call
565 * @throws NullPointerException if the specified collection is null
566 */
567 public boolean addAll(Collection<? extends E> c) {
568 Object[] a = c.toArray();
569 int numNew = a.length;
570 ensureCapacityInternal(size + numNew); // Increments modCount
571 System.arraycopy(a, 0, elementData, size, numNew);
572 size += numNew;
573 return numNew != 0;
574 }
575
576 /**
577 * Inserts all of the elements in the specified collection into this
578 * list, starting at the specified position. Shifts the element
579 * currently at that position (if any) and any subsequent elements to
580 * the right (increases their indices). The new elements will appear
581 * in the list in the order that they are returned by the
582 * specified collection's iterator.
583 *
584 * @param index index at which to insert the first element from the
585 * specified collection
586 * @param c collection containing elements to be added to this list
587 * @return {@code true} if this list changed as a result of the call
588 * @throws IndexOutOfBoundsException {@inheritDoc}
589 * @throws NullPointerException if the specified collection is null
590 */
591 public boolean addAll(int index, Collection<? extends E> c) {
592 rangeCheckForAdd(index);
593
594 Object[] a = c.toArray();
595 int numNew = a.length;
596 ensureCapacityInternal(size + numNew); // Increments modCount
597
598 int numMoved = size - index;
599 if (numMoved > 0)
600 System.arraycopy(elementData, index, elementData, index + numNew,
601 numMoved);
602
603 System.arraycopy(a, 0, elementData, index, numNew);
604 size += numNew;
605 return numNew != 0;
606 }
607
715 // even if c.contains() throws.
716 if (r != size) {
717 System.arraycopy(elementData, r,
718 elementData, w,
719 size - r);
720 w += size - r;
721 }
722 if (w != size) {
723 // clear to let GC do its work
724 for (int i = w; i < size; i++)
725 elementData[i] = null;
726 modCount += size - w;
727 size = w;
728 modified = true;
729 }
730 }
731 return modified;
732 }
733
734 /**
735 * Save the state of the {@code ArrayList} instance to a stream (that
736 * is, serialize it).
737 *
738 * @serialData The length of the array backing the {@code ArrayList}
739 * instance is emitted (int), followed by all of its elements
740 * (each an {@code Object}) in the proper order.
741 */
742 private void writeObject(java.io.ObjectOutputStream s)
743 throws java.io.IOException{
744 // Write out element count, and any hidden stuff
745 int expectedModCount = modCount;
746 s.defaultWriteObject();
747
748 // Write out size as capacity for behavioural compatibility with clone()
749 s.writeInt(size);
750
751 // Write out all elements in the proper order.
752 for (int i=0; i<size; i++) {
753 s.writeObject(elementData[i]);
754 }
755
756 if (modCount != expectedModCount) {
757 throw new ConcurrentModificationException();
758 }
759 }
760
761 /**
762 * Reconstitute the {@code ArrayList} instance from a stream (that is,
763 * deserialize it).
764 */
765 private void readObject(java.io.ObjectInputStream s)
766 throws java.io.IOException, ClassNotFoundException {
767 elementData = EMPTY_ELEMENTDATA;
768
769 // Read in size, and any hidden stuff
770 s.defaultReadObject();
771
772 // Read in capacity
773 s.readInt(); // ignored
774
775 if (size > 0) {
776 // be like clone(), allocate array based upon size not capacity
777 ensureCapacityInternal(size);
778
779 Object[] a = elementData;
780 // Read in all elements in the proper order.
781 for (int i=0; i<size; i++) {
782 a[i] = s.readObject();
|