Зарегистрируйтесь для доступа к 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

Дополнительные материалы

  1. Статья "Структуры данных в картинках"

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»