О коллекциях в Java. (ч1)
Коллекциями/контейнерами в Java принято называть классы, основная цель которых – хранить набор других элементов. Например - ArrayList.
В Java коллекции делятся на три основных группы:
Set — множество, List — список, Map — словарь (или карта).
Их отличие:
Начнём с Set. Представь много фруктов сброшенных в кучу – это Set — множество. В set можно добавить элемент, поискать его или удалить. Но у элементов там нет строго заданного порядка!
А теперь представь ту же кучу фруктов, но выставленную вдоль стола. Теперь в ней появился порядок. У каждого элемента есть его номер. И можно просто взять «пару номер 7» по её номеру. Это – List – список. Мы можем добавить элемент в начало списка или в середину, или убрать его, и сделать это просто по его номеру.
Теперь о Map. Представьте те же фрукты, но теперь у каждого есть табличка с именем «Коля», «Вася», «Аня». Это Map – мэп, (его еще часто называют «карта» или «словарь»). У каждого элемента есть его уникальное название, по которому к нему можно было обращаться. Уникальное название элемента ещё называют «ключом». А Map – это набор пар «ключ»-«значение». Ключ не обязательно должен быть строкой, он может быть любым типом. Map, у которого тип ключа – Integer, – это фактически List (с некоторыми отличиями).
В коллекциях предусмотрены методы, для работы с ними. Например, чтобы узнать количество содержащихся в коллекции эллементов, есть метод size(). В коллекциях есть все необходимое. В дальнейших статьях методы будут рассмотрены более подробно, и можно будет убедиться, что с коллекциями работать очень удобно.Все коллекции и контейнеры сразу после создания ничего в себе не хранят. Но в них можно постепенно добавлять элементы – тогда они будут динамически изменять свой размер.
Cписок коллекций и интерфейсов:
Интерфейс | Класс/Реализация | Описание |
---|---|---|
List | ArrayList | Список |
LinkedList | Список | |
Vector | Вектор | |
Stack | Стек | |
Set | HashSet | Множество |
TreeSet | Множество | |
SortedSet | Отсортированное множество | |
Map | HashMap | Карта/Словарь |
TreeMap | Карта/Словарь | |
SortedMap | Отсортированный словарь | |
Hashtable | Хеш-таблица |
Четыре List’а, три Set’а и четыре Map’а это все различные реализации интерфейсов List, Set и Map.
Как вывести List, Set и Map?
У элементов списка (List) есть четко заданный порядок, поэтому их можно вывести просто по номеру. У Set и Map строго заданного порядка элементов нет. Собственно говоря, порядок их элементов может меняться при удалении или добавлении какого-нибудь элемента. Поэтому для работы с элементами коллекций были придуманы специальные объекты – итераторы. С их помощью можно пройтись по всем элементам коллекции, даже если у них нет номера, а только имена (Map), или вообще нет имён – Set.
Примеры:
Вывод на экран элементов Set
public static void main(String[] args) { Set set = new HashSet(); set.add("Mama"); set.add("Mila"); set.add("Ramu"); //получение итератора для множества Iterator iterator = set.iterator(); while (iterator.hasNext()) //проверка, есть ли ещё элементы { //получение текущего элемента и переход на следующий String text = iterator.next(); System.out.println(text); } }Вывод на экран элементов List
public static void main(String[] args) { List list = new ArrayList(); list.add("Mama"); list.add("Mila"); list.add("Ramu"); Iterator iterator = list.iterator();//получение итератора для списка while (iterator.hasNext()) //проверка, есть ли ещё элементы { //получение текущего элемента и переход на следующий String text = iterator.next(); System.out.println(text); } }Вывод на экран элементов Map
public static void main(String[] args) { //все элементы хранятся в парах Map map = new HashMap(); map.put("first", "Mama"); map.put("second", "Mila"); map.put("third", "Ramu"); Iterator> iterator = map.entrySet().iterator(); while (iterator.hasNext()) { //получение «пары» элементов Map.Entry pair = iterator.next(); String key = pair.getKey(); //ключ String value = pair.getValue(); //значение System.out.println(key + ":" + value); } }Как это работает?
Сначала мы получаем у коллекции специальный объект-iterator. У него есть всего два метода:
1. Метод next() возвращает очередной элемент коллекции.
2. Метод hasNext() проверяет, есть ли еще элементы, которые не возвращал next().
То есть:
Сначала надо вызвать у коллекции метод iterator(), чтобы получить этот волшебный объект-итератор.
Затем мы в цикле, пока есть еще неполученные элементы, получаем их по одному.
Получаем мы очередной элемент коллекции с помощью вызова next(), а проверяем, есть ли еще элементы в итераторе с помощью hasNext().
Теперь самое интересное) В Java есть сокращённая запись работы с итераторами. По аналогии с while, в for был добавлен еще один специальный оператор «for each» — «для каждого». Обозначается тоже ключевым словом for. Оператор for each используется только при работе с коллекциями и контейнерами. В нем неявно используется итератор, но мы видим уже полученный элемент. Пример длинной и сокращенной работы с итератором:
Длинная запись:
public static void main(String[] args) { Set set = new HashSet(); set.add("Mama"); set.add("Mila"); set.add("Ramu"); Iterator iterator = set.iterator(); while (iterator.hasNext()) { String text = iterator.next(); System.out.println(text); } }Сокращённая запись:
public static void main(String[] args) { Set set = new HashSet(); set.add("Mama"); set.add("Mila"); set.add("Ramu"); for (String text : set) { System.out.println(text); } }Обратите внимание: в нижнем примере, в нижней его части: нет ни слов iterator, ни вызовов методов hasNext(), next().
Фактически 3 строки заменяются на одну:
Длинная запись
Iterator iterator = set.iterator(); while (iterator.hasNext()) { String text = iterator.next();Сокращенная запись
for (String text : set)Посмотрим на те же примеры, что и выше, только записанные короче:
Вывод на экран элементов Set
public static void main(String[] args) { Set set = new HashSet(); set.add("Mama"); set.add("Mila"); set.add("Ramu"); for (String text : set) { System.out.println(text); } }Вывод на экран элементов List
public static void main(String[] args) { List list = new ArrayList(); list.add("Mama"); list.add("Mila"); list.add("Ramu"); for (String text : list) { System.out.println(text); } }Вывод на экран элементов Map
public static void main(String[] args) { Map map = new HashMap(); map.put("first", "Mama"); map.put("second", "Mila"); map.put("third", "Ramu"); for (Map.Entry pair : map.entrySet()) { String key = pair.getKey(); //ключ String value = pair.getValue(); //значение System.out.println(key + ":" + value); } }