Шаг 74.
Язык программирования Java.
Интерфейс List и его реализации

На этом шаге мы рассмотрим интерфейс List

List - это интерфейс, который наследуется от интерфейса Collection. В List были добавлены множество функций для работы со списками. Поговорим только про некоторые из них (с остальными функциями вы можете ознакомиться обратившись к документации):

В стандартной библиотеке Java есть два класса, реализующие интерфейс List. Это классы ArrayList и LinkedList. Разница между ними в том, что в первом классе реализация списка основана на массиве, а во втором на двунаправленном списке. Из-за разницы реализации возникает важный вопрос: когда лучше использовать класс ArrayList, а когда LinkedList? Чтобы вы могли ответить на данный вопрос поговорим о плюсах и минусах данных реализаций:

  1. Класс ArrayList.
    Плюсы: Имеет эффективный доступ к элементу за O(1) (про оценку алгоритмов можно посмотреть здесь).
    Минусы: Вставка и удаление элементов происходит за O(n).
  2. Класс LinkedList.
    Плюсы: Эффективная вставка и удаление элементов из начала и конца списка за O(1).
    Минусы: Доступ к произвольному элементу за O(n).

Приведем ниже пример использования списков.


import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * В данной программе демострируется использование двух классов 
 * ArrayList и LinkedList. Заметим, что мы не используем строки ввида: 
 *                     ArrayList<Integer> list = new ArrayList<>().
 * Вместо этого мы создаем интерфейсные ссылки. Это сделано потому что часто 
 * программистам приходится изменять программы. И для того чтобы уменьшить количество 
 * возможных отпечаток в программе рекомендуется использовать именно 
 * интерфейсные ссылки.
 * */

public class Main {
    /**
     * Максимальное количество элементов в списках
     * */
    private static final int MAX_COUNT_ELEMENTS = 10;

    /**
     * Функция для вывода элементов в списке
     * @param list список элементов
     * */
    private static <T> void printList(List<T> list) {
        for (int index = 0; index < list.size(); index++) {
            System.out.print(" " + list.get(index));
        }
        System.out.println();
    }

    /**
     * Точка входа программы
     * */
    public static void main(String[] args) {
        /*Первый список*/
        List<Integer> list1 = new ArrayList<>();

        /*Построение списка*/
        for (int index = 0; index < MAX_COUNT_ELEMENTS; index++) {
            list1.add(index);
        }

        /*Вывод количества элементов списка*/
        System.out.println("Количество элементов в первом списке: " + list1.size());

        /*Вывод содержимого списка*/
        System.out.print("Элементы первого списка:");
        printList(list1);

        /*Изменение значений 1 и 6 элемента списка*/
        list1.set(0, 55);
        list1.set(5, 46);

        /*Вывод элементов списка после изменения его элементов*/
        System.out.print("Элементы первого списка после изменения:");
        printList(list1);

        /*Конструирование нового списка на основе первого списка*/
        List<Integer> list2 = new LinkedList<>(list1);

        /*Вывод количества элементов списка*/
        System.out.println("\nКоличество элементов во втором списке: " + 
                                                                        list2.size());

        /*Вывод содержимого списка*/
        System.out.print("Элементы второго списка:");
        printList(list2);

        /*
          Удаление 2 элемента списка.
          Все элементы, стоящие справа от 2 элемента сдвигаются влево на одну позицию.
        */
        list2.remove(1);

        /*Удаление 6 элемента списка*/
        list2.remove(5);

        /*Вывод элементов списка после удаления его элементов*/
        System.out.print("Элементы второго списка после изменения:");
        printList(list2);
    }
}

Проект можно взять здесь


Рис. 1. Вывод программы


На следующем шаге мы рассмотрим интерфейсы Queue и Deque

Предыдущий шаг Содержание Следующий шаг