Списки

Типы данных и исключения в Java

Jim White

Java Developer

Интерфейс List

  • Интерфейс List, подинтерфейс Collection
    • Определяет упорядоченную группу объектов
    • Может содержать дублирующиеся объекты
  • Несколько реализаций List
    • Поведение у всех схожее
    • Реализация определяет, как объекты управляются внутри
Типы данных и исключения в Java

Реализации List

  • ArrayList — изменяемый, индексированный (как массивы) упорядоченный список объектов

ArrayList похож на массивы Java с индексированными элементами

  • LinkedList — объекты, связанные ссылками на следующий и предыдущий элементы.

LinkedList — список объектов, связанных указателями

  • Независимо от реализации, объекты добавляются, удаляются и изменяются одинаково
1 See https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/List.html for List types and details
Типы данных и исключения в Java

ArrayList

  • Создайте экземпляр с помощью new, укажите тип содержимого через дженерики
  • Добавьте объект в конец списка: .add(object)
  • Получите объект по индексу: .get(index)
    • У ArrayList индексация начинается с нуля
  • Замените объект: .set(index, object)
  • Удалите объект: .remove(index)
  • Очистите список: .clear()
  • Количество объектов: .size()
import java.util.ArrayList;
...
ArrayList<String> animals
  = new ArrayList<String>();

animals.add("horse"); animals.add("cow"); animals.add("horse"); // Duplicates allowed
String c = animals.get(1); // c="cow" animals.set(1, "chicken");
// Removes the first horse animals.remove(0); // Removes all objects animals.clear();
animals.size();
Типы данных и исключения в Java

Объекты и примитивы

  • Используйте обёртки, чтобы добавить примитив в объект Collections Framework
  • Добавляемые примитивы «автоупаковываются»
    • Автоупаковка: процесс автоматического помещения примитива в обёртку
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(new Integer(5));
list.add(6);  // 6 is automatically wrapped by Integer then added
  • Автоупаковка работает со всеми объектами Collections Framework
Типы данных и исключения в Java

Гетерогенные коллекции

  • Структуры данных Collections Framework могут быть гетерогенными
    • Гетерогенные = хранят объекты разных типов
    • Используйте Object в качестве параметризованного типа
ArrayList<Object> list = new ArrayList<Object>(); // Allow any object
list.add(new Integer(5)); // Add an Integer
list.add(6); // Add an Integer using autoboxing
list.add("Hello"); // Add a String
Типы данных и исключения в Java

Перебор элементов List

  • Используйте синтаксис «for each» для перебора объектов List
ArrayList<String> animals = new ArrayList<String>();
animals.add("horse");
animals.add("cow");
animals.add("chicken");

for (String animal : animals) { // fore-each to loop through all in the ArrayList
    System.out.println(animal);
}
horse
cow
chicken
Типы данных и исключения в Java

List и println

  • Содержимое экземпляра List (например, ArrayList) можно вывести с помощью println
ArrayList<String> animals = new ArrayList<String>();
animals.add("horse");
animals.add("cow");
animals.add("chicken");
System.out.println(animals);  // Display all the elements in the ArrayList

ArrayList<Object> list = new ArrayList<Object>();
list.add(5);
list.add("Hello");
System.out.println(list);  // Display all the elements in the ArrayList
[horse, cow, chicken]
[5, Hello]
Типы данных и исключения в Java

LinkedList

  • LinkedList создаётся так же, как экземпляры ArrayList
  • LinkedList поддерживает те же методы, что и ArrayList
import java.util.LinkedList;
...
LinkedList<String> cars // Create a new ...
  = new LinkedList<String>(); // ... LinkedList
cars.add("Ford"); // Add an object to the list
cars.add("Mercedes");
String c = cars.get(1);
cars.set(1, "Toyota"); // Replace an object
System.out.println(cars); // Display the list
cars.remove(0); // Remove an object
cars.clear();  // Remove all objects
cars.size(); // Get the list length
[Ford, Toyota]
Типы данных и исключения в Java

Дополнительные методы LinkedList

  • Дополнительные методы
    • addFirst() — добавить в начало списка
    • addLast() — добавить в конец списка
    • removeFirst() — удалить из начала
    • removeLast() — удалить из конца
cars.addFirst("Fiat"); // Add to the beginning
cars.addLast("BMW"); // Add the the end
cars.removeFirst(); // Remove the first object
cars.removeLast(); // Remove the last object
Типы данных и исключения в Java

Сходство типов коллекций

  • ArrayList и LinkedList выглядят одинаково
    • Другие типы Collections Framework также имеют сходства
    • Это сделано намеренно
  • У них общий интерфейс: List
    • Это пример полиморфизма («многих форм»)
Типы данных и исключения в Java

ArrayList vs LinkedList

  • Операции над ArrayList и LinkedList (и любым List) одинаковы
    • Выбор типа List зависит от задачи
  • Особенности ArrayList:
    • Быстрый произвольный доступ (например: list.get(11))
    • Медленнее при добавлении и удалении элементов в середине
    • Так как объекты приходится физически перемещать при вставке и удалении

Добавление объектов в середину ArrayList требует многочисленных перемещений

Типы данных и исключения в Java

ArrayList vs LinkedList

  • Особенности LinkedList:
    • Медленнее при произвольном доступе (например: list.get(11))
    • Быстрее при добавлении и удалении элементов в середине
    • Так как объекты физически не перемещаются — изменяются лишь несколько ссылок

Добавление объектов в середину LinkedList требует лишь изменения нескольких указателей

Типы данных и исключения в Java

Давайте потренируемся!

Типы данных и исключения в Java

Preparing Video For Download...