Список всех коллекций

Открыта
Список всех коллекций - 1

— Привет, Амиго.

— Здорова, Риша.

— Элли мне сказала, что ты хотел больше примеров коллекций. Сейчас я дам тебе несколько. Хочу представить тебе список коллекций и интерфейсов:

Интерфейс Класс/Реализация Описание
List  ArrayList  Список
 LinkedList  Список
 Vector  Вектор
 Stack  Стек
 Set    HashSet  Множество
 TreeSet  Множество
 SortedSet  Отсортированное множество
Map  HashMap Карта/Словарь
 TreeMap  Карта/Словарь
 SortedMap  Отсортированный словарь
 Hashtable  Хеш-таблица

— Хм. Как их много. Четыре List’а, три Set’а и четыре Map’а.

— Да, это все различные реализации интерфейсов List, Set и Map.

— А чем отличаются различные реализации?

— Об этом как раз сегодня мы тебе и расскажем. Просто подожди немного.

— Может, у тебя уже накопились какие-нибудь вопросы?

— Как вывести список на экран я знаю. А как вывести Set и Map?

— У элементов списка (List) есть четко заданный порядок, поэтому их можно вывести просто по номеру. У Set и Map строго заданного порядка элементов нет. Собственно говоря, порядок их элементов может меняться при удалении или добавлении какого-нибудь элемента.

— Надо же.

— Поэтому для работы с элементами коллекций были придуманы специальные объекты – итераторы. С их помощью можно пройтись по всем элементам коллекции, даже если у них нет номера, а только имена (Map), или вообще нет имён – Set.

-Примеры:

Вывод на экран элементов Set
public static void main(String[] args)
{
    Set<String> set = new HashSet<String>();
    set.add("Mama");
    set.add("Mila");
    set.add("Ramu");

    //получение итератора для множества
    Iterator<String> iterator = set.iterator();

    while (iterator.hasNext())        //проверка, есть ли ещё элементы
    {
        //получение текущего элемента и переход на следующий
        String text = iterator.next();

        System.out.println(text);
    }
}
2
Задача
Java Syntax,  8 уровень,  2 лекция
Недоступна
Набираем код
Иногда думать не надо, строчить надо! Как ни парадоксально звучит, порой пальцы «запоминают» лучше, чем сознание. Вот почему во время обучения в секретном центре JavaRush вы иногда встречаете задания на набор кода. Набирая код, вы привыкаете к синтаксису и зарабатываете немного материи. А ещё — боретесь с ленью.
Вывод на экран элементов List
public static void main(String[] args)
{
    List<String> list = new ArrayList<String>();
    list.add("Mama");
    list.add("Mila");
    list.add("Ramu");

    Iterator<String> iterator = list.iterator();//получение итератора для списка

    while (iterator.hasNext())      //проверка, есть ли ещё элементы
    {
        //получение текущего элемента и переход на следующий
        String text = iterator.next();

        System.out.println(text);
    }
}
Вывод на экран элементов Map
public static void main(String[] args)
{
    //все элементы хранятся в парах
    Map<String, String> map = new HashMap<String, String>();
    map.put("first", "Mama");
    map.put("second", "Mila");
    map.put("third", "Ramu");

    Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();

   while (iterator.hasNext())
    {
        //получение «пары» элементов
        Map.Entry<String, String> 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<String> set = new HashSet<String>();
  set.add("Mama");
  set.add("Mila");
  set.add("Ramu");

  Iterator<String> iterator = set.iterator();
 while (iterator.hasNext())
  {
    String text = iterator.next();
    System.out.println(text);
  }
}
Сокращенная запись
public static void main(String[] args)
{
    Set<String> set = new HashSet<String>();
    set.add("Mama");
    set.add("Mila");
    set.add("Ramu");

    for (String text : set)
    {
        System.out.println(text);
    }
}

— Обрати внимание: в правой нижней таблице нет ни зелёных, ни красных слов. Фактически 3 строки заменяются на одну:

Длинная запись
Iterator<String> iterator = set.iterator();
while (iterator.hasNext())
{
    String text = iterator.next();
Сокращенная запись
for (String text : set)

— Выглядит шикарно. Так мне нравится гораздо больше!

— Давай посмотрим на те же примеры, что и выше, только записанные короче:

Вывод на экран элементов Set
public static void main(String[] args)
{
    Set<String> set = new HashSet<String>();
    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<String> list = new ArrayList<String>();
    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<String, String> map = new HashMap<String, String>();
    map.put("first", "Mama");
    map.put("second", "Mila");
    map.put("third", "Ramu");

    for (Map.Entry<String, String> pair : map.entrySet())
    {
        String key = pair.getKey();                      //ключ
        String value = pair.getValue();                  //значение
        System.out.println(key + ":" + value);
    }
}

— Так это же другое дело!

— Рад, что тебе понравилось.

Комментарии (196)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Александр GoProшкин8 уровень, Чехов
пятница, 17:33
Похоже на этом ВСЁ!
Гульнара20 уровень, Ульяновск
2 января, 11:25
Vector является давно устаревшим классом, от которого наследуется Stack
Алексей10 уровень, Гомель
31 декабря 2019, 14:27
Доброго времени. При решении одной из задач я применил цикл «for each» для того что бы удалять элементы (целые числа) которые больше 10. Мне выбрасывало "concurrentmodificationexceptio". Решил сделать тоже самое с помощью итератора и все заработало без ошибок. Вопрос вот в чем "for each" применяется только для перебора коллекции, в этом цикле нельзя изменять коллекцию? Если так то для изменения коллекции во время цикла нужно обязательно использовать итератор? Просто в лекции там рассказывается что "for each" это быстрая сокращенная форма того же цикла с итератором.
alex13 уровень
2 января, 03:43
все верно, где-то ранее в описании класса ArrayList говорилось об этом, что в теле цикла for нельзя изменять значения
Anna Eleeva16 уровень, Екатеринбург
11 декабря 2019, 11:35
— В Java есть сокращённая запись работы с итераторами. По аналогии с while, в for был добавлен еще один специальный оператор «for each» — «для каждого». Обозначается тоже ключевым словом for. — Оператор for each используется только при работе с коллекциями и контейнерами. В нем неявно используется итератор, но мы видим уже полученный элемент. у нас если у for неявно используется итератор - почему нельзя удалять/добавлять элемент? Или это такой мини-итератор только чтобы пройтись по всем элементам коллекции, даже если у них нет номера (Set и Map)
Константин18 уровень, Москва
13 декабря 2019, 11:19
в «for each»так полагаю, что итератор используется чтобы только пройтись по элементам коллекции используя метод next().
16 декабря 2019, 11:47
все верно, через форич добавлять и изменять нельзя, только считывать.
Евгений16 уровень, Минск
2 декабря 2019, 18:33
После идеи код печатать в окошке сайта - ну вообще не прикольно)
Oleja8 уровень, Минск
5 декабря 2019, 12:16
Хорошо, когда комп нормально идею тянет)
Евгений16 уровень, Минск
5 декабря 2019, 12:43
Правда? Да у меня не то что бы ракета. Ноут на i5-5200U, при чем идею запускаю в виртуальной машине, которой и вовсе дал одно ядро на 2 потока. Компилит троху медленно, секунд 4-7 бывает надо подождать, но работать вполне можно.
Игорь Малый14 уровень, Николаев
21 ноября 2019, 21:47
В первой таблице, где примеры Map идут (оранжевым) в последнем столбце перед словами "Карта/Словарь" отсутствует пробел. Тогда как перед словом Set в первом столбце пробел присутствует (перед Map и List – отсутствует).
Игорь8 уровень, Москва
четверг, 09:27
Клоун)
Игорь Малый14 уровень, Николаев
четверг, 19:32
а я Игорь, очень приятно)
OldFreddy13 уровень, Ростов-на-Дону
18 ноября 2019, 21:34
"— Оператор for each используется только при работе с коллекциями и контейнерами. В нем неявно используется итератор, но мы видим уже полученный элемент." Разве это так? Я же могу с помощью for each пройтись по массиву?
Гульнара20 уровень, Ульяновск
21 ноября 2019, 09:37
а что тебе мешает это сделать? конечно.
Oleg Khlebnikov9 уровень, Усинск
30 ноября 2019, 23:20
Gulnara, автор комментария указал, что оператор for each может использоваться не только при работе с коллекциями и контейнерами, как указано в лекции.
Гульнара20 уровень, Ульяновск
1 декабря 2019, 08:41
объект массива в данном случае и является "контейнером", который указан в лекции.
progr8 уровень
10 ноября 2019, 01:50
коллекции и контейнеры, чем они отличаются?
Алексей9 уровень, Саранск
9 ноября 2019, 13:16
Кто знает, что такое Entry в Map.Entry ? И почему мы можем создать итератор только написав map.entrySet().iterator, а написать map.iterator , как в случае Set или List,мы не можем?
Dwarf10 уровень, Москва
11 ноября 2019, 10:08
(из статьи https://javarush.ru/groups/posts/763-9-glavnihkh-voprosov-o-map-v-java): В Java, каждая пара хранится в поле Map называемом Map.Entry. Map.entrySet() возвращает набор ключ-значений.
Дмитрий25 уровень, Санкт-Петербург
4 ноября 2019, 18:53
SortedSet - нет такого класса/реализации, это интерфейс. А реализует его как раз TreeSet, что и является отсортированным множеством. Из реализаций Set есть еще EnumSet и LinkedHashSet
Дмитрий25 уровень, Санкт-Петербург
4 ноября 2019, 18:59
C SortedMap и TreeMap аналогично