English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Учебник по основам Java

Java Управление потоком

Java Массив

Java Ориентированность на объекты (I)

Java Ориентированность на объекты (II)

Java Ориентированность на объекты (III)

Обработка исключений Java

Java Список (List)

Java Queue (队列)

Java Map集合

Java Set集合

Java Ввод/вывод (I/O)

Java Reader/Writer

Другие темы Java

LinkedList (список) Java

В этом руководстве мы рассмотрим LinkedList класс через множество примеров.

Класс LinkedList в Java Collection Framework предоставляет функции структуры списка.

Интерфейс, реализованный LinkedList

Реализация LinkedList в Java

Класс LinkedList в Java предоставляет реализацию двунаправленной链ки.

Каждый элемент списка называетсяузел. Она содержит 3 поля:

  • Prev - Хранят адрес предыдущего элемента в списке. Первый элемент null.

  • Next - Хранят адрес следующего элемента в списке. Последний элемент null.

  • Data - Хранят фактические данные.

Элементы списка не хранятся по порядку. Напротив, они рассеяны и связаны между собой через ссылки (Prev и Next).

Здесь список ссылок содержит 3 элемента.

  • Dog - Первый элемент принимает null в качестве предыдущего адреса и адрес Cat в качестве следующего адреса

  • Cat - Второй элемент принимает адрес Dog в качестве предыдущего адреса и адрес Cow в качестве следующего адреса

  • Cow - Последний элемент принимает адрес Cat в качестве предыдущего адреса и null в качестве следующего элемента

Создание LinkedList

Вот как мы создаем список ссылок с помощью Java:

LinkedList<Type> linkedList = new LinkedList<>();

Здесь Type represents the type of the linked list. Например,

// Создание списка целых чисел
// Создание списка целых чисел
// Создание списка строк
LinkedList<String> linkedList = new LinkedList<>();

Создание LinkedList с использованием интерфейса

Давайте рассмотрим пример.

List<String> animals1 = new LinkedList<>();

Здесь мы используем интерфейс List для объявления списка animals1, который может обращаться только к методам интерфейса List.

Давайте рассмотрим еще один пример.

Queue<String> animals2 = new LinkedList<>();
Deque<String> animals3 = new LinkedList<>();

Здесь animal2 может обращаться к методам интерфейса Queue.

Однако animal3 может обращаться только к методам интерфейсов Deque и Queue. Это связано с тем, что Deque является подинтерфейсом Queue.

Методы LinkedList

LinkedList предоставляет различные методы, которые позволяют выполнять различные операции с списком.

Добавление элементов в LinkedList

1. Добавление элементов:Использование метода add()

Чтобы добавить элемент (узел) в конец списка, мы используем метод add(). Например,

import java.util.LinkedList;
class Main {
    public static void main(String[] args){
        LinkedList<String> animals = new LinkedList<>();
        // Добавление элементов в LinkedList
        animals.add("Dog");
        animals.add("Cat");
        animals.add("Horse");
        System.out.println("LinkedList: " + animals);
    {}
{}

Результат вывода

LinkedList: [Dog, Cat, Horse]

2. Добавление элементов: использование индексного номера

Мы также можем использовать индекс для добавления элементов в список. Например,

import java.util.LinkedList;
class Main {
    public static void main(String[] args){
        LinkedList<String> animals = new LinkedList<>();
        // Добавление элементов с использованием индекса
        animals.add(0, "Собака");
        animals.add(1, "Кот");
        animals.add(2, "Конь");
        System.out.println("LinkedList: " + animals);
    {}
{}

Результат вывода

LinkedList: [Dog, Cat, Horse]

3. Добавление элементов: добавление одного списка в другой

Чтобы добавить все элементы одного списка в другой, мы используем метод addAll(). Например,

import java.util.LinkedList;
class Main {
    public static void main(String[] args){
        LinkedList<String> mammals = new LinkedList<>();
        mammals.add("Собака");
        mammals.add("Кот");
        mammals.add("Конь");
        System.out.println("Млекопитающие: " + mammals);
        LinkedList<String> animals = new LinkedList<>();
        animals.add("Крокодил");
        // Добавить все элементы mammals в animals
        animals.addAll(mammals);
        System.out.println("Животные: " + animals);
    {}
{}

Результат вывода

Млекопитающие: [Собака, Кот, Лошадь]
Животные: [Крокодил, Собака, Кот, Лошадь]

4. Добавление элементов: использование метода listIterator()

Мы также можем использовать метод listsIterator() для добавления элементов в список. Для использования его нам нужно импортировать пакет java.util.ListIterator. Например,

import java.util.ArrayList;
import java.util.ListIterator;
class Main {
    public static void main(String[] args) {
        ArrayList<String> animals = new ArrayList<>();
        //Создание объекта ListIterator
        ListIterator<String> listIterate = animals.listIterator();
        listIterate.add("Собака");
        listIterate.add("Кот");
        System.out.println("LinkedList: " + animals);
    {}
{}

Результат вывода

LinkedList: [Собака, Кот]

Доступ к элементам LinkedList

1. Доступ к элементам: использование метода get()

Чтобы получить элемент из списка, мы можем использовать метод get(). Например,

import java.util.LinkedList;
class Main {
    public static void main(String[] args) {
        LinkedList<String> animals = new LinkedList<>();
        //Добавление элемента в список
        animals.add("Dog");
        animals.add("Horse");
        animals.add("Cat");
        System.out.println("LinkedList: " + animals);
        // Получение элемента из списка
        String str = animals.get(1);
        System.out.print("Элемент на индексе 1: " + str);
    {}
{}

Результат вывода

LinkedList: [Собака, Конь, Кот]
Элемент на индексе 1: Лошадь

2. Доступ к элементам: использование метода iterator()

Чтобы итерировать элементы списка, мы можем использовать метод iterator(). Для использования этого метода нам нужно импортировать пакет java.util.Iterator. Например,

import java.util.LinkedList;
import java.util.Iterator;
class Main {
    public static void main(String[] args) {
        LinkedList<String> animals = new LinkedList<>();
        //Добавление элемента в список
        animals.add("Dog");
        animals.add("Horse");
        animals.add("Cat");
        // Создание объекта Iterator
        Iterator<String> iterate = animals.iterator();
        System.out.print("LinkedList: \n");
        while(iterate.hasNext()) {
            System.out.print(iterate.next());
            System.out.print(", ");
        {}
    {}
{}

Результат вывода

LinkedList: Собака, Кот, Лошадь,

Здесь:

  • hasNext() - возвращает true, если существует следующий элемент

  • next() - возвращает следующий элемент

3. Доступ к элементам: использование метода listIterator()

Мы также можем использовать метод listIterator() для итерации элементов связанных списков. Для использования этого метода нам нужно импортировать пакет java.util.ListIterator.

Метод listsIterator() лучше всего подходит для использования с链表ами. Это связано с тем, что объект listIterator() также может итерироваться назад. Например

import java.util.LinkedList;
import java.util.ListIterator;
class Main {
    public static void main(String[] args) {
        LinkedList<String> animals = new LinkedList<>();
        //Добавление элемента в список
        animals.add("Dog");
        animals.add("Horse");
        animals.add("Cat");
        //Создание объекта ListIterator
        ListIterator<String> listIterate = animals.listIterator();
        System.out.print("LinkedList: \n");
        while(listIterate.hasNext()) {
            System.out.print(listIterate.next());
            System.out.print(", ");
        {}
        // Пробег назад
        System.out.print("\nОбратная LinkedList: \n");
        while(listIterate.hasPrevious()) {
            System.out.print(listIterate.previous());
            System.out.print(", ");
        {}
    {}
{}

Результат вывода

LinkedList: Собака, лошадь, кошка
Обратный LinkedList: кошка, лошадь, Собака

Здесь:

  • hasNext() - возвращает true, если существует следующий элемент

  • next() - возвращает следующий элемент

  • hasPrevious() - возвращает true, если существует предыдущий элемент

  • previous() - возвращает предыдущий элемент

1. Поиск элемента: использование метода contains()

Чтобы проверить, содержит ли список определенный элемент, мы используем метод contains(). Например:

import java.util.LinkedList;
class Main {
    public static void main(String[] args) {
        LinkedList<String> animals = new LinkedList<>();
        //Добавление элемента в список
        animals.add("Dog");
        animals.add("Horse");
        animals.add("Cat");
        System.out.println("LinkedList: " + animals);
        //Проверка наличия Собаки в списке
        if(animals.contains("Собака")) {
            System.out.println("Собака в LinkedList.");
        {}
    {}
{}

Результат вывода

LinkedList: [Собака, Конь, Кот]
Собака в LinkedList.

2. Поиск элемента: использование метода indexOf()

  • indexOf() - возвращает индекс первого的出现 элемента

  • lastIndexOf() - возвращает индекс последнего的出现 элемента

Например,

import java.util.LinkedList;
class Main {
    public static void main(String[] args) {
        LinkedList<String> animals = new LinkedList<>();
        //Добавление элементов в список
        animals.add("Dog");
        animals.add("Horse");
        animals.add("Cat");
        animals.add("Dog");
        System.out.println("LinkedList: " + animals);
        //Первое的出现 Собаки
        int index1 = animals.indexOf("Собака");
        System.out.println("Индекс первого的出现 Собаки: " + index1);
        //Последнее的出现 Собаки
        int index2 = animals.lastIndexOf("Собака");
        System.out.println("Индекс последнего的出现 Собаки: " + index2);
    {}
{}

Результат вывода

LinkedList: [Собака, лошадь, кошка, Собака]
Индекс первого的出现 Собаки: 0
Индекс последнего的出现 Собаки: 3

Внимание:Если指定的 элемент не найден, indexOf() и lastIndexOf() возвращают -1.

Изменение элемента LinkedList

1. Изменение элемента: использование метода set()

Чтобы изменить элемент в связном списке, мы можем использовать метод set(). Например:

import java.util.LinkedList;
class Main {
    public static void main(String[] args) {
        LinkedList<String> animals = new LinkedList<>();
        //Добавление элемента в список
        animals.add("Dog");
        animals.add("Horse");
        animals.add("Cat");
        animals.add("Dog");
        System.out.println("LinkedList: " + animals);
        //Изменение элемента по индексу 3
        animals.set(3, "Зебра");
        System.out.println("Новый LinkedList: " + animals);
    {}
{}

Результат вывода

LinkedList: [Собака, лошадь, кошка, Собака]
Новый LinkedList: [Собака, лошадь, кошка, зебра]

2. Изменение элементов: использование метода listIterator()

Мы можем также использовать метод listIterator() для изменения элементов в связном списке. Например,

import java.util.ArrayList;
import java.util.ListIterator;
class Main {
    public static void main(String[] args) {
        ArrayList<String> animals = new ArrayList<>();
        //Добавление элементов в список
        animals.add("Dog");
        animals.add("Cat");
        animals.add("Horse");
        System.out.println("LinkedList: " + animals);
        //Создание объекта ListIterator
        ListIterator<String> listIterate = animals.listIterator();
        listIterate.next();
        //Изменение элемента, возвращенного next()
        listIterate.set("Cow");
        System.out.println("Новый LinkedList: " + animals);
    {}
{}

Результат вывода

LinkedList: [Dog, Cat, Horse]
Новый LinkedList: [Cow, Cat, Horse]

Удаление элементов LinkedList

1. Удаление элементов: использование метода remove()

Чтобы удалить элемент из связного списка, мы можем использовать метод remove(). Например,

import java.util.LinkedList;
class Main {
    public static void main(String[] args) {
        LinkedList<String> animals = new LinkedList<>();
        //Добавление элемента в список
        animals.add("Dog");
        animals.add("Horse");
        animals.add("Cat");
        animals.add("Zebra");
        System.out.println("LinkedList: " + animals);
        //Удаление элемента с индексом 1
        String str = animals.remove(1);
        System.out.println("Удаление элемента: " + str);
        System.out.println("Новый LinkedList: " + animals);
    {}
{}

Результат вывода

LinkedList: [Dog, Horse, Cat, Zebra]
Удаление элемента: Horse
Новый LinkedList: [Dog, Cat, Zebra]

2. Удаление элементов: использование метода listIterator()

Мы можем также использовать метод listsIterator() для удаления элементов из связного списка. Например,

import java.util.ArrayList;
import java.util.ListIterator;
class Main {
    public static void main(String[] args) {
        ArrayList<String> animals = new ArrayList<>();
        //Добавление элемента в список
        animals.add("Dog");
        animals.add("Cat");
        animals.add("Horse");
        System.out.println("LinkedList: " + animals);
        //Создание объекта ListIterator
        ListIterator<String> listIterate = animals.listIterator();
        listIterate.next();
        //Удаление элемента, возвращенного next()
        listIterate.remove();
        System.out.println("Новый LinkedList: " + animals);
    {}
{}

Результат вывода

LinkedList: [Dog, Cat, Horse]
Новый LinkedList: [Cat, Horse]

3. Удаление элементов: использование метода clear()

Чтобы удалить все элементы из связного списка, мы используем метод clear(). Например,

import java.util.LinkedList;
class Main {
    public static void main(String[] args) {
        LinkedList<String> animals = new LinkedList<>();
        //Добавление элемента в список
        animals.add("Dog");
        animals.add("Cat");
        animals.add("Horse");
        System.out.println("LinkedList: " + animals);
        //Удаление всех элементов
        animals.clear();
        System.out.println("Новый LinkedList: " + animals);
    {}
{}

Результат вывода

LinkedList: [Dog, Cat, Horse]
Новый LinkedList: []

Внимание:Мы можем также использовать метод removeAll() для удаления всех элементов. Однако, метод clear() более эффективен.

4. Удаление элементов: использование метода removeIf()

Если элемент удовлетворяет определенным условиям, мы также можем удалить их из списка. Для этого мы используем метод removeIf(). Например:

import java.util.LinkedList;
class Main {
    public static void main(String[] args) {
        LinkedList<Integer> animals = new LinkedList<>();
        //Добавление элемента в список
        animals.add(2);
        animals.add(3);
        animals.add(4);
        animals.add(5);
        System.out.println("LinkedList: " + animals);
        // удалять все элементы, которые меньше 4
        animals.removeIf((Integer i)->i < 4);
        System.out.println("Новый LinkedList: " + animals);
       /** Здесь мы используем lambda выражение
       * теперь запомните
       * параметр removeIf() - это условие
       */
    {}
{}

Результат вывода

LinkedList: [2, 3, 4, 5]
новый LinkedList: [4, 5]

Внимание: (Integer i)->i<4 является lambda выражение. Чтобы узнать больше о lambda выражение, пожалуйста, посетитеJava Lambda выражение

LinkedList в качестве Deque и Queue

Поскольку класс LinkedList также реализует интерфейсы Queue и Deque, он может также реализовывать методы этих интерфейсов. Вот несколько常用ных методов:

методы addFirst() и addLast()

  • addFirst() - добавляет указанный элемент в начало связного списка

  • addLast() - добавляет указанный элемент в конец связного списка

Например,

import java.util.LinkedList;
import java.util.Deque;
class Main {
    public static void main(String[] args){
        Deque<String> animals = new LinkedList<>();
        // добавление элемента в начало LinkedList
        animals.addFirst("Cow");
        animals.addFirst("Dog");
        animals.addFirst("Cat");
        System.out.println("LinkedList: " + animals);
        //Добавление элемента в конец LinkedList
        animals.addLast("Zebra");
        System.out.println("Новый LinkedList: " + animals);
    {}
{}

Результат вывода

LinkedList: [Cat, Dog, Cow]
новый LinkedList: [Cat, Dog, Cow, Zebra]

методы getFirst() и getLast()

  • getFirst() - возвращает первый элемент

  • getLast() - возвращает последний элемент

Например,

import java.util.LinkedList;
import java.util.Deque;
class Main {
    public static void main(String[] args) {
        Deque<String> animals = new LinkedList<>();
        //Добавление элементов в список
        animals.add("Dog");
        animals.add("Horse");
        animals.add("Cat");
        System.out.println("LinkedList: " + animals);
        // из списка��取 первый элемент
        String str1 = animals.getFirst();
        System.out.println("Первый элемент: " + str1);
        //Получает последний элемент из списка
        String str2 = animals.getLast();
        System.out.println("Последний элемент: " + str2);
    {}
{}

Результат вывода

LinkedList: [Собака, Конь, Кот]
Первый элемент: Собака
Последний элемент: Кот

Методы removeFirst() и removeLast()

  • removeFirst() - удаляет первый элемент

  • removeLast() - удаляет последний элемент

Например,

import java.util.LinkedList;
import java.util.Deque;
class Main {
    public static void main(String[] args) {
        Deque<String> animals = new LinkedList<>();
        //Добавление элементов в список
        animals.add("Dog");
        animals.add("Horse");
        animals.add("Cat");
        System.out.println("LinkedList: " + animals);
        //Удаляет первый элемент из LinkedList
        String str1 = animals.removeFirst();
        System.out.println("Удаленный элемент: " + str1);
        //Удаляет последний элемент из LinkedList
        String str2 = animals.removeLast();
        System.out.println("Удаленный элемент: " + str2);
        System.out.println("Новый LinkedList: " + animals);
    {}
{}

Результат вывода

LinkedList: [Собака, Конь, Кот]
Удаленный элемент: Собака
Удаленный элемент: Кот
Новая LinkedList: [Конь]

Метод peek()

Метод peek() возвращает первый элемент списка (голова). Например,

import java.util.LinkedList;
import java.util.Queue;
class Main {
    public static void main(String[] args) {
        Queue<String> animals = new LinkedList<>();
        //Добавление элемента в список
        animals.add("Dog");
        animals.add("Horse");
        animals.add("Cat");
        System.out.println("LinkedList: " + animals);
        //Доступ к первому элементу LinkedList
        String str = animals.peek();
        System.out.println("Элемент доступа: " + str);
        System.out.println("Новый LinkedList: " + animals);
    {}
{}

Результат вывода

LinkedList: [Собака, Конь, Кот]
Элемент доступа: Собака
Новый LinkedList: [Dog, Horse, Cat]

Метод poll()

Метод poll() возвращает и удаляет первый элемент из списка. Например,

import java.util.LinkedList;
import java.util.Queue;
class Main {
    public static void main(String[] args) {
        Queue<String> animals = new LinkedList<>();
        //Добавление элемента в список
        animals.add("Dog");
        animals.add("Horse");
        animals.add("Cat");
        System.out.println("LinkedList: " + animals);
        //Возвращает и удаляет первый элемент
        String str = animals.poll();
        System.out.println("Удаленный элемент: " + str);
        System.out.println("Новый LinkedList: " + animals);
    {}
{}

Результат вывода

LinkedList: [Собака, Конь, Кот]
Удаленный элемент: Собака
Новая LinkedList: [Конь, Кот]

Метод offer()

Метод offer() добавляет указанный элемент в конец связного списка. Например,

import java.util.LinkedList;
import java.util.Queue;
class Main {
    public static void main(String[] args) {
        Queue<String> animals = new LinkedList<>();
        //Добавление элемента в список
        animals.add("Dog");
        animals.add("Horse");
        System.out.println("LinkedList: " + animals);
        //Добавление элемента в конец LinkedList
        animals.offer("Cat");
        System.out.println("Новый LinkedList: " + animals);
    {}
{}

Результат вывода

LinkedList: [Dog, Horse]
Новый LinkedList: [Dog, Horse, Cat]

Пробег по LinkedList итератору

1. Использование цикла forEach для遍ения

import java.util.LinkedList;
class Main {
    public static void main(String[] args) {
        //Создание списка
        LinkedList<String> animals = new LinkedList<>();
        animals.add("Cow");
        animals.add("Cat");
        animals.add("Dog");
        System.out.println("LinkedList: " + animals);
        //Использование цикла forEach
        System.out.println("Доступ к элементам списка:");
        for(String animal: animals) {
            System.out.print(animal);
            System.out.print(", ");
        {}
    {}
{}

Результат вывода

LinkedList: [Коровы, Кошки, Собаки]
Доступ к элементам списка:
Коровы, Кошки, Собаки

2. Использование цикла for

import java.util.LinkedList;
class Main {
    public static void main(String[] args) {
        //Создание списка
        LinkedList<String> animals = new LinkedList<>();
        animals.add("Cow");
        animals.add("Cat");
        animals.add("Dog");
        System.out.println("LinkedList: " + animals);
        //Использование цикла for
        System.out.println("Доступ к элементам списка:");
        for(int i = 0; i < animals.size(); i++) {
            System.out.print(animals.get(i));
            System.out.print(", ");
        {}
    {}
{}

Результат вывода

LinkedList: [Коровы, Кошки, Собаки]
Доступ к элементам списка:
Коровы, Кошки, Собаки

В обоих примерах мы используем цикл для доступа к каждому элементу списка.

3. Использование метода iterator()

Мы можем использовать метод iterator() для доступа к элементам списка. Для использования этого метода нам нужно импортировать пакет java.util.Iterator.

import java.util.LinkedList;
import java.util.Iterator;
class Main {
    public static void main(String[] args) {
        //Создание списка
        LinkedList<String> animals = new LinkedList<>();
        animals.add("Cow");
        animals.add("Cat");
        animals.add("Dog");
        System.out.println("LinkedList: " + animals);
        //Использование метода iterator()
        System.out.println("LinkedList использует метод iterator():");
        Iterator<String> iterate = animals.iterator();
        while(iterate.hasNext()) {
            System.out.print(iterate.next());
            System.out.print(", ");
        {}
    {}
{}

Результат вывода

LinkedList: [Коровы, Кошки, Собаки]
LinkedList использует метод iterator():
Коровы, Кошки, Собаки

LinkedList и ArrayList

LinkedList и ArrayList оба реализуют интерфейс List из фреймворка Collections. Но между ними есть некоторые различия.

LinkedListArrayList

Сохраняет три значения (предыдущий адрес, данные и следующий адрес) в одном положении

Сохраняет один элемент в одном положении

Предоставляет реализацию двунаправленного списка для list

Предоставляет реализацию изменяемого массива

Каждый раз, когда добавляется элемент, изменяются предыдущие и следующие адреса

Каждый раз, когда добавляется элемент, все элементы после этого положения перемещаются

Для доступа к элементам, нам нужно начать итерацию с начала до элемента

Элементы могут быть accessed с помощью индекса для случайного доступа.