Бесплатный курс по Java: от основ до продвинутого уровня
Коллекции в 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);
}
}