1215 lines
50 KiB
Java
1215 lines
50 KiB
Java
![]() |
/*
|
||
|
* Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
|
||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||
|
*
|
||
|
* This code is free software; you can redistribute it and/or modify it
|
||
|
* under the terms of the GNU General Public License version 2 only, as
|
||
|
* published by the Free Software Foundation. Oracle designates this
|
||
|
* particular file as subject to the "Classpath" exception as provided
|
||
|
* by Oracle in the LICENSE file that accompanied this code.
|
||
|
*
|
||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||
|
* accompanied this code).
|
||
|
*
|
||
|
* You should have received a copy of the GNU General Public License version
|
||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||
|
*
|
||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||
|
* or visit www.oracle.com if you need additional information or have any
|
||
|
* questions.
|
||
|
*/
|
||
|
|
||
|
package java.util;
|
||
|
|
||
|
import java.util.function.UnaryOperator;
|
||
|
|
||
|
// Android-removed: removed link to collections framework docs
|
||
|
/**
|
||
|
* An ordered collection, where the user has precise control over where in the
|
||
|
* list each element is inserted. The user can access elements by their integer
|
||
|
* index (position in the list), and search for elements in the list.<p>
|
||
|
*
|
||
|
* Unlike sets, lists typically allow duplicate elements. More formally,
|
||
|
* lists typically allow pairs of elements {@code e1} and {@code e2}
|
||
|
* such that {@code e1.equals(e2)}, and they typically allow multiple
|
||
|
* null elements if they allow null elements at all. It is not inconceivable
|
||
|
* that someone might wish to implement a list that prohibits duplicates, by
|
||
|
* throwing runtime exceptions when the user attempts to insert them, but we
|
||
|
* expect this usage to be rare.<p>
|
||
|
*
|
||
|
* The {@code List} interface places additional stipulations, beyond those
|
||
|
* specified in the {@code Collection} interface, on the contracts of the
|
||
|
* {@code iterator}, {@code add}, {@code remove}, {@code equals}, and
|
||
|
* {@code hashCode} methods. Declarations for other inherited methods are
|
||
|
* also included here for convenience.<p>
|
||
|
*
|
||
|
* The {@code List} interface provides four methods for positional (indexed)
|
||
|
* access to list elements. Lists (like Java arrays) are zero based. Note
|
||
|
* that these operations may execute in time proportional to the index value
|
||
|
* for some implementations (the {@code LinkedList} class, for
|
||
|
* example). Thus, iterating over the elements in a list is typically
|
||
|
* preferable to indexing through it if the caller does not know the
|
||
|
* implementation.<p>
|
||
|
*
|
||
|
* The {@code List} interface provides a special iterator, called a
|
||
|
* {@code ListIterator}, that allows element insertion and replacement, and
|
||
|
* bidirectional access in addition to the normal operations that the
|
||
|
* {@code Iterator} interface provides. A method is provided to obtain a
|
||
|
* list iterator that starts at a specified position in the list.<p>
|
||
|
*
|
||
|
* The {@code List} interface provides two methods to search for a specified
|
||
|
* object. From a performance standpoint, these methods should be used with
|
||
|
* caution. In many implementations they will perform costly linear
|
||
|
* searches.<p>
|
||
|
*
|
||
|
* The {@code List} interface provides two methods to efficiently insert and
|
||
|
* remove multiple elements at an arbitrary point in the list.<p>
|
||
|
*
|
||
|
* Note: While it is permissible for lists to contain themselves as elements,
|
||
|
* extreme caution is advised: the {@code equals} and {@code hashCode}
|
||
|
* methods are no longer well defined on such a list.
|
||
|
*
|
||
|
* <p>Some list implementations have restrictions on the elements that
|
||
|
* they may contain. For example, some implementations prohibit null elements,
|
||
|
* and some have restrictions on the types of their elements. Attempting to
|
||
|
* add an ineligible element throws an unchecked exception, typically
|
||
|
* {@code NullPointerException} or {@code ClassCastException}. Attempting
|
||
|
* to query the presence of an ineligible element may throw an exception,
|
||
|
* or it may simply return false; some implementations will exhibit the former
|
||
|
* behavior and some will exhibit the latter. More generally, attempting an
|
||
|
* operation on an ineligible element whose completion would not result in
|
||
|
* the insertion of an ineligible element into the list may throw an
|
||
|
* exception or it may succeed, at the option of the implementation.
|
||
|
* Such exceptions are marked as "optional" in the specification for this
|
||
|
* interface.
|
||
|
*
|
||
|
* <h2><a id="unmodifiable">Unmodifiable Lists</a></h2>
|
||
|
* <p>The {@link List#of(Object...) List.of} and
|
||
|
* {@link List#copyOf List.copyOf} static factory methods
|
||
|
* provide a convenient way to create unmodifiable lists. The {@code List}
|
||
|
* instances created by these methods have the following characteristics:
|
||
|
*
|
||
|
* <ul>
|
||
|
* <li>They are <a href="Collection.html#unmodifiable"><i>unmodifiable</i></a>. Elements cannot
|
||
|
* be added, removed, or replaced. Calling any mutator method on the List
|
||
|
* will always cause {@code UnsupportedOperationException} to be thrown.
|
||
|
* However, if the contained elements are themselves mutable,
|
||
|
* this may cause the List's contents to appear to change.
|
||
|
* <li>They disallow {@code null} elements. Attempts to create them with
|
||
|
* {@code null} elements result in {@code NullPointerException}.
|
||
|
* <li>They are serializable if all elements are serializable.
|
||
|
* <li>The order of elements in the list is the same as the order of the
|
||
|
* provided arguments, or of the elements in the provided array.
|
||
|
* <li>The lists and their {@link #subList(int, int) subList} views implement the
|
||
|
* {@link RandomAccess} interface.
|
||
|
* <li>They are <a href="../lang/doc-files/ValueBased.html">value-based</a>.
|
||
|
* Programmers should treat instances that are {@linkplain #equals(Object) equal}
|
||
|
* as interchangeable and should not use them for synchronization, or
|
||
|
* unpredictable behavior may occur. For example, in a future release,
|
||
|
* synchronization may fail. Callers should make no assumptions about the
|
||
|
* identity of the returned instances. Factories are free to
|
||
|
* create new instances or reuse existing ones.
|
||
|
* <li>They are serialized as specified on the
|
||
|
* <a href="{@docRoot}/serialized-form.html#java.util.CollSer">Serialized Form</a>
|
||
|
* page.
|
||
|
* </ul>
|
||
|
*
|
||
|
* @param <E> the type of elements in this list
|
||
|
*
|
||
|
* @author Josh Bloch
|
||
|
* @author Neal Gafter
|
||
|
* @see Collection
|
||
|
* @see Set
|
||
|
* @see ArrayList
|
||
|
* @see LinkedList
|
||
|
* @see Vector
|
||
|
* @see Arrays#asList(Object[])
|
||
|
* @see Collections#nCopies(int, Object)
|
||
|
* @see Collections#EMPTY_LIST
|
||
|
* @see AbstractList
|
||
|
* @see AbstractSequentialList
|
||
|
* @since 1.2
|
||
|
*/
|
||
|
|
||
|
public interface List<E> extends SequencedCollection<E>, Collection<E> {
|
||
|
// Query Operations
|
||
|
|
||
|
/**
|
||
|
* Returns the number of elements in this list. If this list contains
|
||
|
* more than {@code Integer.MAX_VALUE} elements, returns
|
||
|
* {@code Integer.MAX_VALUE}.
|
||
|
*
|
||
|
* @return the number of elements in this list
|
||
|
*/
|
||
|
int size();
|
||
|
|
||
|
/**
|
||
|
* Returns {@code true} if this list contains no elements.
|
||
|
*
|
||
|
* @return {@code true} if this list contains no elements
|
||
|
*/
|
||
|
boolean isEmpty();
|
||
|
|
||
|
/**
|
||
|
* Returns {@code true} if this list contains the specified element.
|
||
|
* More formally, returns {@code true} if and only if this list contains
|
||
|
* at least one element {@code e} such that
|
||
|
* {@code Objects.equals(o, e)}.
|
||
|
*
|
||
|
* @param o element whose presence in this list is to be tested
|
||
|
* @return {@code true} if this list contains the specified element
|
||
|
* @throws ClassCastException if the type of the specified element
|
||
|
* is incompatible with this list
|
||
|
* (<a href="Collection.html#optional-restrictions">optional</a>)
|
||
|
* @throws NullPointerException if the specified element is null and this
|
||
|
* list does not permit null elements
|
||
|
* (<a href="Collection.html#optional-restrictions">optional</a>)
|
||
|
*/
|
||
|
boolean contains(Object o);
|
||
|
|
||
|
/**
|
||
|
* Returns an iterator over the elements in this list in proper sequence.
|
||
|
*
|
||
|
* @return an iterator over the elements in this list in proper sequence
|
||
|
*/
|
||
|
Iterator<E> iterator();
|
||
|
|
||
|
/**
|
||
|
* Returns an array containing all of the elements in this list in proper
|
||
|
* sequence (from first to last element).
|
||
|
*
|
||
|
* <p>The returned array will be "safe" in that no references to it are
|
||
|
* maintained by this list. (In other words, this method must
|
||
|
* allocate a new array even if this list is backed by an array).
|
||
|
* The caller is thus free to modify the returned array.
|
||
|
*
|
||
|
* <p>This method acts as bridge between array-based and collection-based
|
||
|
* APIs.
|
||
|
*
|
||
|
* @return an array containing all of the elements in this list in proper
|
||
|
* sequence
|
||
|
* @see Arrays#asList(Object[])
|
||
|
*/
|
||
|
Object[] toArray();
|
||
|
|
||
|
/**
|
||
|
* Returns an array containing all of the elements in this list in
|
||
|
* proper sequence (from first to last element); the runtime type of
|
||
|
* the returned array is that of the specified array. If the list fits
|
||
|
* in the specified array, it is returned therein. Otherwise, a new
|
||
|
* array is allocated with the runtime type of the specified array and
|
||
|
* the size of this list.
|
||
|
*
|
||
|
* <p>If the list fits in the specified array with room to spare (i.e.,
|
||
|
* the array has more elements than the list), the element in the array
|
||
|
* immediately following the end of the list is set to {@code null}.
|
||
|
* (This is useful in determining the length of the list <i>only</i> if
|
||
|
* the caller knows that the list does not contain any null elements.)
|
||
|
*
|
||
|
* <p>Like the {@link #toArray()} method, this method acts as bridge between
|
||
|
* array-based and collection-based APIs. Further, this method allows
|
||
|
* precise control over the runtime type of the output array, and may,
|
||
|
* under certain circumstances, be used to save allocation costs.
|
||
|
*
|
||
|
* <p>Suppose {@code x} is a list known to contain only strings.
|
||
|
* The following code can be used to dump the list into a newly
|
||
|
* allocated array of {@code String}:
|
||
|
*
|
||
|
* <pre>{@code
|
||
|
* String[] y = x.toArray(new String[0]);
|
||
|
* }</pre>
|
||
|
*
|
||
|
* Note that {@code toArray(new Object[0])} is identical in function to
|
||
|
* {@code toArray()}.
|
||
|
*
|
||
|
* @param a the array into which the elements of this list are to
|
||
|
* be stored, if it is big enough; otherwise, a new array of the
|
||
|
* same runtime type is allocated for this purpose.
|
||
|
* @return an array containing the elements of this list
|
||
|
* @throws ArrayStoreException if the runtime type of the specified array
|
||
|
* is not a supertype of the runtime type of every element in
|
||
|
* this list
|
||
|
* @throws NullPointerException if the specified array is null
|
||
|
*/
|
||
|
<T> T[] toArray(T[] a);
|
||
|
|
||
|
|
||
|
// Modification Operations
|
||
|
|
||
|
/**
|
||
|
* Appends the specified element to the end of this list (optional
|
||
|
* operation).
|
||
|
*
|
||
|
* <p>Lists that support this operation may place limitations on what
|
||
|
* elements may be added to this list. In particular, some
|
||
|
* lists will refuse to add null elements, and others will impose
|
||
|
* restrictions on the type of elements that may be added. List
|
||
|
* classes should clearly specify in their documentation any restrictions
|
||
|
* on what elements may be added.
|
||
|
*
|
||
|
* @param e element to be appended to this list
|
||
|
* @return {@code true} (as specified by {@link Collection#add})
|
||
|
* @throws UnsupportedOperationException if the {@code add} operation
|
||
|
* is not supported by this list
|
||
|
* @throws ClassCastException if the class of the specified element
|
||
|
* prevents it from being added to this list
|
||
|
* @throws NullPointerException if the specified element is null and this
|
||
|
* list does not permit null elements
|
||
|
* @throws IllegalArgumentException if some property of this element
|
||
|
* prevents it from being added to this list
|
||
|
*/
|
||
|
boolean add(E e);
|
||
|
|
||
|
/**
|
||
|
* Removes the first occurrence of the specified element from this list,
|
||
|
* if it is present (optional operation). If this list does not contain
|
||
|
* the element, it is unchanged. More formally, removes the element with
|
||
|
* the lowest index {@code i} such that
|
||
|
* {@code Objects.equals(o, get(i))}
|
||
|
* (if such an element exists). Returns {@code true} if this list
|
||
|
* contained the specified element (or equivalently, if this list changed
|
||
|
* as a result of the call).
|
||
|
*
|
||
|
* @param o element to be removed from this list, if present
|
||
|
* @return {@code true} if this list contained the specified element
|
||
|
* @throws ClassCastException if the type of the specified element
|
||
|
* is incompatible with this list
|
||
|
* (<a href="Collection.html#optional-restrictions">optional</a>)
|
||
|
* @throws NullPointerException if the specified element is null and this
|
||
|
* list does not permit null elements
|
||
|
* (<a href="Collection.html#optional-restrictions">optional</a>)
|
||
|
* @throws UnsupportedOperationException if the {@code remove} operation
|
||
|
* is not supported by this list
|
||
|
*/
|
||
|
boolean remove(Object o);
|
||
|
|
||
|
|
||
|
// Bulk Modification Operations
|
||
|
|
||
|
/**
|
||
|
* Returns {@code true} if this list contains all of the elements of the
|
||
|
* specified collection.
|
||
|
*
|
||
|
* @param c collection to be checked for containment in this list
|
||
|
* @return {@code true} if this list contains all of the elements of the
|
||
|
* specified collection
|
||
|
* @throws ClassCastException if the types of one or more elements
|
||
|
* in the specified collection are incompatible with this
|
||
|
* list
|
||
|
* (<a href="Collection.html#optional-restrictions">optional</a>)
|
||
|
* @throws NullPointerException if the specified collection contains one
|
||
|
* or more null elements and this list does not permit null
|
||
|
* elements
|
||
|
* (<a href="Collection.html#optional-restrictions">optional</a>),
|
||
|
* or if the specified collection is null
|
||
|
* @see #contains(Object)
|
||
|
*/
|
||
|
boolean containsAll(Collection<?> c);
|
||
|
|
||
|
/**
|
||
|
* Appends all of the elements in the specified collection to the end of
|
||
|
* this list, in the order that they are returned by the specified
|
||
|
* collection's iterator (optional operation). The behavior of this
|
||
|
* operation is undefined if the specified collection is modified while
|
||
|
* the operation is in progress. (Note that this will occur if the
|
||
|
* specified collection is this list, and it's nonempty.)
|
||
|
*
|
||
|
* @param c collection containing elements to be added to this list
|
||
|
* @return {@code true} if this list changed as a result of the call
|
||
|
* @throws UnsupportedOperationException if the {@code addAll} operation
|
||
|
* is not supported by this list
|
||
|
* @throws ClassCastException if the class of an element of the specified
|
||
|
* collection prevents it from being added to this list
|
||
|
* @throws NullPointerException if the specified collection contains one
|
||
|
* or more null elements and this list does not permit null
|
||
|
* elements, or if the specified collection is null
|
||
|
* @throws IllegalArgumentException if some property of an element of the
|
||
|
* specified collection prevents it from being added to this list
|
||
|
* @see #add(Object)
|
||
|
*/
|
||
|
boolean addAll(Collection<? extends E> c);
|
||
|
|
||
|
/**
|
||
|
* Inserts all of the elements in the specified collection into this
|
||
|
* list at the specified position (optional operation). Shifts the
|
||
|
* element currently at that position (if any) and any subsequent
|
||
|
* elements to the right (increases their indices). The new elements
|
||
|
* will appear in this list in the order that they are returned by the
|
||
|
* specified collection's iterator. The behavior of this operation is
|
||
|
* undefined if the specified collection is modified while the
|
||
|
* operation is in progress. (Note that this will occur if the specified
|
||
|
* collection is this list, and it's nonempty.)
|
||
|
*
|
||
|
* @param index index at which to insert the first element from the
|
||
|
* specified collection
|
||
|
* @param c collection containing elements to be added to this list
|
||
|
* @return {@code true} if this list changed as a result of the call
|
||
|
* @throws UnsupportedOperationException if the {@code addAll} operation
|
||
|
* is not supported by this list
|
||
|
* @throws ClassCastException if the class of an element of the specified
|
||
|
* collection prevents it from being added to this list
|
||
|
* @throws NullPointerException if the specified collection contains one
|
||
|
* or more null elements and this list does not permit null
|
||
|
* elements, or if the specified collection is null
|
||
|
* @throws IllegalArgumentException if some property of an element of the
|
||
|
* specified collection prevents it from being added to this list
|
||
|
* @throws IndexOutOfBoundsException if the index is out of range
|
||
|
* ({@code index < 0 || index > size()})
|
||
|
*/
|
||
|
boolean addAll(int index, Collection<? extends E> c);
|
||
|
|
||
|
/**
|
||
|
* Removes from this list all of its elements that are contained in the
|
||
|
* specified collection (optional operation).
|
||
|
*
|
||
|
* @param c collection containing elements to be removed from this list
|
||
|
* @return {@code true} if this list changed as a result of the call
|
||
|
* @throws UnsupportedOperationException if the {@code removeAll} operation
|
||
|
* is not supported by this list
|
||
|
* @throws ClassCastException if the class of an element of this list
|
||
|
* is incompatible with the specified collection
|
||
|
* (<a href="Collection.html#optional-restrictions">optional</a>)
|
||
|
* @throws NullPointerException if this list contains a null element and the
|
||
|
* specified collection does not permit null elements
|
||
|
* (<a href="Collection.html#optional-restrictions">optional</a>),
|
||
|
* or if the specified collection is null
|
||
|
* @see #remove(Object)
|
||
|
* @see #contains(Object)
|
||
|
*/
|
||
|
boolean removeAll(Collection<?> c);
|
||
|
|
||
|
/**
|
||
|
* Retains only the elements in this list that are contained in the
|
||
|
* specified collection (optional operation). In other words, removes
|
||
|
* from this list all of its elements that are not contained in the
|
||
|
* specified collection.
|
||
|
*
|
||
|
* @param c collection containing elements to be retained in this list
|
||
|
* @return {@code true} if this list changed as a result of the call
|
||
|
* @throws UnsupportedOperationException if the {@code retainAll} operation
|
||
|
* is not supported by this list
|
||
|
* @throws ClassCastException if the class of an element of this list
|
||
|
* is incompatible with the specified collection
|
||
|
* (<a href="Collection.html#optional-restrictions">optional</a>)
|
||
|
* @throws NullPointerException if this list contains a null element and the
|
||
|
* specified collection does not permit null elements
|
||
|
* (<a href="Collection.html#optional-restrictions">optional</a>),
|
||
|
* or if the specified collection is null
|
||
|
* @see #remove(Object)
|
||
|
* @see #contains(Object)
|
||
|
*/
|
||
|
boolean retainAll(Collection<?> c);
|
||
|
|
||
|
/**
|
||
|
* Replaces each element of this list with the result of applying the
|
||
|
* operator to that element. Errors or runtime exceptions thrown by
|
||
|
* the operator are relayed to the caller.
|
||
|
*
|
||
|
* @implSpec
|
||
|
* The default implementation is equivalent to, for this {@code list}:
|
||
|
* <pre>{@code
|
||
|
* final ListIterator<E> li = list.listIterator();
|
||
|
* while (li.hasNext()) {
|
||
|
* li.set(operator.apply(li.next()));
|
||
|
* }
|
||
|
* }</pre>
|
||
|
*
|
||
|
* If the list's list-iterator does not support the {@code set} operation
|
||
|
* then an {@code UnsupportedOperationException} will be thrown when
|
||
|
* replacing the first element.
|
||
|
*
|
||
|
* @param operator the operator to apply to each element
|
||
|
* @throws UnsupportedOperationException if this list is unmodifiable.
|
||
|
* Implementations may throw this exception if an element
|
||
|
* cannot be replaced or if, in general, modification is not
|
||
|
* supported
|
||
|
* @throws NullPointerException if the specified operator is null or
|
||
|
* if the operator result is a null value and this list does
|
||
|
* not permit null elements
|
||
|
* (<a href="Collection.html#optional-restrictions">optional</a>)
|
||
|
* @since 1.8
|
||
|
*/
|
||
|
default void replaceAll(UnaryOperator<E> operator) {
|
||
|
Objects.requireNonNull(operator);
|
||
|
final ListIterator<E> li = this.listIterator();
|
||
|
while (li.hasNext()) {
|
||
|
li.set(operator.apply(li.next()));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Android-added: List.sort() vs. Collections.sort() app compat.
|
||
|
// Added a warning in the documentation.
|
||
|
// Collections.sort() calls List.sort() for apps targeting API version >= 26
|
||
|
// (Android Oreo) but the other way around for app targeting <= 25 (Nougat).
|
||
|
/**
|
||
|
* Sorts this list according to the order induced by the specified
|
||
|
* {@link Comparator}.
|
||
|
*
|
||
|
* <p>All elements in this list must be <i>mutually comparable</i> using the
|
||
|
* specified comparator (that is, {@code c.compare(e1, e2)} must not throw
|
||
|
* a {@code ClassCastException} for any elements {@code e1} and {@code e2}
|
||
|
* in the list).
|
||
|
*
|
||
|
* <p>If the specified comparator is {@code null} then all elements in this
|
||
|
* list must implement the {@link Comparable} interface and the elements'
|
||
|
* {@linkplain Comparable natural ordering} should be used.
|
||
|
*
|
||
|
* <p>This list must be modifiable, but need not be resizable.
|
||
|
*
|
||
|
* <p>For apps running on and targeting Android versions greater than
|
||
|
* Nougat (API level {@code > 25}), {@link Collections#sort(List)}
|
||
|
* delegates to this method. Such apps must not call
|
||
|
* {@link Collections#sort(List)} from this method. Instead, prefer
|
||
|
* not overriding this method at all. If you must override it, consider
|
||
|
* this implementation:
|
||
|
* <pre>
|
||
|
* @Override
|
||
|
* public void sort(Comparator<? super E> c) {
|
||
|
* Object[] elements = toArray();
|
||
|
* Arrays.sort(elements, c);
|
||
|
* ListIterator<E> iterator = (ListIterator<Object>) listIterator();
|
||
|
* for (Object element : elements) {
|
||
|
* iterator.next();
|
||
|
* iterator.set((E) element);
|
||
|
* }
|
||
|
* }
|
||
|
* </pre>
|
||
|
*
|
||
|
* @implSpec
|
||
|
* The default implementation obtains an array containing all elements in
|
||
|
* this list, sorts the array, and iterates over this list resetting each
|
||
|
* element from the corresponding position in the array. (This avoids the
|
||
|
* n<sup>2</sup> log(n) performance that would result from attempting
|
||
|
* to sort a linked list in place.)
|
||
|
*
|
||
|
* @implNote
|
||
|
* This implementation is a stable, adaptive, iterative mergesort that
|
||
|
* requires far fewer than n lg(n) comparisons when the input array is
|
||
|
* partially sorted, while offering the performance of a traditional
|
||
|
* mergesort when the input array is randomly ordered. If the input array
|
||
|
* is nearly sorted, the implementation requires approximately n
|
||
|
* comparisons. Temporary storage requirements vary from a small constant
|
||
|
* for nearly sorted input arrays to n/2 object references for randomly
|
||
|
* ordered input arrays.
|
||
|
*
|
||
|
* <p>The implementation takes equal advantage of ascending and
|
||
|
* descending order in its input array, and can take advantage of
|
||
|
* ascending and descending order in different parts of the same
|
||
|
* input array. It is well-suited to merging two or more sorted arrays:
|
||
|
* simply concatenate the arrays and sort the resulting array.
|
||
|
*
|
||
|
* <p>The implementation was adapted from Tim Peters's list sort for Python
|
||
|
* (<a href="http://svn.python.org/projects/python/trunk/Objects/listsort.txt">
|
||
|
* TimSort</a>). It uses techniques from Peter McIlroy's "Optimistic
|
||
|
* Sorting and Information Theoretic Complexity", in Proceedings of the
|
||
|
* Fourth Annual ACM-SIAM Symposium on Discrete Algorithms, pp 467-474,
|
||
|
* January 1993.
|
||
|
*
|
||
|
* @param c the {@code Comparator} used to compare list elements.
|
||
|
* A {@code null} value indicates that the elements'
|
||
|
* {@linkplain Comparable natural ordering} should be used
|
||
|
* @throws ClassCastException if the list contains elements that are not
|
||
|
* <i>mutually comparable</i> using the specified comparator
|
||
|
* @throws UnsupportedOperationException if the list's list-iterator does
|
||
|
* not support the {@code set} operation
|
||
|
* @throws IllegalArgumentException
|
||
|
* (<a href="Collection.html#optional-restrictions">optional</a>)
|
||
|
* if the comparator is found to violate the {@link Comparator}
|
||
|
* contract
|
||
|
* @since 1.8
|
||
|
*/
|
||
|
@SuppressWarnings({"unchecked", "rawtypes"})
|
||
|
default void sort(Comparator<? super E> c) {
|
||
|
Object[] a = this.toArray();
|
||
|
Arrays.sort(a, (Comparator) c);
|
||
|
ListIterator<E> i = this.listIterator();
|
||
|
for (Object e : a) {
|
||
|
i.next();
|
||
|
i.set((E) e);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Removes all of the elements from this list (optional operation).
|
||
|
* The list will be empty after this call returns.
|
||
|
*
|
||
|
* @throws UnsupportedOperationException if the {@code clear} operation
|
||
|
* is not supported by this list
|
||
|
*/
|
||
|
void clear();
|
||
|
|
||
|
|
||
|
// Comparison and hashing
|
||
|
|
||
|
/**
|
||
|
* Compares the specified object with this list for equality. Returns
|
||
|
* {@code true} if and only if the specified object is also a list, both
|
||
|
* lists have the same size, and all corresponding pairs of elements in
|
||
|
* the two lists are <i>equal</i>. (Two elements {@code e1} and
|
||
|
* {@code e2} are <i>equal</i> if {@code Objects.equals(e1, e2)}.)
|
||
|
* In other words, two lists are defined to be
|
||
|
* equal if they contain the same elements in the same order. This
|
||
|
* definition ensures that the equals method works properly across
|
||
|
* different implementations of the {@code List} interface.
|
||
|
*
|
||
|
* @param o the object to be compared for equality with this list
|
||
|
* @return {@code true} if the specified object is equal to this list
|
||
|
*/
|
||
|
boolean equals(Object o);
|
||
|
|
||
|
/**
|
||
|
* Returns the hash code value for this list. The hash code of a list
|
||
|
* is defined to be the result of the following calculation:
|
||
|
* <pre>{@code
|
||
|
* int hashCode = 1;
|
||
|
* for (E e : list)
|
||
|
* hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
|
||
|
* }</pre>
|
||
|
* This ensures that {@code list1.equals(list2)} implies that
|
||
|
* {@code list1.hashCode()==list2.hashCode()} for any two lists,
|
||
|
* {@code list1} and {@code list2}, as required by the general
|
||
|
* contract of {@link Object#hashCode}.
|
||
|
*
|
||
|
* @return the hash code value for this list
|
||
|
* @see Object#equals(Object)
|
||
|
* @see #equals(Object)
|
||
|
*/
|
||
|
int hashCode();
|
||
|
|
||
|
|
||
|
// Positional Access Operations
|
||
|
|
||
|
/**
|
||
|
* Returns the element at the specified position in this list.
|
||
|
*
|
||
|
* @param index index of the element to return
|
||
|
* @return the element at the specified position in this list
|
||
|
* @throws IndexOutOfBoundsException if the index is out of range
|
||
|
* ({@code index < 0 || index >= size()})
|
||
|
*/
|
||
|
E get(int index);
|
||
|
|
||
|
/**
|
||
|
* Replaces the element at the specified position in this list with the
|
||
|
* specified element (optional operation).
|
||
|
*
|
||
|
* @param index index of the element to replace
|
||
|
* @param element element to be stored at the specified position
|
||
|
* @return the element previously at the specified position
|
||
|
* @throws UnsupportedOperationException if the {@code set} operation
|
||
|
* is not supported by this list
|
||
|
* @throws ClassCastException if the class of the specified element
|
||
|
* prevents it from being added to this list
|
||
|
* @throws NullPointerException if the specified element is null and
|
||
|
* this list does not permit null elements
|
||
|
* @throws IllegalArgumentException if some property of the specified
|
||
|
* element prevents it from being added to this list
|
||
|
* @throws IndexOutOfBoundsException if the index is out of range
|
||
|
* ({@code index < 0 || index >= size()})
|
||
|
*/
|
||
|
E set(int index, E element);
|
||
|
|
||
|
/**
|
||
|
* Inserts the specified element at the specified position in this list
|
||
|
* (optional operation). Shifts the element currently at that position
|
||
|
* (if any) and any subsequent elements to the right (adds one to their
|
||
|
* indices).
|
||
|
*
|
||
|
* @param index index at which the specified element is to be inserted
|
||
|
* @param element element to be inserted
|
||
|
* @throws UnsupportedOperationException if the {@code add} operation
|
||
|
* is not supported by this list
|
||
|
* @throws ClassCastException if the class of the specified element
|
||
|
* prevents it from being added to this list
|
||
|
* @throws NullPointerException if the specified element is null and
|
||
|
* this list does not permit null elements
|
||
|
* @throws IllegalArgumentException if some property of the specified
|
||
|
* element prevents it from being added to this list
|
||
|
* @throws IndexOutOfBoundsException if the index is out of range
|
||
|
* ({@code index < 0 || index > size()})
|
||
|
*/
|
||
|
void add(int index, E element);
|
||
|
|
||
|
/**
|
||
|
* Removes the element at the specified position in this list (optional
|
||
|
* operation). Shifts any subsequent elements to the left (subtracts one
|
||
|
* from their indices). Returns the element that was removed from the
|
||
|
* list.
|
||
|
*
|
||
|
* @param index the index of the element to be removed
|
||
|
* @return the element previously at the specified position
|
||
|
* @throws UnsupportedOperationException if the {@code remove} operation
|
||
|
* is not supported by this list
|
||
|
* @throws IndexOutOfBoundsException if the index is out of range
|
||
|
* ({@code index < 0 || index >= size()})
|
||
|
*/
|
||
|
E remove(int index);
|
||
|
|
||
|
|
||
|
// Search Operations
|
||
|
|
||
|
/**
|
||
|
* Returns the index of the first occurrence of the specified element
|
||
|
* in this list, or -1 if this list does not contain the element.
|
||
|
* More formally, returns the lowest index {@code i} such that
|
||
|
* {@code Objects.equals(o, get(i))},
|
||
|
* or -1 if there is no such index.
|
||
|
*
|
||
|
* @param o element to search for
|
||
|
* @return the index of the first occurrence of the specified element in
|
||
|
* this list, or -1 if this list does not contain the element
|
||
|
* @throws ClassCastException if the type of the specified element
|
||
|
* is incompatible with this list
|
||
|
* (<a href="Collection.html#optional-restrictions">optional</a>)
|
||
|
* @throws NullPointerException if the specified element is null and this
|
||
|
* list does not permit null elements
|
||
|
* (<a href="Collection.html#optional-restrictions">optional</a>)
|
||
|
*/
|
||
|
int indexOf(Object o);
|
||
|
|
||
|
/**
|
||
|
* Returns the index of the last occurrence of the specified element
|
||
|
* in this list, or -1 if this list does not contain the element.
|
||
|
* More formally, returns the highest index {@code i} such that
|
||
|
* {@code Objects.equals(o, get(i))},
|
||
|
* or -1 if there is no such index.
|
||
|
*
|
||
|
* @param o element to search for
|
||
|
* @return the index of the last occurrence of the specified element in
|
||
|
* this list, or -1 if this list does not contain the element
|
||
|
* @throws ClassCastException if the type of the specified element
|
||
|
* is incompatible with this list
|
||
|
* (<a href="Collection.html#optional-restrictions">optional</a>)
|
||
|
* @throws NullPointerException if the specified element is null and this
|
||
|
* list does not permit null elements
|
||
|
* (<a href="Collection.html#optional-restrictions">optional</a>)
|
||
|
*/
|
||
|
int lastIndexOf(Object o);
|
||
|
|
||
|
|
||
|
// List Iterators
|
||
|
|
||
|
/**
|
||
|
* Returns a list iterator over the elements in this list (in proper
|
||
|
* sequence).
|
||
|
*
|
||
|
* @return a list iterator over the elements in this list (in proper
|
||
|
* sequence)
|
||
|
*/
|
||
|
ListIterator<E> listIterator();
|
||
|
|
||
|
/**
|
||
|
* Returns a list iterator over the elements in this list (in proper
|
||
|
* sequence), starting at the specified position in the list.
|
||
|
* The specified index indicates the first element that would be
|
||
|
* returned by an initial call to {@link ListIterator#next next}.
|
||
|
* An initial call to {@link ListIterator#previous previous} would
|
||
|
* return the element with the specified index minus one.
|
||
|
*
|
||
|
* @param index index of the first element to be returned from the
|
||
|
* list iterator (by a call to {@link ListIterator#next next})
|
||
|
* @return a list iterator over the elements in this list (in proper
|
||
|
* sequence), starting at the specified position in the list
|
||
|
* @throws IndexOutOfBoundsException if the index is out of range
|
||
|
* ({@code index < 0 || index > size()})
|
||
|
*/
|
||
|
ListIterator<E> listIterator(int index);
|
||
|
|
||
|
// View
|
||
|
|
||
|
/**
|
||
|
* Returns a view of the portion of this list between the specified
|
||
|
* {@code fromIndex}, inclusive, and {@code toIndex}, exclusive. (If
|
||
|
* {@code fromIndex} and {@code toIndex} are equal, the returned list is
|
||
|
* empty.) The returned list is backed by this list, so non-structural
|
||
|
* changes in the returned list are reflected in this list, and vice-versa.
|
||
|
* The returned list supports all of the optional list operations supported
|
||
|
* by this list.<p>
|
||
|
*
|
||
|
* This method eliminates the need for explicit range operations (of
|
||
|
* the sort that commonly exist for arrays). Any operation that expects
|
||
|
* a list can be used as a range operation by passing a subList view
|
||
|
* instead of a whole list. For example, the following idiom
|
||
|
* removes a range of elements from a list:
|
||
|
* <pre>{@code
|
||
|
* list.subList(from, to).clear();
|
||
|
* }</pre>
|
||
|
* Similar idioms may be constructed for {@code indexOf} and
|
||
|
* {@code lastIndexOf}, and all of the algorithms in the
|
||
|
* {@code Collections} class can be applied to a subList.<p>
|
||
|
*
|
||
|
* The semantics of the list returned by this method become undefined if
|
||
|
* the backing list (i.e., this list) is <i>structurally modified</i> in
|
||
|
* any way other than via the returned list. (Structural modifications are
|
||
|
* those that change the size of this list, or otherwise perturb it in such
|
||
|
* a fashion that iterations in progress may yield incorrect results.)
|
||
|
*
|
||
|
* @param fromIndex low endpoint (inclusive) of the subList
|
||
|
* @param toIndex high endpoint (exclusive) of the subList
|
||
|
* @return a view of the specified range within this list
|
||
|
* @throws IndexOutOfBoundsException for an illegal endpoint index value
|
||
|
* ({@code fromIndex < 0 || toIndex > size ||
|
||
|
* fromIndex > toIndex})
|
||
|
*/
|
||
|
List<E> subList(int fromIndex, int toIndex);
|
||
|
|
||
|
/**
|
||
|
* Creates a {@link Spliterator} over the elements in this list.
|
||
|
*
|
||
|
* <p>The {@code Spliterator} reports {@link Spliterator#SIZED} and
|
||
|
* {@link Spliterator#ORDERED}. Implementations should document the
|
||
|
* reporting of additional characteristic values.
|
||
|
*
|
||
|
* @implSpec
|
||
|
* The default implementation creates a
|
||
|
* <em><a href="Spliterator.html#binding">late-binding</a></em>
|
||
|
* spliterator as follows:
|
||
|
* <ul>
|
||
|
* <li>If the list is an instance of {@link RandomAccess} then the default
|
||
|
* implementation creates a spliterator that traverses elements by
|
||
|
* invoking the method {@link List#get}. If such invocation results or
|
||
|
* would result in an {@code IndexOutOfBoundsException} then the
|
||
|
* spliterator will <em>fail-fast</em> and throw a
|
||
|
* {@code ConcurrentModificationException}.
|
||
|
* If the list is also an instance of {@link AbstractList} then the
|
||
|
* spliterator will use the list's {@link AbstractList#modCount modCount}
|
||
|
* field to provide additional <em>fail-fast</em> behavior.
|
||
|
* <li>Otherwise, the default implementation creates a spliterator from the
|
||
|
* list's {@code Iterator}. The spliterator inherits the
|
||
|
* <em>fail-fast</em> of the list's iterator.
|
||
|
* </ul>
|
||
|
*
|
||
|
* @implNote
|
||
|
* The created {@code Spliterator} additionally reports
|
||
|
* {@link Spliterator#SUBSIZED}.
|
||
|
*
|
||
|
* @return a {@code Spliterator} over the elements in this list
|
||
|
* @since 1.8
|
||
|
*/
|
||
|
@Override
|
||
|
default Spliterator<E> spliterator() {
|
||
|
if (this instanceof RandomAccess) {
|
||
|
return new AbstractList.RandomAccessSpliterator<>(this);
|
||
|
} else {
|
||
|
return Spliterators.spliterator(this, Spliterator.ORDERED);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// ========== SequencedCollection ==========
|
||
|
|
||
|
/**
|
||
|
* {@inheritDoc}
|
||
|
*
|
||
|
* @implSpec
|
||
|
* The implementation in this interface calls {@code add(0, e)}.
|
||
|
*
|
||
|
* @throws NullPointerException {@inheritDoc}
|
||
|
* @throws UnsupportedOperationException {@inheritDoc}
|
||
|
* @since 21
|
||
|
*/
|
||
|
default void addFirst(E e) {
|
||
|
this.add(0, e);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* {@inheritDoc}
|
||
|
*
|
||
|
* @implSpec
|
||
|
* The implementation in this interface calls {@code add(e)}.
|
||
|
*
|
||
|
* @throws NullPointerException {@inheritDoc}
|
||
|
* @throws UnsupportedOperationException {@inheritDoc}
|
||
|
* @since 21
|
||
|
*/
|
||
|
default void addLast(E e) {
|
||
|
this.add(e);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* {@inheritDoc}
|
||
|
*
|
||
|
* @implSpec
|
||
|
* If this List is not empty, the implementation in this interface returns the result
|
||
|
* of calling {@code get(0)}. Otherwise, it throws {@code NoSuchElementException}.
|
||
|
*
|
||
|
* @throws NoSuchElementException {@inheritDoc}
|
||
|
* @since 21
|
||
|
*/
|
||
|
default E getFirst() {
|
||
|
if (this.isEmpty()) {
|
||
|
throw new NoSuchElementException();
|
||
|
} else {
|
||
|
return this.get(0);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* {@inheritDoc}
|
||
|
*
|
||
|
* @implSpec
|
||
|
* If this List is not empty, the implementation in this interface returns the result
|
||
|
* of calling {@code get(size() - 1)}. Otherwise, it throws {@code NoSuchElementException}.
|
||
|
*
|
||
|
* @throws NoSuchElementException {@inheritDoc}
|
||
|
* @since 21
|
||
|
*/
|
||
|
default E getLast() {
|
||
|
if (this.isEmpty()) {
|
||
|
throw new NoSuchElementException();
|
||
|
} else {
|
||
|
return this.get(this.size() - 1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* {@inheritDoc}
|
||
|
*
|
||
|
* @implSpec
|
||
|
* If this List is not empty, the implementation in this interface returns the result
|
||
|
* of calling {@code remove(0)}. Otherwise, it throws {@code NoSuchElementException}.
|
||
|
*
|
||
|
* @throws NoSuchElementException {@inheritDoc}
|
||
|
* @throws UnsupportedOperationException {@inheritDoc}
|
||
|
* @since 21
|
||
|
*/
|
||
|
default E removeFirst() {
|
||
|
if (this.isEmpty()) {
|
||
|
throw new NoSuchElementException();
|
||
|
} else {
|
||
|
return this.remove(0);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* {@inheritDoc}
|
||
|
*
|
||
|
* @implSpec
|
||
|
* If this List is not empty, the implementation in this interface returns the result
|
||
|
* of calling {@code remove(size() - 1)}. Otherwise, it throws {@code NoSuchElementException}.
|
||
|
*
|
||
|
* @throws NoSuchElementException {@inheritDoc}
|
||
|
* @throws UnsupportedOperationException {@inheritDoc}
|
||
|
* @since 21
|
||
|
*/
|
||
|
default E removeLast() {
|
||
|
if (this.isEmpty()) {
|
||
|
throw new NoSuchElementException();
|
||
|
} else {
|
||
|
return this.remove(this.size() - 1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* {@inheritDoc}
|
||
|
*
|
||
|
* @implSpec
|
||
|
* The implementation in this interface returns a reverse-ordered List
|
||
|
* view. The {@code reversed()} method of the view returns a reference
|
||
|
* to this List. Other operations on the view are implemented via calls to
|
||
|
* public methods on this List. The exact relationship between calls on the
|
||
|
* view and calls on this List is unspecified. However, order-sensitive
|
||
|
* operations generally delegate to the appropriate method with the opposite
|
||
|
* orientation. For example, calling {@code getFirst} on the view results in
|
||
|
* a call to {@code getLast} on this List.
|
||
|
*
|
||
|
* @return a reverse-ordered view of this collection, as a {@code List}
|
||
|
* @since 21
|
||
|
*/
|
||
|
default List<E> reversed() {
|
||
|
return ReverseOrderListView.of(this, true); // we must assume it's modifiable
|
||
|
}
|
||
|
|
||
|
// ========== static methods ==========
|
||
|
|
||
|
/**
|
||
|
* Returns an unmodifiable list containing zero elements.
|
||
|
*
|
||
|
* See <a href="#unmodifiable">Unmodifiable Lists</a> for details.
|
||
|
*
|
||
|
* @param <E> the {@code List}'s element type
|
||
|
* @return an empty {@code List}
|
||
|
*
|
||
|
* @since 9
|
||
|
*/
|
||
|
@SuppressWarnings("unchecked")
|
||
|
static <E> List<E> of() {
|
||
|
return (List<E>) ImmutableCollections.EMPTY_LIST;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns an unmodifiable list containing one element.
|
||
|
*
|
||
|
* See <a href="#unmodifiable">Unmodifiable Lists</a> for details.
|
||
|
*
|
||
|
* @param <E> the {@code List}'s element type
|
||
|
* @param e1 the single element
|
||
|
* @return a {@code List} containing the specified element
|
||
|
* @throws NullPointerException if the element is {@code null}
|
||
|
*
|
||
|
* @since 9
|
||
|
*/
|
||
|
static <E> List<E> of(E e1) {
|
||
|
return new ImmutableCollections.List12<>(e1);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns an unmodifiable list containing two elements.
|
||
|
*
|
||
|
* See <a href="#unmodifiable">Unmodifiable Lists</a> for details.
|
||
|
*
|
||
|
* @param <E> the {@code List}'s element type
|
||
|
* @param e1 the first element
|
||
|
* @param e2 the second element
|
||
|
* @return a {@code List} containing the specified elements
|
||
|
* @throws NullPointerException if an element is {@code null}
|
||
|
*
|
||
|
* @since 9
|
||
|
*/
|
||
|
static <E> List<E> of(E e1, E e2) {
|
||
|
return new ImmutableCollections.List12<>(e1, e2);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns an unmodifiable list containing three elements.
|
||
|
*
|
||
|
* See <a href="#unmodifiable">Unmodifiable Lists</a> for details.
|
||
|
*
|
||
|
* @param <E> the {@code List}'s element type
|
||
|
* @param e1 the first element
|
||
|
* @param e2 the second element
|
||
|
* @param e3 the third element
|
||
|
* @return a {@code List} containing the specified elements
|
||
|
* @throws NullPointerException if an element is {@code null}
|
||
|
*
|
||
|
* @since 9
|
||
|
*/
|
||
|
static <E> List<E> of(E e1, E e2, E e3) {
|
||
|
return ImmutableCollections.listFromTrustedArray(e1, e2, e3);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns an unmodifiable list containing four elements.
|
||
|
*
|
||
|
* See <a href="#unmodifiable">Unmodifiable Lists</a> for details.
|
||
|
*
|
||
|
* @param <E> the {@code List}'s element type
|
||
|
* @param e1 the first element
|
||
|
* @param e2 the second element
|
||
|
* @param e3 the third element
|
||
|
* @param e4 the fourth element
|
||
|
* @return a {@code List} containing the specified elements
|
||
|
* @throws NullPointerException if an element is {@code null}
|
||
|
*
|
||
|
* @since 9
|
||
|
*/
|
||
|
static <E> List<E> of(E e1, E e2, E e3, E e4) {
|
||
|
return ImmutableCollections.listFromTrustedArray(e1, e2, e3, e4);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns an unmodifiable list containing five elements.
|
||
|
*
|
||
|
* See <a href="#unmodifiable">Unmodifiable Lists</a> for details.
|
||
|
*
|
||
|
* @param <E> the {@code List}'s element type
|
||
|
* @param e1 the first element
|
||
|
* @param e2 the second element
|
||
|
* @param e3 the third element
|
||
|
* @param e4 the fourth element
|
||
|
* @param e5 the fifth element
|
||
|
* @return a {@code List} containing the specified elements
|
||
|
* @throws NullPointerException if an element is {@code null}
|
||
|
*
|
||
|
* @since 9
|
||
|
*/
|
||
|
static <E> List<E> of(E e1, E e2, E e3, E e4, E e5) {
|
||
|
return ImmutableCollections.listFromTrustedArray(e1, e2, e3, e4, e5);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns an unmodifiable list containing six elements.
|
||
|
*
|
||
|
* See <a href="#unmodifiable">Unmodifiable Lists</a> for details.
|
||
|
*
|
||
|
* @param <E> the {@code List}'s element type
|
||
|
* @param e1 the first element
|
||
|
* @param e2 the second element
|
||
|
* @param e3 the third element
|
||
|
* @param e4 the fourth element
|
||
|
* @param e5 the fifth element
|
||
|
* @param e6 the sixth element
|
||
|
* @return a {@code List} containing the specified elements
|
||
|
* @throws NullPointerException if an element is {@code null}
|
||
|
*
|
||
|
* @since 9
|
||
|
*/
|
||
|
static <E> List<E> of(E e1, E e2, E e3, E e4, E e5, E e6) {
|
||
|
return ImmutableCollections.listFromTrustedArray(e1, e2, e3, e4, e5,
|
||
|
e6);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns an unmodifiable list containing seven elements.
|
||
|
*
|
||
|
* See <a href="#unmodifiable">Unmodifiable Lists</a> for details.
|
||
|
*
|
||
|
* @param <E> the {@code List}'s element type
|
||
|
* @param e1 the first element
|
||
|
* @param e2 the second element
|
||
|
* @param e3 the third element
|
||
|
* @param e4 the fourth element
|
||
|
* @param e5 the fifth element
|
||
|
* @param e6 the sixth element
|
||
|
* @param e7 the seventh element
|
||
|
* @return a {@code List} containing the specified elements
|
||
|
* @throws NullPointerException if an element is {@code null}
|
||
|
*
|
||
|
* @since 9
|
||
|
*/
|
||
|
static <E> List<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7) {
|
||
|
return ImmutableCollections.listFromTrustedArray(e1, e2, e3, e4, e5,
|
||
|
e6, e7);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns an unmodifiable list containing eight elements.
|
||
|
*
|
||
|
* See <a href="#unmodifiable">Unmodifiable Lists</a> for details.
|
||
|
*
|
||
|
* @param <E> the {@code List}'s element type
|
||
|
* @param e1 the first element
|
||
|
* @param e2 the second element
|
||
|
* @param e3 the third element
|
||
|
* @param e4 the fourth element
|
||
|
* @param e5 the fifth element
|
||
|
* @param e6 the sixth element
|
||
|
* @param e7 the seventh element
|
||
|
* @param e8 the eighth element
|
||
|
* @return a {@code List} containing the specified elements
|
||
|
* @throws NullPointerException if an element is {@code null}
|
||
|
*
|
||
|
* @since 9
|
||
|
*/
|
||
|
static <E> List<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8) {
|
||
|
return ImmutableCollections.listFromTrustedArray(e1, e2, e3, e4, e5,
|
||
|
e6, e7, e8);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns an unmodifiable list containing nine elements.
|
||
|
*
|
||
|
* See <a href="#unmodifiable">Unmodifiable Lists</a> for details.
|
||
|
*
|
||
|
* @param <E> the {@code List}'s element type
|
||
|
* @param e1 the first element
|
||
|
* @param e2 the second element
|
||
|
* @param e3 the third element
|
||
|
* @param e4 the fourth element
|
||
|
* @param e5 the fifth element
|
||
|
* @param e6 the sixth element
|
||
|
* @param e7 the seventh element
|
||
|
* @param e8 the eighth element
|
||
|
* @param e9 the ninth element
|
||
|
* @return a {@code List} containing the specified elements
|
||
|
* @throws NullPointerException if an element is {@code null}
|
||
|
*
|
||
|
* @since 9
|
||
|
*/
|
||
|
static <E> List<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9) {
|
||
|
return ImmutableCollections.listFromTrustedArray(e1, e2, e3, e4, e5,
|
||
|
e6, e7, e8, e9);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns an unmodifiable list containing ten elements.
|
||
|
*
|
||
|
* See <a href="#unmodifiable">Unmodifiable Lists</a> for details.
|
||
|
*
|
||
|
* @param <E> the {@code List}'s element type
|
||
|
* @param e1 the first element
|
||
|
* @param e2 the second element
|
||
|
* @param e3 the third element
|
||
|
* @param e4 the fourth element
|
||
|
* @param e5 the fifth element
|
||
|
* @param e6 the sixth element
|
||
|
* @param e7 the seventh element
|
||
|
* @param e8 the eighth element
|
||
|
* @param e9 the ninth element
|
||
|
* @param e10 the tenth element
|
||
|
* @return a {@code List} containing the specified elements
|
||
|
* @throws NullPointerException if an element is {@code null}
|
||
|
*
|
||
|
* @since 9
|
||
|
*/
|
||
|
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) {
|
||
|
return ImmutableCollections.listFromTrustedArray(e1, e2, e3, e4, e5,
|
||
|
e6, e7, e8, e9, e10);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns an unmodifiable list containing an arbitrary number of elements.
|
||
|
* See <a href="#unmodifiable">Unmodifiable Lists</a> for details.
|
||
|
*
|
||
|
* @apiNote
|
||
|
* This method also accepts a single array as an argument. The element type of
|
||
|
* the resulting list will be the component type of the array, and the size of
|
||
|
* the list will be equal to the length of the array. To create a list with
|
||
|
* a single element that is an array, do the following:
|
||
|
*
|
||
|
* <pre>{@code
|
||
|
* String[] array = ... ;
|
||
|
* List<String[]> list = List.<String[]>of(array);
|
||
|
* }</pre>
|
||
|
*
|
||
|
* This will cause the {@link List#of(Object) List.of(E)} method
|
||
|
* to be invoked instead.
|
||
|
*
|
||
|
* @param <E> the {@code List}'s element type
|
||
|
* @param elements the elements to be contained in the list
|
||
|
* @return a {@code List} containing the specified elements
|
||
|
* @throws NullPointerException if an element is {@code null} or if the array is {@code null}
|
||
|
*
|
||
|
* @since 9
|
||
|
*/
|
||
|
@SafeVarargs
|
||
|
@SuppressWarnings("varargs")
|
||
|
static <E> List<E> of(E... elements) {
|
||
|
switch (elements.length) { // implicit null check of elements
|
||
|
case 0:
|
||
|
@SuppressWarnings("unchecked")
|
||
|
var list = (List<E>) ImmutableCollections.EMPTY_LIST;
|
||
|
return list;
|
||
|
case 1:
|
||
|
return new ImmutableCollections.List12<>(elements[0]);
|
||
|
case 2:
|
||
|
return new ImmutableCollections.List12<>(elements[0], elements[1]);
|
||
|
default:
|
||
|
return ImmutableCollections.listFromArray(elements);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns an <a href="#unmodifiable">unmodifiable List</a> containing the elements of
|
||
|
* the given Collection, in its iteration order. The given Collection must not be null,
|
||
|
* and it must not contain any null elements. If the given Collection is subsequently
|
||
|
* modified, the returned List will not reflect such modifications.
|
||
|
*
|
||
|
* @implNote
|
||
|
* If the given Collection is an <a href="#unmodifiable">unmodifiable List</a>,
|
||
|
* calling copyOf will generally not create a copy.
|
||
|
*
|
||
|
* @param <E> the {@code List}'s element type
|
||
|
* @param coll a {@code Collection} from which elements are drawn, must be non-null
|
||
|
* @return a {@code List} containing the elements of the given {@code Collection}
|
||
|
* @throws NullPointerException if coll is null, or if it contains any nulls
|
||
|
* @since 10
|
||
|
*/
|
||
|
static <E> List<E> copyOf(Collection<? extends E> coll) {
|
||
|
return ImmutableCollections.listCopy(coll);
|
||
|
}
|
||
|
}
|