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

Открыта
Список всех коллекций - 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);
    }
}
10
Задача
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);
    }
}

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

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

Комментарии (148)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Сергей Novichok9 уровень, Нижний Новгород
27 июня, 18:37
И все-таки, с точки зрения реализации, TreeSet это что-то типа двоичного дерева? А LinkedList - связанный список?
Андрей41 уровень
30 июня, 08:48
Да. Трисет внутри имеет TreeMap, она основана на черно-красных деревьях. LinkedList - двусвязный список.
Василий18 уровень, Санкт-Петербург
25 июня, 16:51
Печатать мапы лучше всего через лямбды:
map.forEach((k,v) -> System.out.println(v));
Mikhail9 уровень, Москва
26 июня, 10:00
что такое лямбды. этого не было.
Айдар8 уровень, Казань
30 июня, 13:21
не только мапы, любой список можно печатать через лямбда-выражения. даже массивы:
Arrays.stream(array).forEach(System.out::println);
Денис9 уровень, Москва
2 июня, 19:01
Что-то непонятно - сокращенная версия кода справа - это тоже работа с экземпляром итератора только неявное его использование? Это вроде бы цикл фор-ич, и почему вдруг это называется "покажу тебе длинную и сокращенную работу с итератором". Очень мало, конечно, теоретического материала.
Mikhail9 уровень, Москва
26 июня, 10:01
достаточно. всё чётко, понятно, и по делу. хочется загрузить себе мозги по полной - читай документацию.
Денис9 уровень, Москва
27 июня, 14:13
спасибо, ваш ответ очень полезен и оригинален:)
Alexander Taluevsky9 уровень, Минск
10 июля, 15:12
я так думаю что фор-ич УЖЕ содержит в себе итератор (просто он, возможно, описан в другом месте)...то есть пользуясь фор-ич - ты пользуешься будто бы готовым "методом", а если создаешь итератор итд - то это уже вручную делаешь.. Вот потому и назвали фор-ич сокращённым способом, а вручную - длинным
Юся Каргина9 уровень, Санкт-Петербург
27 мая, 17:16
SortedSet - это не реализация, как и SortedMap.
GigaMax12 уровень
16 мая, 17:42
повторяем)
Олег Анфиногенов13 уровень, Москва
26 апреля, 07:16
Мне из множества источников про итераторы больше всего помог разобраться данный материал ( в целом про коллекции довольно хорошо и структурировано материал изложен) https://metanit.com/java/tutorial/5.10.php
Евгений11 уровень, Харьков
9 апреля, 08:43
Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator(); о господи, ты что такое?)) последний пример чет ваще непонятен, несмотря на возгласы Амиго про шикарность
Андрей Кутиль19 уровень, Киев
11 апреля, 13:03
Запомни эту чудозапись) В следующих задачах итератор чуть не в каждой задачке)
Олег Анфиногенов13 уровень, Москва
26 апреля, 09:42
Реализация интерфейса Map также позволяет получить наборы как ключей, так и значений. А метод entrySet() возвращает набор всех элементов в виде объектов Map.Entry<K, V>. https://metanit.com/java/tutorial/5.8.php HashMap имеет встроенные итераторы, такие, что вы можете получить список всех ключей keySet(), всех значений values() или же все пары ключ/значение entrySet(). Ниже представлены некоторые варианты для перебора элементов: // 1. for (Map.Entry<String, String> entry: hashmap.entrySet()) System.out.println(entry.getKey() + " = " + entry.getValue()); // 2. for (String key: hashmap.keySet()) System.out.println(hashmap.get(key)); // 3. Iterator<Map.Entry<String, String>> itr = hashmap.entrySet().iterator(); while (itr.hasNext()) System.out.println(itr.next()); https://habr.com/ru/post/128017/
Михаил12 уровень, Минск
5 апреля, 11:52
мне кажется в статье недочет, SortedSet - это не совсем реализация, нельзя например написать так
SortedSet<String> sortedSet = new SortedSet();
, но можно
SortedSet<String> sortedSet = new TreeSet();
Так как TreeSet является уже реализацией SortedSet, конечно SortedSet наследуется от Set, но эта табличка вводит в заблуждение
Игорь Стогнушенко8 уровень, Днепр
5 апреля, 00:15
У многих до сих пор возникают вопросы касаемо "улучшенного" цикла foreach, вот выдержка из книги "Head First Java, 2nd Edition" (5 глава), мне это очень помогло, надеюсь поможет кому-то еще. Всем удачи)
Iurii Brazhko 16 уровень
20 мая, 00:54
Спасибо! Только сейчас до конца разобрался.
Вадим Роготнев8 уровень, Екатеринбург
7 июля, 05:02
интересны стрелки, они во всей книге "так" начинают свой путь?
Алексей9 уровень, Санкт-Петербург
25 марта, 17:18
Понимание HashMap пришло совершенно случайно. Не помню, в каком из источников читал, Коллекцию Map следует воспринимать как картотеку. Если совсем условно, в роли ключа(Key) выступает номер карточки, А значением(Value) будет являться содержимое карточки. Так же о понимании сокращенной работы с итератором. Не понимал, как это работает.
for (String text : list)
    {
        System.out.println(text);
    }
Всё стало ясно, после чтения книги Г.Шилдта "Java. Руководство для начинающих", Глава 5. существует цикл типа for-each для перебора всех элементов массива. Например код
int nums[] = {1,2,3,4,5,6,7,8,9,10};
int sum = 0;
for (int i =0; i < 10; i++) sum +=nums[i];
равносилен коду
int nums[] = {1,2,3,4,5,6,7,8,9,10};
int sum = 0;
for (int x: nums) sum += x;
На каждом шаге x автоматически принимает значение, равное очередному элементу массива nums. По аналогии делается перебор коллекции. Например, чтобы вывести коллекцию, в которой тип ключа String, можно использовать такой цикл for-each:
for (String str : map.keySet()){
            System.out.println(str);
        }
Поправьте меня, если я не прав
АртемGeek25 уровень, Москва
6 апреля, 06:18
Все правильно, только в последнем примере:
for (String str : map.keySet()){
            System.out.println(str);
        }
мы выводим не коллекцию, а только значение ключей. Т.к. по записи keySet() - мы получаем множество именно ключей.