IT-Storm

Easy things should be easy and hard things should be possible

Menu

О коллекциях в Java. (ч1)

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

Java