Руководство Java List
1. List
List - это interface в Java коллекции интерфейсов и классов (Java Collection Framework). Поскольку это подинтерфейс Collection, он обладает всеми функциями Collection. Кроме того, он обеспечивает основу для поддержания упорядоченной Collection (ordered Collection). Он включает в себя методы, позволяющие вставлять, обновлять, удалять и искать элемент по индексу. List позволяет дублировать элементы и null элементы.
public interface List<E> extends Collection<E>
- Collection
- Queue
- Set
- SortedSet
- NavigableSet
- BlockingQueue
- BlockingDeque
- Deque
- TransferQueue
Иерархия классов реализует (implement) interface List:
- LinkedList
- ArrayList
- CopyOnWriteArrayList
- Vector
- Stack
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)
}
2. Examples
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
3. listInterator()
Метод 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
4. stream()
List - это подинтерфейс Collection, поэтому он наследует метод stream(). Доступ к элементам Collection через Stream делает ваш code кратким и легким для понимания:
- Collection
- Stream
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
5. subList(int,int)
Метод 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
6. spliterator()
Создаем объект Spliterator для обхода и секционирования (traversing and partitioning) элементов List.
default Spliterator<E> spliterator() // Java 8
Spliterator широко используется для обхода и секционирования (traversing and partitioning) множества различных источников данных, таких как Collection (List, Set, Queue), BaseStream, array.
- Руководство Java Spliterator
7. toArray(..)
Метод 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
8. sort(Comparator)
Метод 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. Вы можете прочитать больше из приведенных ниже статей, чтобы получить более подробное объяснение:
- Functional Interface
- Comparator
9. replaceAll(UnaryOperator)
Метод 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
- Руководство Java UnaryOperator
Руководства Java Collections Framework
- Руководство Java PriorityBlockingQueue
- Руководство Java Collections Framework
- Руководство Java SortedSet
- Руководство Java List
- Руководство Java Iterator
- Руководство Java NavigableSet
- Руководство Java ListIterator
- Руководство Java ArrayList
- Руководство Java CopyOnWriteArrayList
- Руководство Java LinkedList
- Руководство Java Set
- Руководство Java TreeSet
- Руководство Java CopyOnWriteArraySet
- Руководство Java Queue
- Руководство Java Deque
- Руководство Java IdentityHashMap
- Руководство Java WeakHashMap
- Руководство Java Map
- Руководство Java SortedMap
- Руководство Java NavigableMap
- Руководство Java HashMap
- Руководство Java TreeMap
- Руководство Java PriorityQueue
- Руководство Java BlockingQueue
- Руководство Java ArrayBlockingQueue
- Руководство Java TransferQueue
Show More