Коллекции в Java. Интерфейс List

Что же такое коллекция?

Это можно сказать такой особый тип массива.

Мы знаем, что у обычного Java массива есть строгая граница количества элементов, которые могут в нем быть (эту границу мы задаем при инициализации вот так – int [] a = new int[5]).

Это называется статический массив.

Но часто может пригодиться динамический массив, то есть который может расширяться.

То есть у него нет фиксированно возможного количества элементов.

В Java в библиотеке Collections есть много разных динамических массивов каждый из которых нужен для разных задач и ситуаций.

То есть они не просто динамические массивы, а еще и имеют разную структуру и применение.

Поэтому в Java корректно называть их не просто “динамическими массивами”, а коллекциями.

Есть четыре основных вида коллекций List, Queue, Set и Map.

Каждая из коллекций имеет свои подвиды, которые мы будем разбирать.

Важно упомянуть что List, Queue, Set и Map это интерфейсы которые имеют разные реализации (подвиды).


ArrayList

Для начала разберем реализации List.

Благодаря классам реализующим List можно создать динамически изменяющийся массив.

Первый подвид List, который мы рассмотрим это ArrayList.

ArrayList – лучше использовать когда часто нужен доступ по индексу

Пример программы:

import java.util.*; public class ListLesson { public static void main(String[] args) { //Создаем список. //Как видим никакого размера не указываем ArrayList aList = new ArrayList(); // добавление элемента aList.add(“Sunday”); aList.add(“Monday”); aList.add(“Tuesday”); // удаление элемента aList.remove(“Monday”); //Доступ к каждому элементу с помощью get. //метод get для доступа к элементам по индексу for(int i = 0; i< aList.size(); i++) { System.out.println(aList.get(i)); } // проверка на наличие элемента в списке System.out.println(aList.contains("Tuesday")); } }

Вывод:


LinkedList

LinkedList – лучше использовать когда часто производиться вставка/удаление из массива, занимает больше памяти чем ArrayList.

Пример программы:

import java.util.*; public class ListLesson { public static void main(String[] args) { // Создать новый объект LinkedList LinkedList llist = new LinkedList(); // Добавление элементов в связанный список // тем же методом что и у ArrayList. llist.add(“Days in a Week”); // добавить // Добавить в произвольное место связанного списка llist.add(1, “Middle”); llist.add(2, “End”); // Удаление элемента llist.remove(“End”); // Если не вписать аргумент, то удалится элемент, // который был добавлен в массив наиболее давно. llist.remove(); // Доступ к каждому элементу с помощью get for (int i = 0; i < llist.size(); i++) { System.out.println(llist.get(i)); } // проверка на наличие элемента в списке System.out.println(llist.contains("Tuesday")); } }

Вывод:

Из реализаций List есть еще Vector – это как ArrayList, только синхронизирован(для работы с потоками, их будем проходить потом).


Конвертация коллекции из одного типа в другой.

Можно при создании коллекции поместить в нее элементы из другой ранее созданной коллекции.

При этом эта другая коллекция может быть другого типа по отношению к создаваемой. То есть фактически это значит, что возможно менять тип коллекции.

Пример программы:

import java.util.*; class ListLesson { public static void main(String[] args) { // создаем список ArrayList aList = new ArrayList(); aList.add(“Sunday”); aList.add(“Monday”); aList.add(“Tuesday”); // Создать новый объект LinkedList LinkedList lList = new LinkedList(); lList.add(“Days in a Week”); lList.add(1, “Middle”); lList.add(2, “End”); //Можно создать коллекцию с элементами другой коллекции //другого типа. Можно сказать, что снизу мы поменяли тип //ранее созданной коллекции lList с LinkedList на ArrayList. ArrayList< String > LinkedToArray = new ArrayList<>(lList); LinkedList< String > ArrayToLinked = new LinkedList<>(aList); //Выведем на консоль коллекции for(int i = 0; i < LinkedToArray.size(); i++) { System.out.println(LinkedToArray.get(i)); } for(int i = 0; i< ArrayToLinked.size(); i++) { System.out.println(ArrayToLinked.get(i)); } //также можно задать значение //начального размера внутреннего массива ArrayList< String > list2 = new ArrayList<>(10000); } }

Вывод:

Iterator в коллекциях Java

Изучите Iterator в Java: универсальный способ перебора любых коллекций без знания их внутренней структуры. Примеры кода и объяснение работы.
Time to read: 8

Интерфейс Queue в Java

Освойте PriorityQueue и принцип FIFO: как работает приоритетная очередь, сортировка элементов и удаление по приоритету. Подробные примеры на Java.
Time to read: 9

Интерфейс Map в Java

Разберитесь с HashMap, TreeMap и LinkedHashMap: хранение пар ключ-значение, сортировка по ключу и принцип работы hash-коллекций. Практические примеры.
Time to read: 16