1. Контейнеры и коллекции

Контейнерами или коллекциями называют классы, которые позволяют хранить и обрабатывать много объектов сразу. Вы уже знаете две разновидности контейнеров — массивы и списки.

В Java есть несколько десятков коллекций, каждая из которых хранит элементы своим специфическим способом. Вот некоторые из них:

Тип коллекции Класс Описание
List
ArrayList
Список
LinkedList
Связный список
Vector
Вектор
Stack
Стэк (стопка)
Set
HashSet
Множество
TreeSet
LinkedHashSet
Queue
PriorityQueue
Очередь
ArrayDeque
Map
HashMap
Карта/Словарь
TreeMap
HashTable

Тут есть некоторая неоднозначность с именами. Хотя в большинстве языков программирования все эти структуры данных принято называть коллекциями, в Java это не так. В языке Java некоторые из этих классов реализуют интерфейс Collection, в то время как другие — нет.

Поэтому коллекции разделились на коллекции в широком смысле и коллекции в узком смысле (только те, которые реализуют интерфейс Collection).

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


2. Коллекция HashSet

Класс HashSet является типичным представителем коллекций типа «множество». Во многом он похож на класс ArrayList, и в каком-то смысле является его более примитивной версией.

Создать объект типа HashSet можно с помощью команды вида:

HashSet<Тип> имя = new HashSet<Тип>();

Где тип — это тип элементов, которые можно хранить в коллекции HashSet.

У класса HashSet есть такие методы:

Метод Описание
void add(Тип value)
Добавляет элемент value в коллекцию
boolean remove(Тип value)
Удаляет элемент value из коллекции.
Возвращает true, если там такой элемент был
boolean contains(Тип value)
Проверяет, есть ли в коллекции элемент value
void clear()
Очищает коллекцию: удаляет все элементы
int size()
Возвращает количество элементов в коллекции

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

Давайте напишем программу, которая прощается с пользователем, если он с ней поздоровался: если пользователь сказал привет. Для большего интереса «привет» можно будет говорить на нескольких языках.

Код Примечание
HashSet<String> set = new HashSet<String>();

set.add("Привет");
set.add("Hello");
set.add("Hola");
set.add("Bonjour");
set.add("Cialo");
set.add("Namaste");

Scanner console = new Scanner(System.in);
String str = console.nextLine();

if (set.contains(str))
   System.out.println("Да спаткання!");
Создаем объект типа HashSet, который хранит элементы типа String.


Заносим в set приветствия на разных языках.




Вводим с консоли слово,


если это слово есть в нашем множестве приветствий, то прощаемся (по-белорусски).

14
Задача
Java Syntax Pro,  14 уровень1 лекция
Недоступна
Оформляем возврат
В классе Solution есть метод arrayToHashSet(String[]), который должен из переданного массива вернуть HashSet с теми же элементами. Метод main не участвует в проверке.

3. Множество

Коллекция Set создана для хранения множества элементов. Поэтому ее так и называют Set (множество). У этой коллекции есть три особенности.

Операции над множеством

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

Отсутствие порядка

У элементов этой коллекции нет номеров. Нельзя получить элемент по его индексу или записать значение в коллекцию по определенному индексу. Методов get() и set() у множества нет.

Уникальность элементов

Все элементы множества уникальны. В отличие от списка, в множестве один элемент может быть только раз. Объект или находится во множестве, или нет: третьего не дано. Нельзя во «множество цветов» трижды добавить «черный цвет». Он там либо есть, либо его нет.

Поиск элементов

Когда вы добавляете во множество новый элемент, удаляете элемент, или проверяете наличие элемента, внутри метода выполняется поиск элемента. Элементы коллекции и переданный элемент сравниваются сначала по hashCode(), а если hashCode() совпадают, по equals.


14
Задача
Java Syntax Pro,  14 уровень1 лекция
Недоступна
Проверка присутствия
В классе Solution есть метод checkWords(String), который должен проверять наличие переданного слова в множестве words. Если слово есть, то выводим в консоль: Слово [переданное слово] есть в множестве Если нет: Слова [переданное слово] нет в множестве Метод main не участвует в проверке. Пример

4. Сравнение коллекций: List vs Set

Давайте сравним коллекции двух типов: List и Set. В чем же их основные отличия и когда выгоднее использовать одну, а когда – вторую.

Давайте попробуем сравнить Список и Множество на примере детских игрушек.

Коллекция List (Список) похожа на набор игрушек в детской комнате, стоящих возле стены. Можно добавить игрушку в конец списка. Можно вставить и в середину, если очень нужно (но часть игрушек придется передвинуть).

У каждой игрушки есть порядковый номер. Можно взять игрушку по ее номеру или заменить игрушку номер 7 на игрушку номер 13. Можно удалить из списка игрушку номер 4. Ну и наконец, можно узнать количество всех игрушек в списке.

Коллекция Set (Множество) больше похожа на игрушки, сброшенные в кучу. В кучу можно добавить игрушку, можно удалить игрушку из кучи. Но фиксированного номера у таких игрушек нет.

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

С этой точки зрения порядок игрушек в наборе «уже есть» не играет роли, как и наличие у именинника двух одинаковых игрушек. Вас интересуют не сами игрушки и их количество, а игрушки как набор неких уникальных объектов.

Вот для таких случаев вам и понадобится множество Set и его самый популярный представитель — класс HashSet.