Мы помогаем ИТ-компаниям оптимально настроить процессы менеджмента и разработки

Найти

(067) 536-87-70

(095) 492-65-67

 

Коллекции в Java

10.01.20

Массивы в Java вещь, конечно, удобная и полезная, но такая ли она прям уж идеальная? Что, если мы изначально не знаем сколько элементов хотим положить в массив? Или, если мы хотим определенный элемент, но не знаем где он лежит, а знаем лишь какую-то оригинальную особенность этого объекта (идентификатор)? Тогда нам нужно брать коллекции. 

Все коллекции делятся на два семейства: те, что реализуют интерфейсы Iterable, Collection (Collection extends Iterable) и те, что реализуют Map.

Сначала про Collection:

ArrayList - реализует интерфейс List. Аналогичен обычному массиву, но без фиксированного размера. Изначально имеет размер в 10 элементов. При увеличении элементов происходит перераспределение памяти и размер увеличивается в 1.5 раза. Преимущества get и set элементов.

LinkedList - реализует интерфейсы List и Deque, который в свою очередь расширяет интерфейс Queue. Это связный список состоящий из узлов, каждый из которых имеет ссылку на предыдущий и последующий элемент. Преимущества add, add(index, value), remove.

HashSet - реализует интерфейс Set. Главная цель интерфейса Set в хранении уникальных элементов, порядок при этом не гарантируется. HashSet представляет собой хэш-таблицу. В прошлой статье я рассказывал, что нам понадобятся знания про equals и hashcode. Так вот, для HashSet нужно переопределить equals и hashcode. Дело в том, что когда вы захотите добавить или найти объект в HashSet, то сначала будет идти поиск по hashcode элементам. После, когда найдется ячейка с таким hashcode будет использован equals, чтобы понять это точно тот, же элемент, и его нужно перетереть или другой, и нужно добавить элемент. 

Это далеко не все реализации интерфейса Collection, однако эти три помогут разобраться с другими.

Теперь немного про Map:

HashMap - реализует интерфейс Map. Хранит внутри себя данные в формате ключ-значение. Также как и для HashSet требуется наличие переопределенных методов hashcode и equals у элементов, которые будут храниться в HashMap. По правде говоря, HashSet - это ничто иное, как HashMap<E, Object>. То есть ключ - это E-элемент, который мы вставляем, а Object - это значение-заглушка.

Да, кстати. Вот эта странная структура <E, Object> - это generics, и используется сейчас во всех коллекциях Java. Дело в том, что в самом начале развития языка в эти коллекции можно было пихать все что попало. Вы могли хранить помидоры, яблоки и самосвалы в одной коллекции. По правде говоря, вы и сейчас можете это делать, если не поставите <Apple> в своей коллекции и не ограничите на этапе компиляции вашей программы вставку только яблок. У дженериков много возможностей, помимо ограничения коллекций.

TreeMap  - реализует интерфейс NavigableMap, который расширяет SortedMap, который, в свою очередь, расширяет интерфейс Map. В TreeMap все объекты автоматически сортируются по возрастанию ключей. Также можно достать все элементы до или после определенного ключа.

Это малая, но основная, часть коллекций в Java. Да, и чтобы понять эту часть, необходимо больше информации, чем дано в этой статье или какой либо другой (кроме документации конечно же). Чтобы лучше понять все тонкости и проблемы коллекций, лучше заходить в их исходный код. Это можно сделать удобно через IDE просто перейдя по CTRL + клик или же в браузере вбить в поисковик Java collectionName source code.

На этом все. Не забывайте практиковаться, а уже в следующей статье я расскажу некоторые из особенностей Java 8, в которой было введено много всего нового, что используется каждый день в разработке. 

 Весь цикл читайте на страничке Сергея Посьмашного

 

Автор

photo
Сергей Посьмашный
Java blogger, физик, путешественник