Руководство Java List
View more Tutorials:
List - это interface в Java коллекции интерфейсов и классов (Java Collection Framework). Поскольку это подинтерфейс Collection, он обладает всеми функциями Collection. Кроме того, он обеспечивает основу для поддержания упорядоченной Collection (ordered Collection). Он включает в себя методы, позволяющие вставлять, обновлять, удалять и искать элемент по индексу. List позволяет дублировать элементы и null элементы.
public interface List<E> extends Collection<E>

- TODO Link!
Иерархия классов реализует (implement) interface List:

- TODO Link!
- TODO Link!
- TODO Link!
LinkedList - это специальный класс, который принадлежит как группе List, так и группе Queue:

java.util.List
List предоставляет метод listlterator(), который возвращает объект Listlterator, позволяющий выполнять итерацию (iterate) элементов в прямом или обратном направлении. Классы, реализующие interface List - это ArrayList, LinkedList, Stack и Vector. Среди них более широко используются ArrayList и LinkedList.
Методы, определенные в List:
List interface
public interface List<E> extends Collection<E> { boolean isEmpty(); boolean contains(Object o); Object[] toArray(); <T> T[] toArray(T[] a); boolean containsAll(Collection<?> c); boolean addAll(Collection<? extends E> c); boolean addAll(int index, Collection<? extends E> c); boolean removeAll(Collection<?> c); boolean retainAll(Collection<?> c); int size(); boolean equals(Object o); int hashCode(); E get(int index); E set(int index, E element); boolean add(E e); void add(int index, E element); E remove(int index); boolean remove(Object o); void clear(); int indexOf(Object o); int lastIndexOf(Object o); Iterator<E> iterator(); ListIterator<E> listIterator(); ListIterator<E> listIterator(int index); List<E> subList(int fromIndex, int toIndex); default Spliterator<E> spliterator() default void replaceAll(UnaryOperator<E> operator) default void sort(Comparator<? super E> c) static <E> List<E> of() static <E> List<E> of(E e1) static <E> List<E> of(E e1, E e2) static <E> List<E> of(E e1, E e2, E e3) static <E> List<E> of(E e1, E e2, E e3, E e4) static <E> List<E> of(E e1, E e2, E e3, E e4, E e5) static <E> List<E> of(E e1, E e2, E e3, E e4, E e5, E e6) static <E> List<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7) static <E> List<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8) static <E> List<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9) 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) static <E> List<E> of(E... elements) static <E> List<E> copyOf(Collection<? extends E> coll) }
List - это interface, поэтому для создания объекта List вам нужно создать его с помощью класса, который его реализует, например ArrayList, LinkedList,..
ListEx1.java
package org.o7planning.list.ex; import java.util.ArrayList; import java.util.List; public class ListEx1 { public static void main(String[] args) { // Create a List List<String> list = new ArrayList<String>(); list.add("One"); list.add("Three"); list.add("Four"); // Insert an element at index 1 list.add(1, "Two"); for(String s: list) { System.out.println(s); } System.out.println(" ----- "); // Remove an element at index 2 list.remove(2); for(String s: list) { System.out.println(s); } } }
Output:
One Two Three Four ----- One Two Four
Book.java
package org.o7planning.list.ex; public class Book { private String title; private float price; public Book(String title, float price) { this.title = title; this.price = price; } public String getTitle() { return title; } public float getPrice() { return price; } }
Например: Объект List содержит типы данных Book.
ListEx2.java
package org.o7planning.list.ex; import java.util.ArrayList; import java.util.List; public class ListEx2 { public static void main(String[] args) { Book b1 = new Book("Python Tutorial", 100f); Book b2 = new Book("HTML Tutorial", 120f); // Create an Unmodifiable List List<Book> bookList1 = List.of(b1, b2); // Create a List of Books using ArrayList List<Book> bookList = new ArrayList<Book>(); bookList.add(new Book("Java Tutorial", 300f)); bookList.add(new Book("C# Tutorial", 200f)); // Append all elements to the end of list. bookList.addAll(bookList1); for(Book book: bookList) { System.out.println(book.getTitle() + " / " + book.getPrice()); } } }
Output:
Java Tutorial / 300.0 C# Tutorial / 200.0 Python Tutorial / 100.0 HTML Tutorial / 120.0
Array -> List
Статический метод Arrays.asList(..) позволяет преобразовать массив в объект List, однако этот объект имеет фиксированный размер, не можем добавлять или удалять существующие элементы, поскольку он не поддерживает дополнительные методы: add, remove, set и clear.
ListEx3.java
package org.o7planning.list.ex; import java.util.Arrays; import java.util.List; public class ListEx3 { public static void main(String[] args) { Book b1 = new Book("Python Tutorial", 100f); Book b2 = new Book("HTML Tutorial", 120f); Book b3 = new Book("Java Tutorial", 300f); Book[] bookArray = new Book[] {b1, b2, b3}; // Create a Fixed-size List. List<Book> bookList = Arrays.asList(bookArray); for(Book b: bookList) { System.out.println("Book: " + b.getTitle()); } } }
Output:
Book: Python Tutorial Book: HTML Tutorial Book: Java Tutorial
Метод listlterator() возвращает объект Listlterator, который позволяет выполнять итерацию (iterate) элементов в прямом или обратном направлении.
ListIterator<E> listIterator(); ListIterator<E> listIterator(int index);
Например:

List_listIterator.java
package org.o7planning.list.ex; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; public class List_listIterator { public static void main(String[] args) { // Create a List List<String> list = new ArrayList<String>(); list.add("One"); list.add("Two"); list.add("Three"); list.add("Four"); // Get a ListIterator. ListIterator<String> listIterator = list.listIterator(); String first = listIterator.next(); System.out.println("First:" + first);// -->"One" String second = listIterator.next(); System.out.println("Second:" + second);// -->"Two" if (listIterator.hasPrevious()) { System.out.println("Jump back..."); String value = listIterator.previous(); System.out.println("Value:" + value);// -->"Two" } System.out.println(" ----- "); while (listIterator.hasNext()) { String value = listIterator.next(); System.out.println("Value:" + value); } } }
Output:
First:One Second:Two Jump back... Value:Two ----- Value:Two Value:Three Value:Four
- TODO Link!
List - это подинтерфейс Collection, поэтому он наследует метод stream(). Доступ к элементам Collection через Stream делает ваш code кратким и легким для понимания:
- TODO Link!
List_stream.java
package org.o7planning.list.ex; import java.util.ArrayList; import java.util.List; public class List_stream { public static void main(String[] args) { Book b1 = new Book("Python Tutorial", 100f); Book b2 = new Book("HTML Tutorial", 120f); // Create an Unmodifiable List List<Book> bookList1 = List.of(b1, b2); // Create a List of Books using ArrayList List<Book> bookList = new ArrayList<Book>(); bookList.add(new Book("Java Tutorial", 300f)); bookList.add(new Book("C# Tutorial", 200f)); // Append all elements to the end of list. bookList.addAll(bookList1); // Using Stream bookList.stream() // .filter(b -> b.getPrice() > 100) // Filter Books with price > 100 .forEach(b -> System.out.println(b.getTitle() +" / " + b.getPrice())); } }
Output:
Java Tutorial / 300.0 C# Tutorial / 200.0 HTML Tutorial / 120.0
Метод subList(int,int) возвращает частичное представление текущего объекта List, включая элементы из индекса fromIndex до tolndex.
Объект "subList" и текущий объект List связаны между собой, например, если вы удалите элемент в "subList", этот элемент также будет удален из текущего объекта List.
List<E> subList(int fromIndex, int toIndex);

List_subList.java
package org.o7planning.list.ex; import java.util.ArrayList; import java.util.List; public class List_subList { public static void main(String[] args) { // Create a List List<String> originList = new ArrayList<String>(); originList.add("A"); // 0 originList.add("B"); // 1 originList.add("C"); // 2 originList.add("D"); // 3 originList.add("E"); // 4 List<String> subList = originList.subList(1, 3); // fromIndex .. toIndex System.out.println("Elements in subList: "); for(String s: subList) { System.out.println(s); // B C } subList.clear(); // Remove all elements from subList. System.out.println("Elements in original List after removing all elements from subList: "); for(String s: originList) { System.out.println(s); // B C } } }
Output:
Elements in subList: B C Elements in original List after removing all elements from subList: A D E
Создаем объект Spliterator для обхода и секционирования (traversing and partitioning) элементов List.
default Spliterator<E> spliterator() // Java 8
Spliterator широко используется для обхода и секционирования (traversing and partitioning) множества различных источников данных, таких как Collection (List, Set, Queue), BaseStream, array.
- TODO Link!
Метод toArray(..) возвращает массив, содержащий все элементы List.
Object[] toArray(); <T> T[] toArray(T[] a); // Java 11, The default method, inherited from Collection. default <T> T[] toArray(IntFunction<T[]> generator)
Например:
List_toArray.java
package org.o7planning.list.ex; import java.util.ArrayList; import java.util.List; public class List_toArray { public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("A"); // 0 list.add("B"); // 1 list.add("C"); // 2 list.add("D"); // 3 list.add("E"); // 4 String[] array = new String[list.size()]; list.toArray(array); for(String s: array) { System.out.println(s); } } }
Output:
A B C D E
Метод sort(Comparator) по умолчанию опирается на объект Comparator, который предназначен для сравнения элементов в List и сортировки их по порядку.
default void sort(Comparator<? super E> c)
Пример: Объект List содержит элементы типа Book, мы сортируем их по цене и названию в порядке возрастания.
List_sort_ex1.java
package org.o7planning.list.ex; import java.util.ArrayList; import java.util.List; public class List_sort_ex1 { public static void main(String[] args) { Book b1 = new Book("Python Tutorial", 100f); Book b2 = new Book("HTML Tutorial", 120f); Book b3 = new Book("Java Tutorial", 300f); Book b4 = new Book("Javafx Tutorial", 100f); Book b5 = new Book("CSS Tutorial", 300f); List<Book> bookList = new ArrayList<Book>(); bookList.add(b1); bookList.add(b2); bookList.add(b3); bookList.add(b4); bookList.add(b5); // Sort by ascending price. // And Sort by ascending title. bookList.sort((book1, book2) -> { float a = book1.getPrice() - book2.getPrice(); if(a > 0) { return 1; } else if(a < 0) { return -1; } int b = book1.getTitle().compareTo(book2.getTitle()); return b; }); for(Book b: bookList) { System.out.println(b.getPrice() +" : " + b.getTitle()); } } }
Output:
100.0 : Javafx Tutorial 100.0 : Python Tutorial 120.0 : HTML Tutorial 300.0 : CSS Tutorial 300.0 : Java Tutorial
В приведенном выше примере используются некоторые новые понятия, введенные из Java 8, такие как Functional interface, выражение Lambda. Вы можете прочитать больше из приведенных ниже статей, чтобы получить более подробное объяснение:
- TODO Link!
Метод replaceAll(UnaryOperator) использует предоставленный параметр UnaryOperator для замены каждого элемента в List новым.
default void replaceAll(UnaryOperator<E> operator)
Например: List содержит элементы типа Book, заменяя каждый из его элементов Book новой Book для увеличения цены на 50%.
List_replaceAll.java
package org.o7planning.list.ex; import java.util.ArrayList; import java.util.List; public class List_replaceAll { public static void main(String[] args) { Book b1 = new Book("Python Tutorial", 100f); Book b2 = new Book("HTML Tutorial", 120f); Book b3 = new Book("Java Tutorial", 300f); Book b4 = new Book("Javafx Tutorial", 100f); Book b5 = new Book("CSS Tutorial", 300f); List<Book> bookList = new ArrayList<Book>(); bookList.add(b1); bookList.add(b2); bookList.add(b3); bookList.add(b4); bookList.add(b5); // Replace Book with new Book with the price increased by 50%. bookList.replaceAll(b -> new Book(b.getTitle(), b.getPrice() * 150f/100)); for(Book b: bookList) { System.out.println(b.getPrice() + " : " + b.getTitle()); } } }
Output:
150.0 : Python Tutorial 180.0 : HTML Tutorial 450.0 : Java Tutorial 150.0 : Javafx Tutorial 450.0 : CSS Tutorial
- TODO Link!