1. Контейнеры и коллекции
Контейнерами или коллекциями называют классы, которые позволяют хранить и обрабатывать много объектов сразу. Вы уже знаете две разновидности контейнеров — массивы и списки.
В Java есть несколько десятков коллекций, каждая из которых хранит элементы своим специфическим способом. Вот некоторые из них:
Тип коллекции | Класс | Описание |
---|---|---|
|
|
Список |
|
Связный список | |
|
Вектор | |
|
Стэк (стопка) | |
|
|
Множество |
|
||
|
||
|
|
Очередь |
|
||
|
|
Карта/Словарь |
|
||
|
Тут есть некоторая неоднозначность с именами. Хотя в большинстве языков программирования все эти структуры данных принято называть коллекциями, в Java это не так. В языке Java некоторые из этих классов реализуют интерфейс Collection
, в то время как другие — нет.
Поэтому коллекции разделились на коллекции в широком смысле и коллекции в узком смысле (только те, которые реализуют интерфейс Collection
).
Поэтому, чтобы не путаться, коллекциями называют только коллекции в узком смысле (классы должны реализовывать интерфейс Collection
). Это все коллекции типа List
, Set
и Queue
. Коллекции же в широком смысле принято называть контейнерами. К ним относятся классы типа Map
и массивы.
2. Коллекция HashSet
Класс HashSet
является типичным представителем коллекций типа «множество». Во многом он похож на класс ArrayList
, и в каком-то смысле является его более примитивной версией.
Создать объект типа HashSet
можно с помощью команды вида:
HashSet<Тип> имя = new HashSet<Тип>();
Где тип — это тип элементов, которые можно хранить в коллекции HashSet
.
У класса HashSet
есть такие методы:
Метод | Описание |
---|---|
|
Добавляет элемент value в коллекцию |
|
Удаляет элемент value из коллекции.Возвращает true , если там такой элемент был
|
|
Проверяет, есть ли в коллекции элемент value |
|
Очищает коллекцию: удаляет все элементы |
|
Возвращает количество элементов в коллекции |
Пример использования множества.
Давайте напишем программу, которая прощается с пользователем, если он с ней поздоровался: если пользователь сказал привет. Для большего интереса «привет» можно будет говорить на нескольких языках.
Код | Примечание |
---|---|
|
Создаем объект типа HashSet , который хранит элементы типа String .Заносим в set приветствия на разных языках.Вводим с консоли слово, если это слово есть в нашем множестве приветствий, то прощаемся (по-белорусски). |
3. Множество
Коллекция Set
создана для хранения множества элементов. Поэтому ее так и называют Set
(множество). У этой коллекции есть три особенности.
Операции над множеством
С множеством можно делать только три операции: добавлять элементы во множество, удалять элементы из множества и проверять, есть ли во множестве определенный элемент. Все.
Отсутствие порядка
У элементов этой коллекции нет номеров. Нельзя получить элемент по его индексу или записать значение в коллекцию по определенному индексу. Методов get()
и set()
у множества нет.
Уникальность элементов
Все элементы множества уникальны. В отличие от списка, во множестве один элемент может быть только раз. Объект или находится во множестве, или нет: третьего не дано. Нельзя во «множество цветов» трижды добавить «черный цвет». Он там либо есть, либо его нет.
Поиск элементов
Когда вы добавляете во множество новый элемент, удаляете элемент, или проверяете наличие элемента, внутри метода выполняется поиск элемента. Элементы коллекции и переданный элемент сравниваются сначала по hashCode()
, а если hashCode()
совпадают, по equals
.
4. Сравнение коллекций: List
vs Set
Давайте сравним коллекции двух типов: List
и Set
. В чем же их основные отличия и когда выгоднее использовать одну, а когда – вторую.
Давайте попробуем сравнить Список и Множество на примере детских игрушек.
Коллекция List
(Список) похожа на набор игрушек в детской комнате, стоящих возле стены. Можно добавить игрушку в конец списка. Можно вставить и в середину, если очень нужно (но часть игрушек придется передвинуть).
У каждой игрушки есть порядковый номер. Можно взять игрушку по ее номеру или заменить игрушку номер 7 на игрушку номер 13. Можно удалить из списка игрушку номер 4. Ну и наконец, можно узнать количество всех игрушек в списке.
Коллекция Set
(Множество) больше похожа на игрушки, сброшенные в кучу. В кучу можно добавить игрушку, можно удалить игрушку из кучи. Но фиксированного номера у таких игрушек нет.
Или допустим, вы выбираете ребенку игрушку на день рождения. Тогда вы в первую очередь думаете, есть у него такая игрушка или нет. Тогда все игрушки, которые у него есть, образуют множество игрушек, которые вы решили не покупать.
С этой точки зрения порядок игрушек в наборе «уже есть» не играет роли, как и наличие у именинника двух одинаковых игрушек. Вас интересуют не сами игрушки и их количество, а игрушки как набор неких уникальных объектов.
Вот для таких случаев вам и понадобится множество Set
и его самый популярный представитель — класс HashSet
.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ