Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Мапы Java: Коллекции

Map — это интерфейс, который предоставляет методы для работы со структурой данных, которая содержит в себе набор пар “ключ-значение”. Самая используемая реализация этого интерфейса — Hashmap

Предположим, нам нужно хранить список автомобилей с их номерами. Можно попробовать сделать это при помощи списка List

// Метод возвращает заполненный список автомобилей
// в заданном формате: [госномер номер]:[марка автомобиля]

private static List<String> getCarsList() {
    // создаём список строк
    List<String> cars = new ArrayList<>();
    // добавляем элементы в список
    cars.add("O023TO198:Volvo");
    cars.add("O025XE777:Nissan");
    cars.add("O001OO777:BMW");
    return cars;
}

// Получили список строк
var cars = getCarsList();
// => [O023TO198:Volvo, O025XE777:Nissan, O001OO777:BMW]

// Проблематика: как теперь по номеру машины найти модель автомобиля
// Можно сделать это, полностью перебрав список

// Метод ищет автомобиль по его номеру в списке автомобилей
private static String getModelByPlateNumber(String plateNumber) {
    // перебираем элементы списка
    for (String car : getCarsList()) {
        // метод split помещает элементы строки, разделенные строкой
        // (в нашемслучае - : ) в строчный массив
        String[] modelAndPlateNumber = car.split(":");
        // проверяем, номер элемента списка совпадает
        // с переданным значением в качестве аргумента
        if (modelAndPlateNumber[0].equals(plateNumber)) {
            // возвращаем модель авто и прекращаем выполнение метода
            return modelAndPlateNumber[1];
        }
    }
    return null;
}

Вместо этого можно использовать одну из реализаций – HashMap, которая позволяет хранить пары ключей и значений.

// Создаём новый экземпляр
Map<String, String> cars = new HashMap<>();

// метод put() добавляет в словарь пару ключ-значение
cars.put("O023TO198", "Volvo");
cars.put("O025XE777", "Nissan");
cars.put("O001OO777", "BMW");

System.out.println(cars);
// => {O025XE777=Nissan, O001OO777=BMW, O023TO198=Volvo}

// Теперь определить марку автомобиля по его номеру значительно проще
// метод get() возвращает значение по ключу
String modelFromMap = cars.get("O023TO198");
System.out.println(modelFromMap); // "Volvo"
System.out.println( cars.get("O025XE700")); // null

// key может быть null
cars.put(null, "Lada");
System.out.println(cars);
// => {null=Lada, O025XE777=Nissan, O001OO777=BMW, O023TO198=Volvo}

// замена одного значения на другое
cars.put("O025XE777", "Audi");
System.out.println(cars);
// => {null=Lada, O025XE777=Audi, O001OO777=BMW, O023TO198=Volvo}

Базовые операции с Map

Map<String, Integer> people = new HashMap<>();

// Добавление элемента в словарь
people.put("Max", 2006);
people.put("Petr", 1998);
people.put("Ivan", 1981);

System.out.println(people);
// => {Max=2006, Petr=1998, Ivan=1981}
System.out.println("Размер Map: " + people.size());
// => Размер Map: 3

Map<String, Integer> additionalPeopleMap = new HashMap<>();
additionalPeopleMap.put("Vladimir", 1978);
additionalPeopleMap.put("Robert", 2010);
additionalPeopleMap.put("Ibrahim", 2011);

// Метод putAll() копирует все значения из переданного словаря с текущий
people.putAll(additionalPeopleMap);

System.out.println(people);
// => {Ibrahim=2011, Max=2006, Robert=2010, Petr=1998, Ivan=1981, Vladimir=1978}

// Проверка на наличие в словаре ключа
System.out.println(people.containsKey("Max")); // => true

//  и значения
System.out.println(people.containsValue(2021)); // => false

// Удаление элемента из словаря
people.remove("Robert");
System.out.println(people);
// => {Ibrahim=2011, Max=2006, Petr=1998, Ivan=1981, Vladimir=1978}

// Удаление всех элементов
people.clear();
System.out.println(people); // => {}

Map.Entry

Map.Entry – это интерфейс, который позволяет нам получить доступ к записям в словаре

Map<String, String> students = new HashMap<>();
students.put("Max", "Maximov");
students.put("Petr", "Petrov");
students.put("Ivan", "Ivanov");

System.out.println(students.entrySet());
// => [Max=Maximov, Petr=Petrov, Ivan=Ivanov]

// 1 способ получения значения по ключу
// for (String s: students.keySet()) {
//     String lastname = students.get(s);
// }

// 2 cпособ получения значения по ключу - более употребим
for (Map.Entry<String, String> student: students.entrySet()) {
    System.out.println(
        "Student name is = " + student.getKey() + " and student lastname is = " + student.getValue()
    );
}

Вывод на экран:

Student name is = Max and student lastname is = Maximov
Student name is = Petr and student lastname is = Petrov
Student name is = Ivan and student lastname is = Ivanov

Домашнее задание

Загрузите домашнее задание с помощью команды:

hexlet program download java maps

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.

Об обучении на Хекслете

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
900
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 130 курсов, 2000+ часов теории
  • 900 практических заданий в браузере
  • 360 000 студентов
Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Java-разработчик
Профессия
Разработка приложений на языке Java
1 июня 10 месяцев

Используйте Хекслет по максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»