О коллекциях в 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);
}
}