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

Коллекциями/контейнерами в Java принято называть классы, основная цель которых — хранить набор других элементов. В Java коллекции делятся на три основных группы: Set — множество, List — список, Map — словарь (или карта). Чтобы понять что каждая группа собой представляет давайте рассмотрим для примера магазин обуви.

Итак Set. Представьте много пар туфель сброшенных в кучу  — это Set — множество. В set можно добавить элемент, поискать его или удалить. Но у элементов там нет строго заданного порядка и каждый элемент уникальный, то есть нет дубликатов.

List. Нужно представить ту же кучу обуви, но выставленную вдоль прилавка. Теперь в ней появился порядок. У каждого элемента есть его номер. В таком случае нам не нужно искать элемент (пару туфлей) по каком-то значению. Мы можем просто взять «пару номер 7» по её номеру. Мы можем добавлять элемент в начало списка или в середину, или убрать его, и сделать это просто по его номеру.

И наконец Map. Опять берем ту же обувь, но теперь напротив каждой пары мы ставим табличку с именем («Вася», «Коля», «Петя» и т д) того, кто например зарезервировал себе эти «туфельки». В итоге у каждого элемента (пары обуви) есть его уникальное название (имя покупателя), по которому к нему можно было обращаться. Уникальное название элемента еще называют «ключом». А Map — это набор пар «ключ»-«значение». Ключ не обязательно должен быть строкой (текстом), он может быть любым типом. Map — у которого тип ключа — Integer (цифра), — это фактически List (с некоторыми отличиями).

Далее смотрим на табличку ниже со списком коллекция и интерфейсов:

Да да, это все различные реализации интерфейсов List, Set и Map. Мы их все рассмотрим, но позже. Сегодня же хочу остановиться на ArrayList и LinkedList и коротко рассказать что это за звери и чем они отличаются.

ArrayList vs LinkedList

Из таблицы выше понятно что у одного и того же интерфейса может быть несколько реализаций. Все дело в том, что нет одного идеального, подходящего всем решения. При одном подходе одни операции являются быстрыми, а остальные медленными, при другом — все наоборот. Поэтому и сделано несколько реализаций одной и той же коллекции и каждая реализация была оптимизирована для какого-то узкого набора операций. — ArrayList реализован внутри в виде обычного массива. Поэтому при вставке элемента в середину, приходиться сначала сдвигать на один все элементы после него, а уже затем в освободившееся место вставлять новый элемент. Зато в нем быстро реализованы взятие и изменение элемента – операции get, set, так как в них мы просто обращаемся к соответствующему элементу массива.

— LinkedList реализован внутри по-другому. Он реализован в виде связного списка: набора отдельных элементов, каждый из которых хранит ссылку на следующий и предыдущий элементы. Чтобы вставить элемент в середину такого списка, достаточно поменять ссылки его будущих соседей. А вот чтобы получить элемент с номером 550, нужно пройтись последовательно по всем объектам от 0 до 500. Другими словами операции set и get тут реализованы очень медленно.

Чтобы все прояснить смотрим табличку в которой я наглядно продемонстрировал разницу.

Для простоты, я бы сформировал такое правило: если нужно вставлять (или удалять) в середину коллекции много элементов, то лучше использовать LinkedList. Во всех остальных случаяхArrayList.

Как они устроены я рассматривать не буду так как моей целью было на пальцах объяснить что это такое и с чем его едят. Но для тех кто хочет «хардкора» я дам парочку ссылок на интересные статьи об ArrayList и LinkedList.

На этом все, дальнейшее рассмотрение коллекций ждите в моих новых статьях в рубрике «Java на пальцах».

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *