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 * @Override 471 * public void sort(Comparator<? super E> c) { 472 * Object[] elements = toArray(); 473 * Arrays.sort(elements, c); 474 * ListIterator<E> iterator = (ListIterator<Object>) 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