1 /*
2  * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
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.UnaryOperator;
29 
30 // Android-removed: removed link to collections framework docs
31 /**
32  * An ordered collection, where the user has precise control over where in the
33  * list each element is inserted.  The user can access elements by their integer
34  * index (position in the list), and search for elements in the list.<p>
35  *
36  * Unlike sets, lists typically allow duplicate elements.  More formally,
37  * lists typically allow pairs of elements {@code e1} and {@code e2}
38  * such that {@code e1.equals(e2)}, and they typically allow multiple
39  * null elements if they allow null elements at all.  It is not inconceivable
40  * that someone might wish to implement a list that prohibits duplicates, by
41  * throwing runtime exceptions when the user attempts to insert them, but we
42  * expect this usage to be rare.<p>
43  *
44  * The {@code List} interface places additional stipulations, beyond those
45  * specified in the {@code Collection} interface, on the contracts of the
46  * {@code iterator}, {@code add}, {@code remove}, {@code equals}, and
47  * {@code hashCode} methods.  Declarations for other inherited methods are
48  * also included here for convenience.<p>
49  *
50  * The {@code List} interface provides four methods for positional (indexed)
51  * access to list elements.  Lists (like Java arrays) are zero based.  Note
52  * that these operations may execute in time proportional to the index value
53  * for some implementations (the {@code LinkedList} class, for
54  * example). Thus, iterating over the elements in a list is typically
55  * preferable to indexing through it if the caller does not know the
56  * implementation.<p>
57  *
58  * The {@code List} interface provides a special iterator, called a
59  * {@code ListIterator}, that allows element insertion and replacement, and
60  * bidirectional access in addition to the normal operations that the
61  * {@code Iterator} interface provides.  A method is provided to obtain a
62  * list iterator that starts at a specified position in the list.<p>
63  *
64  * The {@code List} interface provides two methods to search for a specified
65  * object.  From a performance standpoint, these methods should be used with
66  * caution.  In many implementations they will perform costly linear
67  * searches.<p>
68  *
69  * The {@code List} interface provides two methods to efficiently insert and
70  * remove multiple elements at an arbitrary point in the list.<p>
71  *
72  * Note: While it is permissible for lists to contain themselves as elements,
73  * extreme caution is advised: the {@code equals} and {@code hashCode}
74  * methods are no longer well defined on such a list.
75  *
76  * <p>Some list implementations have restrictions on the elements that
77  * they may contain.  For example, some implementations prohibit null elements,
78  * and some have restrictions on the types of their elements.  Attempting to
79  * add an ineligible element throws an unchecked exception, typically
80  * {@code NullPointerException} or {@code ClassCastException}.  Attempting
81  * to query the presence of an ineligible element may throw an exception,
82  * or it may simply return false; some implementations will exhibit the former
83  * behavior and some will exhibit the latter.  More generally, attempting an
84  * operation on an ineligible element whose completion would not result in
85  * the insertion of an ineligible element into the list may throw an
86  * exception or it may succeed, at the option of the implementation.
87  * Such exceptions are marked as "optional" in the specification for this
88  * interface.
89  *
90  * <h2><a id="unmodifiable">Unmodifiable Lists</a></h2>
91  * <p>The {@link List#of(Object...) List.of} and
92  * {@link List#copyOf List.copyOf} static factory methods
93  * provide a convenient way to create unmodifiable lists. The {@code List}
94  * instances created by these methods have the following characteristics:
95  *
96  * <ul>
97  * <li>They are <a href="Collection.html#unmodifiable"><i>unmodifiable</i></a>. Elements cannot
98  * be added, removed, or replaced. Calling any mutator method on the List
99  * will always cause {@code UnsupportedOperationException} to be thrown.
100  * However, if the contained elements are themselves mutable,
101  * this may cause the List's contents to appear to change.
102  * <li>They disallow {@code null} elements. Attempts to create them with
103  * {@code null} elements result in {@code NullPointerException}.
104  * <li>They are serializable if all elements are serializable.
105  * <li>The order of elements in the list is the same as the order of the
106  * provided arguments, or of the elements in the provided array.
107  * <li>The lists and their {@link #subList(int, int) subList} views implement the
108  * {@link RandomAccess} interface.
109  * <li>They are <a href="../lang/doc-files/ValueBased.html">value-based</a>.
110  * Programmers should treat instances that are {@linkplain #equals(Object) equal}
111  * as interchangeable and should not use them for synchronization, or
112  * unpredictable behavior may occur. For example, in a future release,
113  * synchronization may fail. Callers should make no assumptions about the
114  * identity of the returned instances. Factories are free to
115  * create new instances or reuse existing ones.
116  * <li>They are serialized as specified on the
117  * <a href="{@docRoot}/serialized-form.html#java.util.CollSer">Serialized Form</a>
118  * page.
119  * </ul>
120  *
121  * @param <E> the type of elements in this list
122  *
123  * @author  Josh Bloch
124  * @author  Neal Gafter
125  * @see Collection
126  * @see Set
127  * @see ArrayList
128  * @see LinkedList
129  * @see Vector
130  * @see Arrays#asList(Object[])
131  * @see Collections#nCopies(int, Object)
132  * @see Collections#EMPTY_LIST
133  * @see AbstractList
134  * @see AbstractSequentialList
135  * @since 1.2
136  */
137 
138 public interface List<E> extends SequencedCollection<E>, Collection<E> {
139     // Query Operations
140 
141     /**
142      * Returns the number of elements in this list.  If this list contains
143      * more than {@code Integer.MAX_VALUE} elements, returns
144      * {@code Integer.MAX_VALUE}.
145      *
146      * @return the number of elements in this list
147      */
size()148     int size();
149 
150     /**
151      * Returns {@code true} if this list contains no elements.
152      *
153      * @return {@code true} if this list contains no elements
154      */
isEmpty()155     boolean isEmpty();
156 
157     /**
158      * Returns {@code true} if this list contains the specified element.
159      * More formally, returns {@code true} if and only if this list contains
160      * at least one element {@code e} such that
161      * {@code Objects.equals(o, e)}.
162      *
163      * @param o element whose presence in this list is to be tested
164      * @return {@code true} if this list contains the specified element
165      * @throws ClassCastException if the type of the specified element
166      *         is incompatible with this list
167      * (<a href="Collection.html#optional-restrictions">optional</a>)
168      * @throws NullPointerException if the specified element is null and this
169      *         list does not permit null elements
170      * (<a href="Collection.html#optional-restrictions">optional</a>)
171      */
contains(Object o)172     boolean contains(Object o);
173 
174     /**
175      * Returns an iterator over the elements in this list in proper sequence.
176      *
177      * @return an iterator over the elements in this list in proper sequence
178      */
iterator()179     Iterator<E> iterator();
180 
181     /**
182      * Returns an array containing all of the elements in this list in proper
183      * sequence (from first to last element).
184      *
185      * <p>The returned array will be "safe" in that no references to it are
186      * maintained by this list.  (In other words, this method must
187      * allocate a new array even if this list is backed by an array).
188      * The caller is thus free to modify the returned array.
189      *
190      * <p>This method acts as bridge between array-based and collection-based
191      * APIs.
192      *
193      * @return an array containing all of the elements in this list in proper
194      *         sequence
195      * @see Arrays#asList(Object[])
196      */
toArray()197     Object[] toArray();
198 
199     /**
200      * Returns an array containing all of the elements in this list in
201      * proper sequence (from first to last element); the runtime type of
202      * the returned array is that of the specified array.  If the list fits
203      * in the specified array, it is returned therein.  Otherwise, a new
204      * array is allocated with the runtime type of the specified array and
205      * the size of this list.
206      *
207      * <p>If the list fits in the specified array with room to spare (i.e.,
208      * the array has more elements than the list), the element in the array
209      * immediately following the end of the list is set to {@code null}.
210      * (This is useful in determining the length of the list <i>only</i> if
211      * the caller knows that the list does not contain any null elements.)
212      *
213      * <p>Like the {@link #toArray()} method, this method acts as bridge between
214      * array-based and collection-based APIs.  Further, this method allows
215      * precise control over the runtime type of the output array, and may,
216      * under certain circumstances, be used to save allocation costs.
217      *
218      * <p>Suppose {@code x} is a list known to contain only strings.
219      * The following code can be used to dump the list into a newly
220      * allocated array of {@code String}:
221      *
222      * <pre>{@code
223      *     String[] y = x.toArray(new String[0]);
224      * }</pre>
225      *
226      * Note that {@code toArray(new Object[0])} is identical in function to
227      * {@code toArray()}.
228      *
229      * @param a the array into which the elements of this list are to
230      *          be stored, if it is big enough; otherwise, a new array of the
231      *          same runtime type is allocated for this purpose.
232      * @return an array containing the elements of this list
233      * @throws ArrayStoreException if the runtime type of the specified array
234      *         is not a supertype of the runtime type of every element in
235      *         this list
236      * @throws NullPointerException if the specified array is null
237      */
toArray(T[] a)238     <T> T[] toArray(T[] a);
239 
240 
241     // Modification Operations
242 
243     /**
244      * Appends the specified element to the end of this list (optional
245      * operation).
246      *
247      * <p>Lists that support this operation may place limitations on what
248      * elements may be added to this list.  In particular, some
249      * lists will refuse to add null elements, and others will impose
250      * restrictions on the type of elements that may be added.  List
251      * classes should clearly specify in their documentation any restrictions
252      * on what elements may be added.
253      *
254      * @param e element to be appended to this list
255      * @return {@code true} (as specified by {@link Collection#add})
256      * @throws UnsupportedOperationException if the {@code add} operation
257      *         is not supported by this list
258      * @throws ClassCastException if the class of the specified element
259      *         prevents it from being added to this list
260      * @throws NullPointerException if the specified element is null and this
261      *         list does not permit null elements
262      * @throws IllegalArgumentException if some property of this element
263      *         prevents it from being added to this list
264      */
add(E e)265     boolean add(E e);
266 
267     /**
268      * Removes the first occurrence of the specified element from this list,
269      * if it is present (optional operation).  If this list does not contain
270      * the element, it is unchanged.  More formally, removes the element with
271      * the lowest index {@code i} such that
272      * {@code Objects.equals(o, get(i))}
273      * (if such an element exists).  Returns {@code true} if this list
274      * contained the specified element (or equivalently, if this list changed
275      * as a result of the call).
276      *
277      * @param o element to be removed from this list, if present
278      * @return {@code true} if this list contained the specified element
279      * @throws ClassCastException if the type of the specified element
280      *         is incompatible with this list
281      * (<a href="Collection.html#optional-restrictions">optional</a>)
282      * @throws NullPointerException if the specified element is null and this
283      *         list does not permit null elements
284      * (<a href="Collection.html#optional-restrictions">optional</a>)
285      * @throws UnsupportedOperationException if the {@code remove} operation
286      *         is not supported by this list
287      */
remove(Object o)288     boolean remove(Object o);
289 
290 
291     // Bulk Modification Operations
292 
293     /**
294      * Returns {@code true} if this list contains all of the elements of the
295      * specified collection.
296      *
297      * @param  c collection to be checked for containment in this list
298      * @return {@code true} if this list contains all of the elements of the
299      *         specified collection
300      * @throws ClassCastException if the types of one or more elements
301      *         in the specified collection are incompatible with this
302      *         list
303      * (<a href="Collection.html#optional-restrictions">optional</a>)
304      * @throws NullPointerException if the specified collection contains one
305      *         or more null elements and this list does not permit null
306      *         elements
307      *         (<a href="Collection.html#optional-restrictions">optional</a>),
308      *         or if the specified collection is null
309      * @see #contains(Object)
310      */
containsAll(Collection<?> c)311     boolean containsAll(Collection<?> c);
312 
313     /**
314      * Appends all of the elements in the specified collection to the end of
315      * this list, in the order that they are returned by the specified
316      * collection's iterator (optional operation).  The behavior of this
317      * operation is undefined if the specified collection is modified while
318      * the operation is in progress.  (Note that this will occur if the
319      * specified collection is this list, and it's nonempty.)
320      *
321      * @param c collection containing elements to be added to this list
322      * @return {@code true} if this list changed as a result of the call
323      * @throws UnsupportedOperationException if the {@code addAll} operation
324      *         is not supported by this list
325      * @throws ClassCastException if the class of an element of the specified
326      *         collection prevents it from being added to this list
327      * @throws NullPointerException if the specified collection contains one
328      *         or more null elements and this list does not permit null
329      *         elements, or if the specified collection is null
330      * @throws IllegalArgumentException if some property of an element of the
331      *         specified collection prevents it from being added to this list
332      * @see #add(Object)
333      */
addAll(Collection<? extends E> c)334     boolean addAll(Collection<? extends E> c);
335 
336     /**
337      * Inserts all of the elements in the specified collection into this
338      * list at the specified position (optional operation).  Shifts the
339      * element currently at that position (if any) and any subsequent
340      * elements to the right (increases their indices).  The new elements
341      * will appear in this list in the order that they are returned by the
342      * specified collection's iterator.  The behavior of this operation is
343      * undefined if the specified collection is modified while the
344      * operation is in progress.  (Note that this will occur if the specified
345      * collection is this list, and it's nonempty.)
346      *
347      * @param index index at which to insert the first element from the
348      *              specified collection
349      * @param c collection containing elements to be added to this list
350      * @return {@code true} if this list changed as a result of the call
351      * @throws UnsupportedOperationException if the {@code addAll} operation
352      *         is not supported by this list
353      * @throws ClassCastException if the class of an element of the specified
354      *         collection prevents it from being added to this list
355      * @throws NullPointerException if the specified collection contains one
356      *         or more null elements and this list does not permit null
357      *         elements, or if the specified collection is null
358      * @throws IllegalArgumentException if some property of an element of the
359      *         specified collection prevents it from being added to this list
360      * @throws IndexOutOfBoundsException if the index is out of range
361      *         ({@code index < 0 || index > size()})
362      */
addAll(int index, Collection<? extends E> c)363     boolean addAll(int index, Collection<? extends E> c);
364 
365     /**
366      * Removes from this list all of its elements that are contained in the
367      * specified collection (optional operation).
368      *
369      * @param c collection containing elements to be removed from this list
370      * @return {@code true} if this list changed as a result of the call
371      * @throws UnsupportedOperationException if the {@code removeAll} operation
372      *         is not supported by this list
373      * @throws ClassCastException if the class of an element of this list
374      *         is incompatible with the specified collection
375      * (<a href="Collection.html#optional-restrictions">optional</a>)
376      * @throws NullPointerException if this list contains a null element and the
377      *         specified collection does not permit null elements
378      *         (<a href="Collection.html#optional-restrictions">optional</a>),
379      *         or if the specified collection is null
380      * @see #remove(Object)
381      * @see #contains(Object)
382      */
removeAll(Collection<?> c)383     boolean removeAll(Collection<?> c);
384 
385     /**
386      * Retains only the elements in this list that are contained in the
387      * specified collection (optional operation).  In other words, removes
388      * from this list all of its elements that are not contained in the
389      * specified collection.
390      *
391      * @param c collection containing elements to be retained in this list
392      * @return {@code true} if this list changed as a result of the call
393      * @throws UnsupportedOperationException if the {@code retainAll} operation
394      *         is not supported by this list
395      * @throws ClassCastException if the class of an element of this list
396      *         is incompatible with the specified collection
397      * (<a href="Collection.html#optional-restrictions">optional</a>)
398      * @throws NullPointerException if this list contains a null element and the
399      *         specified collection does not permit null elements
400      *         (<a href="Collection.html#optional-restrictions">optional</a>),
401      *         or if the specified collection is null
402      * @see #remove(Object)
403      * @see #contains(Object)
404      */
retainAll(Collection<?> c)405     boolean retainAll(Collection<?> c);
406 
407     /**
408      * Replaces each element of this list with the result of applying the
409      * operator to that element.  Errors or runtime exceptions thrown by
410      * the operator are relayed to the caller.
411      *
412      * @implSpec
413      * The default implementation is equivalent to, for this {@code list}:
414      * <pre>{@code
415      *     final ListIterator<E> li = list.listIterator();
416      *     while (li.hasNext()) {
417      *         li.set(operator.apply(li.next()));
418      *     }
419      * }</pre>
420      *
421      * If the list's list-iterator does not support the {@code set} operation
422      * then an {@code UnsupportedOperationException} will be thrown when
423      * replacing the first element.
424      *
425      * @param operator the operator to apply to each element
426      * @throws UnsupportedOperationException if this list is unmodifiable.
427      *         Implementations may throw this exception if an element
428      *         cannot be replaced or if, in general, modification is not
429      *         supported
430      * @throws NullPointerException if the specified operator is null or
431      *         if the operator result is a null value and this list does
432      *         not permit null elements
433      *         (<a href="Collection.html#optional-restrictions">optional</a>)
434      * @since 1.8
435      */
replaceAll(UnaryOperator<E> operator)436     default void replaceAll(UnaryOperator<E> operator) {
437         Objects.requireNonNull(operator);
438         final ListIterator<E> li = this.listIterator();
439         while (li.hasNext()) {
440             li.set(operator.apply(li.next()));
441         }
442     }
443 
444     // Android-added: List.sort() vs. Collections.sort() app compat.
445     // Added a warning in the documentation.
446     // Collections.sort() calls List.sort() for apps targeting API version >= 26
447     // (Android Oreo) but the other way around for app targeting <= 25 (Nougat).
448     /**
449      * Sorts this list according to the order induced by the specified
450      * {@link Comparator}.
451      *
452      * <p>All elements in this list must be <i>mutually comparable</i> using the
453      * specified comparator (that is, {@code c.compare(e1, e2)} must not throw
454      * a {@code ClassCastException} for any elements {@code e1} and {@code e2}
455      * in the list).
456      *
457      * <p>If the specified comparator is {@code null} then all elements in this
458      * list must implement the {@link Comparable} interface and the elements'
459      * {@linkplain Comparable natural ordering} should be used.
460      *
461      * <p>This list must be modifiable, but need not be resizable.
462      *
463      * <p>For apps running on and targeting Android versions greater than
464      * Nougat (API level {@code > 25}), {@link Collections#sort(List)}
465      * delegates to this method. Such apps must not call
466      * {@link Collections#sort(List)} from this method. Instead, prefer
467      * not overriding this method at all. If you must override it, consider
468      * this implementation:
469      * <pre>
470      * &#064;Override
471      * public void sort(Comparator&lt;? super E&gt; c) {
472      *   Object[] elements = toArray();
473      *   Arrays.sort(elements, c);
474      *   ListIterator&lt;E&gt; iterator = (ListIterator&lt;Object&gt;) listIterator();
475      *   for (Object element : elements) {
476      *     iterator.next();
477      *     iterator.set((E) element);
478      *   }
479      * }
480      * </pre>
481      *
482      * @implSpec
483      * The default implementation obtains an array containing all elements in
484      * this list, sorts the array, and iterates over this list resetting each
485      * element from the corresponding position in the array. (This avoids the
486      * n<sup>2</sup> log(n) performance that would result from attempting
487      * to sort a linked list in place.)
488      *
489      * @implNote
490      * This implementation is a stable, adaptive, iterative mergesort that
491      * requires far fewer than n lg(n) comparisons when the input array is
492      * partially sorted, while offering the performance of a traditional
493      * mergesort when the input array is randomly ordered.  If the input array
494      * is nearly sorted, the implementation requires approximately n
495      * comparisons.  Temporary storage requirements vary from a small constant
496      * for nearly sorted input arrays to n/2 object references for randomly
497      * ordered input arrays.
498      *
499      * <p>The implementation takes equal advantage of ascending and
500      * descending order in its input array, and can take advantage of
501      * ascending and descending order in different parts of the same
502      * input array.  It is well-suited to merging two or more sorted arrays:
503      * simply concatenate the arrays and sort the resulting array.
504      *
505      * <p>The implementation was adapted from Tim Peters's list sort for Python
506      * (<a href="http://svn.python.org/projects/python/trunk/Objects/listsort.txt">
507      * TimSort</a>).  It uses techniques from Peter McIlroy's "Optimistic
508      * Sorting and Information Theoretic Complexity", in Proceedings of the
509      * Fourth Annual ACM-SIAM Symposium on Discrete Algorithms, pp 467-474,
510      * January 1993.
511      *
512      * @param c the {@code Comparator} used to compare list elements.
513      *          A {@code null} value indicates that the elements'
514      *          {@linkplain Comparable natural ordering} should be used
515      * @throws ClassCastException if the list contains elements that are not
516      *         <i>mutually comparable</i> using the specified comparator
517      * @throws UnsupportedOperationException if the list's list-iterator does
518      *         not support the {@code set} operation
519      * @throws IllegalArgumentException
520      *         (<a href="Collection.html#optional-restrictions">optional</a>)
521      *         if the comparator is found to violate the {@link Comparator}
522      *         contract
523      * @since 1.8
524      */
525     @SuppressWarnings({"unchecked", "rawtypes"})
sort(Comparator<? super E> c)526     default void sort(Comparator<? super E> c) {
527         Object[] a = this.toArray();
528         Arrays.sort(a, (Comparator) c);
529         ListIterator<E> i = this.listIterator();
530         for (Object e : a) {
531             i.next();
532             i.set((E) e);
533         }
534     }
535 
536     /**
537      * Removes all of the elements from this list (optional operation).
538      * The list will be empty after this call returns.
539      *
540      * @throws UnsupportedOperationException if the {@code clear} operation
541      *         is not supported by this list
542      */
clear()543     void clear();
544 
545 
546     // Comparison and hashing
547 
548     /**
549      * Compares the specified object with this list for equality.  Returns
550      * {@code true} if and only if the specified object is also a list, both
551      * lists have the same size, and all corresponding pairs of elements in
552      * the two lists are <i>equal</i>.  (Two elements {@code e1} and
553      * {@code e2} are <i>equal</i> if {@code Objects.equals(e1, e2)}.)
554      * In other words, two lists are defined to be
555      * equal if they contain the same elements in the same order.  This
556      * definition ensures that the equals method works properly across
557      * different implementations of the {@code List} interface.
558      *
559      * @param o the object to be compared for equality with this list
560      * @return {@code true} if the specified object is equal to this list
561      */
equals(Object o)562     boolean equals(Object o);
563 
564     /**
565      * Returns the hash code value for this list.  The hash code of a list
566      * is defined to be the result of the following calculation:
567      * <pre>{@code
568      *     int hashCode = 1;
569      *     for (E e : list)
570      *         hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
571      * }</pre>
572      * This ensures that {@code list1.equals(list2)} implies that
573      * {@code list1.hashCode()==list2.hashCode()} for any two lists,
574      * {@code list1} and {@code list2}, as required by the general
575      * contract of {@link Object#hashCode}.
576      *
577      * @return the hash code value for this list
578      * @see Object#equals(Object)
579      * @see #equals(Object)
580      */
hashCode()581     int hashCode();
582 
583 
584     // Positional Access Operations
585 
586     /**
587      * Returns the element at the specified position in this list.
588      *
589      * @param index index of the element to return
590      * @return the element at the specified position in this list
591      * @throws IndexOutOfBoundsException if the index is out of range
592      *         ({@code index < 0 || index >= size()})
593      */
get(int index)594     E get(int index);
595 
596     /**
597      * Replaces the element at the specified position in this list with the
598      * specified element (optional operation).
599      *
600      * @param index index of the element to replace
601      * @param element element to be stored at the specified position
602      * @return the element previously at the specified position
603      * @throws UnsupportedOperationException if the {@code set} operation
604      *         is not supported by this list
605      * @throws ClassCastException if the class of the specified element
606      *         prevents it from being added to this list
607      * @throws NullPointerException if the specified element is null and
608      *         this list does not permit null elements
609      * @throws IllegalArgumentException if some property of the specified
610      *         element prevents it from being added to this list
611      * @throws IndexOutOfBoundsException if the index is out of range
612      *         ({@code index < 0 || index >= size()})
613      */
set(int index, E element)614     E set(int index, E element);
615 
616     /**
617      * Inserts the specified element at the specified position in this list
618      * (optional operation).  Shifts the element currently at that position
619      * (if any) and any subsequent elements to the right (adds one to their
620      * indices).
621      *
622      * @param index index at which the specified element is to be inserted
623      * @param element element to be inserted
624      * @throws UnsupportedOperationException if the {@code add} operation
625      *         is not supported by this list
626      * @throws ClassCastException if the class of the specified element
627      *         prevents it from being added to this list
628      * @throws NullPointerException if the specified element is null and
629      *         this list does not permit null elements
630      * @throws IllegalArgumentException if some property of the specified
631      *         element prevents it from being added to this list
632      * @throws IndexOutOfBoundsException if the index is out of range
633      *         ({@code index < 0 || index > size()})
634      */
add(int index, E element)635     void add(int index, E element);
636 
637     /**
638      * Removes the element at the specified position in this list (optional
639      * operation).  Shifts any subsequent elements to the left (subtracts one
640      * from their indices).  Returns the element that was removed from the
641      * list.
642      *
643      * @param index the index of the element to be removed
644      * @return the element previously at the specified position
645      * @throws UnsupportedOperationException if the {@code remove} operation
646      *         is not supported by this list
647      * @throws IndexOutOfBoundsException if the index is out of range
648      *         ({@code index < 0 || index >= size()})
649      */
remove(int index)650     E remove(int index);
651 
652 
653     // Search Operations
654 
655     /**
656      * Returns the index of the first occurrence of the specified element
657      * in this list, or -1 if this list does not contain the element.
658      * More formally, returns the lowest index {@code i} such that
659      * {@code Objects.equals(o, get(i))},
660      * or -1 if there is no such index.
661      *
662      * @param o element to search for
663      * @return the index of the first occurrence of the specified element in
664      *         this list, or -1 if this list does not contain the element
665      * @throws ClassCastException if the type of the specified element
666      *         is incompatible with this list
667      *         (<a href="Collection.html#optional-restrictions">optional</a>)
668      * @throws NullPointerException if the specified element is null and this
669      *         list does not permit null elements
670      *         (<a href="Collection.html#optional-restrictions">optional</a>)
671      */
indexOf(Object o)672     int indexOf(Object o);
673 
674     /**
675      * Returns the index of the last occurrence of the specified element
676      * in this list, or -1 if this list does not contain the element.
677      * More formally, returns the highest index {@code i} such that
678      * {@code Objects.equals(o, get(i))},
679      * or -1 if there is no such index.
680      *
681      * @param o element to search for
682      * @return the index of the last occurrence of the specified element in
683      *         this list, or -1 if this list does not contain the element
684      * @throws ClassCastException if the type of the specified element
685      *         is incompatible with this list
686      *         (<a href="Collection.html#optional-restrictions">optional</a>)
687      * @throws NullPointerException if the specified element is null and this
688      *         list does not permit null elements
689      *         (<a href="Collection.html#optional-restrictions">optional</a>)
690      */
lastIndexOf(Object o)691     int lastIndexOf(Object o);
692 
693 
694     // List Iterators
695 
696     /**
697      * Returns a list iterator over the elements in this list (in proper
698      * sequence).
699      *
700      * @return a list iterator over the elements in this list (in proper
701      *         sequence)
702      */
listIterator()703     ListIterator<E> listIterator();
704 
705     /**
706      * Returns a list iterator over the elements in this list (in proper
707      * sequence), starting at the specified position in the list.
708      * The specified index indicates the first element that would be
709      * returned by an initial call to {@link ListIterator#next next}.
710      * An initial call to {@link ListIterator#previous previous} would
711      * return the element with the specified index minus one.
712      *
713      * @param index index of the first element to be returned from the
714      *        list iterator (by a call to {@link ListIterator#next next})
715      * @return a list iterator over the elements in this list (in proper
716      *         sequence), starting at the specified position in the list
717      * @throws IndexOutOfBoundsException if the index is out of range
718      *         ({@code index < 0 || index > size()})
719      */
listIterator(int index)720     ListIterator<E> listIterator(int index);
721 
722     // View
723 
724     /**
725      * Returns a view of the portion of this list between the specified
726      * {@code fromIndex}, inclusive, and {@code toIndex}, exclusive.  (If
727      * {@code fromIndex} and {@code toIndex} are equal, the returned list is
728      * empty.)  The returned list is backed by this list, so non-structural
729      * changes in the returned list are reflected in this list, and vice-versa.
730      * The returned list supports all of the optional list operations supported
731      * by this list.<p>
732      *
733      * This method eliminates the need for explicit range operations (of
734      * the sort that commonly exist for arrays).  Any operation that expects
735      * a list can be used as a range operation by passing a subList view
736      * instead of a whole list.  For example, the following idiom
737      * removes a range of elements from a list:
738      * <pre>{@code
739      *      list.subList(from, to).clear();
740      * }</pre>
741      * Similar idioms may be constructed for {@code indexOf} and
742      * {@code lastIndexOf}, and all of the algorithms in the
743      * {@code Collections} class can be applied to a subList.<p>
744      *
745      * The semantics of the list returned by this method become undefined if
746      * the backing list (i.e., this list) is <i>structurally modified</i> in
747      * any way other than via the returned list.  (Structural modifications are
748      * those that change the size of this list, or otherwise perturb it in such
749      * a fashion that iterations in progress may yield incorrect results.)
750      *
751      * @param fromIndex low endpoint (inclusive) of the subList
752      * @param toIndex high endpoint (exclusive) of the subList
753      * @return a view of the specified range within this list
754      * @throws IndexOutOfBoundsException for an illegal endpoint index value
755      *         ({@code fromIndex < 0 || toIndex > size ||
756      *         fromIndex > toIndex})
757      */
subList(int fromIndex, int toIndex)758     List<E> subList(int fromIndex, int toIndex);
759 
760     /**
761      * Creates a {@link Spliterator} over the elements in this list.
762      *
763      * <p>The {@code Spliterator} reports {@link Spliterator#SIZED} and
764      * {@link Spliterator#ORDERED}.  Implementations should document the
765      * reporting of additional characteristic values.
766      *
767      * @implSpec
768      * The default implementation creates a
769      * <em><a href="Spliterator.html#binding">late-binding</a></em>
770      * spliterator as follows:
771      * <ul>
772      * <li>If the list is an instance of {@link RandomAccess} then the default
773      *     implementation creates a spliterator that traverses elements by
774      *     invoking the method {@link List#get}.  If such invocation results or
775      *     would result in an {@code IndexOutOfBoundsException} then the
776      *     spliterator will <em>fail-fast</em> and throw a
777      *     {@code ConcurrentModificationException}.
778      *     If the list is also an instance of {@link AbstractList} then the
779      *     spliterator will use the list's {@link AbstractList#modCount modCount}
780      *     field to provide additional <em>fail-fast</em> behavior.
781      * <li>Otherwise, the default implementation creates a spliterator from the
782      *     list's {@code Iterator}.  The spliterator inherits the
783      *     <em>fail-fast</em> of the list's iterator.
784      * </ul>
785      *
786      * @implNote
787      * The created {@code Spliterator} additionally reports
788      * {@link Spliterator#SUBSIZED}.
789      *
790      * @return a {@code Spliterator} over the elements in this list
791      * @since 1.8
792      */
793     @Override
spliterator()794     default Spliterator<E> spliterator() {
795         if (this instanceof RandomAccess) {
796             return new AbstractList.RandomAccessSpliterator<>(this);
797         } else {
798             return Spliterators.spliterator(this, Spliterator.ORDERED);
799         }
800     }
801 
802     // ========== SequencedCollection ==========
803 
804     /**
805      * {@inheritDoc}
806      *
807      * @implSpec
808      * The implementation in this interface calls {@code add(0, e)}.
809      *
810      * @throws NullPointerException {@inheritDoc}
811      * @throws UnsupportedOperationException {@inheritDoc}
812      * @since 21
813      */
addFirst(E e)814     default void addFirst(E e) {
815         this.add(0, e);
816     }
817 
818     /**
819      * {@inheritDoc}
820      *
821      * @implSpec
822      * The implementation in this interface calls {@code add(e)}.
823      *
824      * @throws NullPointerException {@inheritDoc}
825      * @throws UnsupportedOperationException {@inheritDoc}
826      * @since 21
827      */
addLast(E e)828     default void addLast(E e) {
829         this.add(e);
830     }
831 
832     /**
833      * {@inheritDoc}
834      *
835      * @implSpec
836      * If this List is not empty, the implementation in this interface returns the result
837      * of calling {@code get(0)}. Otherwise, it throws {@code NoSuchElementException}.
838      *
839      * @throws NoSuchElementException {@inheritDoc}
840      * @since 21
841      */
getFirst()842     default E getFirst() {
843         if (this.isEmpty()) {
844             throw new NoSuchElementException();
845         } else {
846             return this.get(0);
847         }
848     }
849 
850     /**
851      * {@inheritDoc}
852      *
853      * @implSpec
854      * If this List is not empty, the implementation in this interface returns the result
855      * of calling {@code get(size() - 1)}. Otherwise, it throws {@code NoSuchElementException}.
856      *
857      * @throws NoSuchElementException {@inheritDoc}
858      * @since 21
859      */
getLast()860     default E getLast() {
861         if (this.isEmpty()) {
862             throw new NoSuchElementException();
863         } else {
864             return this.get(this.size() - 1);
865         }
866     }
867 
868     /**
869      * {@inheritDoc}
870      *
871      * @implSpec
872      * If this List is not empty, the implementation in this interface returns the result
873      * of calling {@code remove(0)}. Otherwise, it throws {@code NoSuchElementException}.
874      *
875      * @throws NoSuchElementException {@inheritDoc}
876      * @throws UnsupportedOperationException {@inheritDoc}
877      * @since 21
878      */
removeFirst()879     default E removeFirst() {
880         if (this.isEmpty()) {
881             throw new NoSuchElementException();
882         } else {
883             return this.remove(0);
884         }
885     }
886 
887     /**
888      * {@inheritDoc}
889      *
890      * @implSpec
891      * If this List is not empty, the implementation in this interface returns the result
892      * of calling {@code remove(size() - 1)}. Otherwise, it throws {@code NoSuchElementException}.
893      *
894      * @throws NoSuchElementException {@inheritDoc}
895      * @throws UnsupportedOperationException {@inheritDoc}
896      * @since 21
897      */
removeLast()898     default E removeLast() {
899         if (this.isEmpty()) {
900             throw new NoSuchElementException();
901         } else {
902             return this.remove(this.size() - 1);
903         }
904     }
905 
906     /**
907      * {@inheritDoc}
908      *
909      * @implSpec
910      * The implementation in this interface returns a reverse-ordered List
911      * view. The {@code reversed()} method of the view returns a reference
912      * to this List. Other operations on the view are implemented via calls to
913      * public methods on this List. The exact relationship between calls on the
914      * view and calls on this List is unspecified. However, order-sensitive
915      * operations generally delegate to the appropriate method with the opposite
916      * orientation. For example, calling {@code getFirst} on the view results in
917      * a call to {@code getLast} on this List.
918      *
919      * @return a reverse-ordered view of this collection, as a {@code List}
920      * @since 21
921      */
reversed()922     default List<E> reversed() {
923         return ReverseOrderListView.of(this, true); // we must assume it's modifiable
924     }
925 
926     // ========== static methods ==========
927 
928     /**
929      * Returns an unmodifiable list containing zero elements.
930      *
931      * See <a href="#unmodifiable">Unmodifiable Lists</a> for details.
932      *
933      * @param <E> the {@code List}'s element type
934      * @return an empty {@code List}
935      *
936      * @since 9
937      */
938     @SuppressWarnings("unchecked")
of()939     static <E> List<E> of() {
940         return (List<E>) ImmutableCollections.EMPTY_LIST;
941     }
942 
943     /**
944      * Returns an unmodifiable list containing one element.
945      *
946      * See <a href="#unmodifiable">Unmodifiable Lists</a> for details.
947      *
948      * @param <E> the {@code List}'s element type
949      * @param e1 the single element
950      * @return a {@code List} containing the specified element
951      * @throws NullPointerException if the element is {@code null}
952      *
953      * @since 9
954      */
of(E e1)955     static <E> List<E> of(E e1) {
956         return new ImmutableCollections.List12<>(e1);
957     }
958 
959     /**
960      * Returns an unmodifiable list containing two elements.
961      *
962      * See <a href="#unmodifiable">Unmodifiable Lists</a> for details.
963      *
964      * @param <E> the {@code List}'s element type
965      * @param e1 the first element
966      * @param e2 the second element
967      * @return a {@code List} containing the specified elements
968      * @throws NullPointerException if an element is {@code null}
969      *
970      * @since 9
971      */
of(E e1, E e2)972     static <E> List<E> of(E e1, E e2) {
973         return new ImmutableCollections.List12<>(e1, e2);
974     }
975 
976     /**
977      * Returns an unmodifiable list containing three elements.
978      *
979      * See <a href="#unmodifiable">Unmodifiable Lists</a> for details.
980      *
981      * @param <E> the {@code List}'s element type
982      * @param e1 the first element
983      * @param e2 the second element
984      * @param e3 the third element
985      * @return a {@code List} containing the specified elements
986      * @throws NullPointerException if an element is {@code null}
987      *
988      * @since 9
989      */
of(E e1, E e2, E e3)990     static <E> List<E> of(E e1, E e2, E e3) {
991         return ImmutableCollections.listFromTrustedArray(e1, e2, e3);
992     }
993 
994     /**
995      * Returns an unmodifiable list containing four elements.
996      *
997      * See <a href="#unmodifiable">Unmodifiable Lists</a> for details.
998      *
999      * @param <E> the {@code List}'s element type
1000      * @param e1 the first element
1001      * @param e2 the second element
1002      * @param e3 the third element
1003      * @param e4 the fourth element
1004      * @return a {@code List} containing the specified elements
1005      * @throws NullPointerException if an element is {@code null}
1006      *
1007      * @since 9
1008      */
of(E e1, E e2, E e3, E e4)1009     static <E> List<E> of(E e1, E e2, E e3, E e4) {
1010         return ImmutableCollections.listFromTrustedArray(e1, e2, e3, e4);
1011     }
1012 
1013     /**
1014      * Returns an unmodifiable list containing five elements.
1015      *
1016      * See <a href="#unmodifiable">Unmodifiable Lists</a> for details.
1017      *
1018      * @param <E> the {@code List}'s element type
1019      * @param e1 the first element
1020      * @param e2 the second element
1021      * @param e3 the third element
1022      * @param e4 the fourth element
1023      * @param e5 the fifth element
1024      * @return a {@code List} containing the specified elements
1025      * @throws NullPointerException if an element is {@code null}
1026      *
1027      * @since 9
1028      */
of(E e1, E e2, E e3, E e4, E e5)1029     static <E> List<E> of(E e1, E e2, E e3, E e4, E e5) {
1030         return ImmutableCollections.listFromTrustedArray(e1, e2, e3, e4, e5);
1031     }
1032 
1033     /**
1034      * Returns an unmodifiable list containing six elements.
1035      *
1036      * See <a href="#unmodifiable">Unmodifiable Lists</a> for details.
1037      *
1038      * @param <E> the {@code List}'s element type
1039      * @param e1 the first element
1040      * @param e2 the second element
1041      * @param e3 the third element
1042      * @param e4 the fourth element
1043      * @param e5 the fifth element
1044      * @param e6 the sixth element
1045      * @return a {@code List} containing the specified elements
1046      * @throws NullPointerException if an element is {@code null}
1047      *
1048      * @since 9
1049      */
of(E e1, E e2, E e3, E e4, E e5, E e6)1050     static <E> List<E> of(E e1, E e2, E e3, E e4, E e5, E e6) {
1051         return ImmutableCollections.listFromTrustedArray(e1, e2, e3, e4, e5,
1052                                                          e6);
1053     }
1054 
1055     /**
1056      * Returns an unmodifiable list containing seven elements.
1057      *
1058      * See <a href="#unmodifiable">Unmodifiable Lists</a> for details.
1059      *
1060      * @param <E> the {@code List}'s element type
1061      * @param e1 the first element
1062      * @param e2 the second element
1063      * @param e3 the third element
1064      * @param e4 the fourth element
1065      * @param e5 the fifth element
1066      * @param e6 the sixth element
1067      * @param e7 the seventh element
1068      * @return a {@code List} containing the specified elements
1069      * @throws NullPointerException if an element is {@code null}
1070      *
1071      * @since 9
1072      */
of(E e1, E e2, E e3, E e4, E e5, E e6, E e7)1073     static <E> List<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7) {
1074         return ImmutableCollections.listFromTrustedArray(e1, e2, e3, e4, e5,
1075                                                          e6, e7);
1076     }
1077 
1078     /**
1079      * Returns an unmodifiable list containing eight elements.
1080      *
1081      * See <a href="#unmodifiable">Unmodifiable Lists</a> for details.
1082      *
1083      * @param <E> the {@code List}'s element type
1084      * @param e1 the first element
1085      * @param e2 the second element
1086      * @param e3 the third element
1087      * @param e4 the fourth element
1088      * @param e5 the fifth element
1089      * @param e6 the sixth element
1090      * @param e7 the seventh element
1091      * @param e8 the eighth element
1092      * @return a {@code List} containing the specified elements
1093      * @throws NullPointerException if an element is {@code null}
1094      *
1095      * @since 9
1096      */
of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8)1097     static <E> List<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8) {
1098         return ImmutableCollections.listFromTrustedArray(e1, e2, e3, e4, e5,
1099                                                          e6, e7, e8);
1100     }
1101 
1102     /**
1103      * Returns an unmodifiable list containing nine elements.
1104      *
1105      * See <a href="#unmodifiable">Unmodifiable Lists</a> for details.
1106      *
1107      * @param <E> the {@code List}'s element type
1108      * @param e1 the first element
1109      * @param e2 the second element
1110      * @param e3 the third element
1111      * @param e4 the fourth element
1112      * @param e5 the fifth element
1113      * @param e6 the sixth element
1114      * @param e7 the seventh element
1115      * @param e8 the eighth element
1116      * @param e9 the ninth element
1117      * @return a {@code List} containing the specified elements
1118      * @throws NullPointerException if an element is {@code null}
1119      *
1120      * @since 9
1121      */
of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9)1122     static <E> List<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9) {
1123         return ImmutableCollections.listFromTrustedArray(e1, e2, e3, e4, e5,
1124                                                          e6, e7, e8, e9);
1125     }
1126 
1127     /**
1128      * Returns an unmodifiable list containing ten elements.
1129      *
1130      * See <a href="#unmodifiable">Unmodifiable Lists</a> for details.
1131      *
1132      * @param <E> the {@code List}'s element type
1133      * @param e1 the first element
1134      * @param e2 the second element
1135      * @param e3 the third element
1136      * @param e4 the fourth element
1137      * @param e5 the fifth element
1138      * @param e6 the sixth element
1139      * @param e7 the seventh element
1140      * @param e8 the eighth element
1141      * @param e9 the ninth element
1142      * @param e10 the tenth element
1143      * @return a {@code List} containing the specified elements
1144      * @throws NullPointerException if an element is {@code null}
1145      *
1146      * @since 9
1147      */
of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9, E e10)1148     static <E> List<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9, E e10) {
1149         return ImmutableCollections.listFromTrustedArray(e1, e2, e3, e4, e5,
1150                                                          e6, e7, e8, e9, e10);
1151     }
1152 
1153     /**
1154      * Returns an unmodifiable list containing an arbitrary number of elements.
1155      * See <a href="#unmodifiable">Unmodifiable Lists</a> for details.
1156      *
1157      * @apiNote
1158      * This method also accepts a single array as an argument. The element type of
1159      * the resulting list will be the component type of the array, and the size of
1160      * the list will be equal to the length of the array. To create a list with
1161      * a single element that is an array, do the following:
1162      *
1163      * <pre>{@code
1164      *     String[] array = ... ;
1165      *     List<String[]> list = List.<String[]>of(array);
1166      * }</pre>
1167      *
1168      * This will cause the {@link List#of(Object) List.of(E)} method
1169      * to be invoked instead.
1170      *
1171      * @param <E> the {@code List}'s element type
1172      * @param elements the elements to be contained in the list
1173      * @return a {@code List} containing the specified elements
1174      * @throws NullPointerException if an element is {@code null} or if the array is {@code null}
1175      *
1176      * @since 9
1177      */
1178     @SafeVarargs
1179     @SuppressWarnings("varargs")
of(E... elements)1180     static <E> List<E> of(E... elements) {
1181         switch (elements.length) { // implicit null check of elements
1182             case 0:
1183                 @SuppressWarnings("unchecked")
1184                 var list = (List<E>) ImmutableCollections.EMPTY_LIST;
1185                 return list;
1186             case 1:
1187                 return new ImmutableCollections.List12<>(elements[0]);
1188             case 2:
1189                 return new ImmutableCollections.List12<>(elements[0], elements[1]);
1190             default:
1191                 return ImmutableCollections.listFromArray(elements);
1192         }
1193     }
1194 
1195     /**
1196      * Returns an <a href="#unmodifiable">unmodifiable List</a> containing the elements of
1197      * the given Collection, in its iteration order. The given Collection must not be null,
1198      * and it must not contain any null elements. If the given Collection is subsequently
1199      * modified, the returned List will not reflect such modifications.
1200      *
1201      * @implNote
1202      * If the given Collection is an <a href="#unmodifiable">unmodifiable List</a>,
1203      * calling copyOf will generally not create a copy.
1204      *
1205      * @param <E> the {@code List}'s element type
1206      * @param coll a {@code Collection} from which elements are drawn, must be non-null
1207      * @return a {@code List} containing the elements of the given {@code Collection}
1208      * @throws NullPointerException if coll is null, or if it contains any nulls
1209      * @since 10
1210      */
copyOf(Collection<? extends E> coll)1211     static <E> List<E> copyOf(Collection<? extends E> coll) {
1212         return ImmutableCollections.listCopy(coll);
1213     }
1214 }
1215