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

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

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

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

Комментарии (170)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Oleg Makievsky8 уровень, Минск
суббота, 12:56
С самых первых версий Java классы Vector и Hashtable предоставляли потокобезопасные реализации динамического массива и хеш-таблицы. Теперь эти классы считаются устаревшими и заменены классами ArrayList и HashMap. Но эти последние классы не являются потокобезопасными, хотя в библиотеке коллекций предусмотрен другой механизм для обеспечения безопасности потоков исполнения. Программирующим на Java со стажем, скорее всего, уже приходилось пользоваться классом Vector всякий раз, когда возникала потребность в динамическом массиве. Почему же вместо класса Vector для подобных целей следует применять класс ArrayList? По одной простой причине: все методы из класса Vector синхронизированы. К объекту типа Vector можно безопасно обращаться одновременно из двух потоков исполнения. Но если обращаться к такому объекту только из одного потока исполнения, что случается намного чаще, то в прикладном коде впустую тратится время на синхронизацию. В отличие от этого, методы из класса ArrayList не синхронизированы. Поэтому рекомендуется пользоваться классом ArrayList вместо класса vector, если только нет особой необходимости в синхронизации. Традиционный класс Hashtable служит той же цели, что и класс HashMap, и по существу имеет тот же интерфейс. Как и методы класса Vector, методы класса Hashtabl синхронизированы. Если же не нужна синхронизация или совместимость с унаследованным кодом, то вместо него следует использовать класс HashMap. А если требуется параллельный доступ к коллекции, то рекомендуется воспользоваться классом ConcurrentHashMap,
Oleg Makievsky8 уровень, Минск
15 октября, 18:36
Что насчет ListIterator? У него больше методов
Gulnara Shaikhutdinova12 уровень, Ульяновск
среда, 11:18
ListIterator может использоваться только для перемещения по List. Мы не можем получить объект ListIterator из того же интерфейса Set. А из преимуществ, действительно, он может перемещаться в обоих направлениях и имеет больше методов.
Миша Небоярски8 уровень, Питер
7 октября, 12:18
Вопрос такой. Вот тут в качестве примера приводят создание листа List<String> list = new ArrayList<String>(); - я так понимаю, так можно, потому что arraylist наследуется от list. Значит ли это, что я, в принципе, могу инициализировать кота командой Animal vaska = new Cat("Васька"), при условии что Cat наследуется от Animal, а в классе Cat объявлен соответствующий конструктор?
Игорь19 уровень, Санкт-Петербург
7 октября, 12:58
Да, можешь. Именно так работает полиморфизм.
Graf Vorontsov14 уровень, Черкассы
4 октября, 10:44
ВНИМАНИЕ НЕДОЧЁТ!! Тут написано что — На самом деле все довольно просто. Сначала мы получаем у коллекции специальный объект-iterator. У него есть всего два метода 1. Метод next() возвращает очередной элемент коллекции. 2. Метод hasNext() проверяет, есть ли еще элементы, которые не возвращал next(). Но на самом деле этих методов три. Еще есть метод remove(). Для удаления элементов из списка. Про что уже описывалось раньше в лекциях. Не понятно, почему вы не указали про это. Прошу поправить, чтобы не вводить в заблуждение.
Иван Борзов8 уровень, Тула
четверг, 15:49
В доке по Java этот метод указан: "default void remove() Removes from the underlying collection the last element returned by this iterator (optional operation)" Видимо, поддерживается не для любой коллекции, раз "optional operator"?
Stas10 уровень, Grodno
19 сентября, 06:27
Если выполнил все задания со следующей лекции,подглядывая сюда ( только по map ) и не особо вникал в iterator ,а использовал foreach (который использовал и ранее) Значит ли это,что спустя некоторое количество времени эти пробелы дадут с такой силой по голове,что я заплачу,вспомнив это сообщение ?
Saiman8325 уровень, Пермь
11 сентября, 18:42
mar10 уровень
31 августа, 18:19
вот что-то меня запутали, караул... я так понимаю у нас есть класс ArrayList он же дженерик и он объявляется , к примеру, ArrayList<String> list = new ArrayList<String>(), а есть интерфейс, который объявляется List<String> list = new ArrayList<String>() и тут у меня затык, получается что интерфейс включает класс ArrayList, но тогда вопрос почему мы в предыдущих лекциях сразу не использовали интерфейс, а использовали переменную типа ArrayList ?
Александр13 уровень, Минск
4 сентября, 18:58
Попытаюсь ответить на Ваш вопрос. 1. Для начало сразу разберемся с дженериками (или в русскоязычной литературе обобщения). Дженерик - это параметризованные типы, все точка. Это все то что мы до этого указывали в угловых скобках при решении задач с ArrayList (<String>). Дженерики применяются не только в коллекциях, это отдельная серьезная тема. Соответственно ArrayList не является дженериком. 2. Начинать с ArrayList т.к это логическое продолжение массивов - динамические массивы. Это проще для понимания чем сразу загрузить информацией смотри пункт 3. 3. List - это интерфейс, а реализуют этот интерфейс не только класс ArrayList, но и LinkedList, а еще AbstractList, к слову ArrayList расширяет класс AbstractList. Помимо этого List сам расширяет интерфейс Collection. Просто во всем этом после обычного массива можно было совсем запутаться, да и это отдельная глава для такого объема. Коллекции это еще различные классы Set, Map, Tree с реализацией соответствующих интерфейсов. Это слишком много чтобы уместить в одну главу с массивами, а тем более понять сразу, поэтому информацию вводят дозировано.
Raccoon1439 уровень, Москва
28 августа, 19:25
Окей, сокращенная запись - это здорово! Есть ли какие-то примеры, в которых нужно явно создавать и использовать итераторы?
Иван Ганжа10 уровень, Москва
25 сентября, 19:32
Было же это. Нужно если хочешь удалить элемент при переборе. У итератора есть еще один метод remove();
Сергуня23 уровень, Абакан
23 августа, 06:43
Опечатка. Перед while не хватает одного пробела в примере "Вывод на экран элементов Map"
IIIJI9IIa16 уровень, Москва
13 августа, 09:50
Ребят объясните плиз, зачем мы используем эти коллекции? аррейлиста для этого не хватает? в чем смысл
DeadDenne15 уровень, Минск
18 августа, 07:50
Каждая коллекция хранит что-либо по своему принципу. К примеру "Карты" могут хранить объект, который вы находите используя ключ (Вам не нужно хранить в голове, где находится нужный объект (в какой ячейке). Вы просто пишете свой ключ . Самый простой пример: когда Вы сдаёте в магазине сумку в камеру хранения (на вашем ключе есть номер камеры). Точно так же происходит и с ключами в Map Или сортированные списки. Они сортируются по умолчанию. Некоторые коллекции не содержат в себе повторений.