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 есть такие методы:

Метод Описание
boolean 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("Ciao");
set.add("Namaste");

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

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


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




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


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

12
Задача
Модуль 1. Java Syntax,  21 уровень2 лекция
Недоступна
Сокращаем try
Программа считывает с консоли строку и выводит ее на экран в нижнем регистре. Не меняя функциональности программы, перепиши код с использованием try-with-resources. Вынеси в круглые скобки создание объектов с внешними ресурсами. Не забудь удалить ненужные вызовы метода close().

3. Множество

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

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

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

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

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

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

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

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

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


12
Задача
Модуль 1. Java Syntax,  21 уровень2 лекция
Недоступна
Возврат к истокам
Программа считывает с консоли строку и выводит ее на экран в верхнем регистре. Но оказывается, она не будет работать на старых версиях Java (ниже 7й версии). Не меняя функциональности программы, перепиши блок try-with-resources на обычный try-catch. Не забудь о вызове метода close() для объектов с в

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

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

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

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

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

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

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

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

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