English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Основной учебник Java

Java Управление потоком

Java Массивы

Java Ориентированность на объекты (I)

Java Ориентированность на объекты (II)

Java Ориентированность на объекты (III)

Обработка исключений Java

Java Список (List)

Java Queue (очередь)

Java Map-сборники

Java Set-сборники

Java Ввод/Вывод (I/O)

Java Reader/Writer

Другие темы Java

HashMap Java

В этом руководстве мы будем изучать примеры Java HashMap и его методы.

Класс HashMap в фреймворке Java Collections предоставляетИнтерфейс Mapреализации хэш-таблицы.

Создание HashMap

Для создания HashMap нам нужно сначала импортировать пакет java.util.HashMap. После импорта пакета мы можем использовать Java для создания хэш-таблицы.

// Создание HashMap с емкостью 8 и коэффициентом загрузки 0.6
HashMap<Key, Value> numbers = new HashMap<>(8, 0.6f);

В приведенном выше коде мы создали HashMap с именем numbers.

Здесь,

  • Key - уникальный идентификатор, используемый для связи каждого элемента (значения) в map

  • Value - элемент, связанный с ключом в map

Обратите внимание на часть new HashMap<>(8, 0.6). Здесь, первый параметр - это capacity, а второй параметр - это loadFactor.

  • capacity - Объем HashMap составляет 8. Это означает, что он может хранить 8 элементов.

  • loadFactor - Плотность нагрузки hashmap составляет 0.6. Это означает, что每当 хэш-таблица заполнена на 60%, элементы будут перемещены в новый хэш-таблицу, размер которой в два раза большеoriginal хэш-таблицы.

Default容量 и нагрузочный фактор

Создание хэш-таблицы без определения ее объема и нагрузки разрешено. Например:

// HashMap с_default容量 и нагрузочным фактором
HashMap<Key, Value> numbers1 = new HashMap<>();

По умолчанию

  • Объем HashMap будет 16

  • Плотность нагрузки будет 0.75

Создание HashMap из другого map

Этот метод показывает, как создать HashMap, содержащий все элементы другого map

import java.util.HashMap;
class Main {
    public static void main(String[] args) {
        // Создание hashmap с даже числами
        HashMap<String, Integer> evenNumbers = new HashMap<>();
        evenNumbers.put("Two", 2);
        evenNumbers.put("Four", 4);
        System.out.println("HashMap1: " + evenNumbers);
        // Создание HashMap из другого hashmap
        HashMap<String, Integer> numbers = new HashMap<>(evenNumbers);
        numbers.put("Three", 3);
        System.out.println("HashMap2: " + numbers);
    }
}

Результат вывода

HashMap1: {Four=4, Two=2}
HashMap2: {Two=2, Three=3, Four=4}

Методы HashMap

Этот класс HashMap предоставляет различные методы, которые позволяют нам выполнять различные операции с map

Вставка элементов в HashMap

  • put() - Вставляет указанное значение в map

  • putAll() - Вставляет все элементы из указанного map в этот map

  • putIfAbsent() - Если в map нет указанного ключа, то вставляет указанное значение в map

Например:

import java.util.HashMap;
class Main {
    public static void main(String[] args) {
        // Создание HashMap с даже числами
        HashMap<String, Integer> evenNumbers = new HashMap<>();
        // использование put()
        evenNumbers.put("Two", 2);
        evenNumbers.put("Four", 4);
        // использование putIfAbsent()
        evenNumbers.putIfAbsent("Six", 6);
        System.out.println("HashMap четных чисел: " + evenNumbers);
        //Создание HashMap чисел
        HashMap<String, Integer> numbers = new HashMap<>();
        numbers.put("One", 1);
        // использование putAll()
        numbers.putAll(evenNumbers);
        System.out.println("HashMap numbers: " + numbers);
    }
}

Результат вывода

HashMap четных чисел: {Six=6, Four=4, Two=2}
HashMap numbers: {Six=6, One=1, Four=4, Two=2}

Доступ к элементам HashMap

1. Использование entrySet(), keySet() и values()

  • entrySet() - возвращает множество всех ключ/значение маппингов карты

  • keySet() - возвращает множество всех ключей карты

  • values() - возвращает множество всех значений карты

Например:

import java.util.HashMap;
class Main {
    public static void main(String[] args) {
        HashMap<String, Integer> numbers = new HashMap<>();
        numbers.put("One", 1);
        numbers.put("Two", 2);
        numbers.put("Three", 3);
        System.out.println("HashMap: " + numbers);
        // использование entrySet()
        System.out.println("Маппинг ключ/значение: " + numbers.entrySet());
        // использование keySet()
        System.out.println("Ключи: " + numbers.keySet());
        // использование values()
        System.out.println("Значения: " + numbers.values());
    }
}

Результат вывода

HashMap: {One=1, Two=2, Three=3}
Маппинг ключ/значение: [One=1, Two=2, Three=3]
Ключи: [One, Two, Three]
Значения: [1, 2, 3]

2. Использование get() и getOrDefault()

  • get() - возвращает значение, связанное с указанным ключом. Если ключ не найден, возвращает null.

  • getOrDefault() - возвращает значение, связанное с указанным ключом. Если ключ не найден, возвращает заданное значение по умолчанию.

Например:

import java.util.HashMap;
class Main {
    public static void main(String[] args) {
        HashMap<String, Integer> numbers = new HashMap<>();
        numbers.put("One", 1);
        numbers.put("Two", 2);
        numbers.put("Three", 3);
        System.out.println("HashMap: " + numbers);
        // использование get()
        int value1 = numbers.get("Three");
        System.out.println("Вернуть цифру: " + value1);
        // Использование getOrDefault()
        int value2 = numbers.getOrDefault("Five", 5);
        System.out.println("Вернуть цифру: " + value2);
    }
}

Результат вывода

HashMap: {One=1, Two=2, Three=3}
Вернуть цифру: 3
Вернуть цифру: 5

Удаление элементов

  • remove(key) - Возвращает и удаляет элемент, связанный с ключом key

  • remove(key, value) - Удаляет элемент только если ключ key связан с значением value и возвращает булево значение

Например:

import java.util.HashMap;
class Main {
    public static void main(String[] args) {
        HashMap<String, Integer> numbers = new HashMap<>();
        numbers.put("One", 1);
        numbers.put("Two", 2);
        numbers.put("Three", 3);
        System.out.println("HashMap: " + numbers);
        // Метод удаления с одним параметром
        int value = numbers.remove("Two");
        System.out.println("Удалить значение: " + value);
        // Метод удаления с двумя параметрами
        boolean result = numbers.remove("Three", 3);
        System.out.println("Удален ли элемент 3? " + result);
        System.out.println("Обновленный HashMap: " + numbers);
    }
}

Результат вывода

HashMap: {One=1, Two=2, Three=3}
Удалить значение: 2
Удален ли элемент 3? True
Обновленный HashMap: {One=1}

Замена элементов

  • replace(key, value) - Заменяет значение ключа key на value

  • replace(key, old, new) - Заменяет old значением new только если old уже связан с ключом key

  • replaceAll(function) - Заменяет каждый значений карты результатом указанной функции

Например:

import java.util.HashMap;
class Main {
    public static void main(String[] args) {
        HashMap<String, Integer> numbers = new HashMap<>();
        numbers.put("First", 1);
        numbers.put("Second", 2);
        numbers.put("Third", 3);
        System.out.println("Оригинальный HashMap: " + numbers);
        // Использование replace()
        numbers.replace("Second", 22);
        numbers.replace("Third", 3, 33);
        System.out.println("Использование replace для замены значений HashMap: " + numbers);
        // Использование replaceAll()
        numbers.replaceAll((key, oldValue) -> oldValue + 2);
        System.out.println("Использование replaceAll для замены значений HashMap: " + numbers);
    }
}

Результат вывода

オリジнальный HashMap: {Second=2, Third=3, First=1}
Использование replace для замены значений HashMap: {Second=22, Third=33, First=1}
Использование replaceAll для замены значений HashMap: {Second=24, Third=35, First=3}

В указанном выше коде обратите внимание на предложение

numbers.replaceAll((key, oldValue) -> oldValue + 2);

В этом случае该方法 посещает все элементы карты. Затем все значения заменяются наlambda-выражениепредоставленное новое значение.

пересчет значений

1. Использование метода compute()

  • compute() - использует指定的 функцию для вычисления нового значения. Затем вычисленное значение ассоциируется с указанным ключом.

  • computeIfAbsent() - если указанный ключ не связан с любым значением, этот метод использует指定的 функцию для вычисления нового значения. Затем новое значение ассоциируется с ключом.

  • computeIfPresent() - если указанный ключ уже связан с любым значением, этот метод использует指定的 функцию для вычисления нового значения. Затем новое значение ассоциируется с ключом.

Например:

import java.util.HashMap;
class Main {
    public static void main(String[] args) {
        HashMap<String, Integer> numbers = new HashMap<>();
        numbers.put("First", 1);
        numbers.put("Second", 2);
        System.out.println("Оригинальный HashMap: " + numbers);
        // Использование compute()
        numbers.compute("First", (key, oldValue) -> oldValue + 2);
        numbers.compute("Second", (key, oldValue) -> oldValue + 1);
        System.out.println("HashMap использует compute(): " + numbers);
        // Использование computeIfAbsent()
        numbers.computeIfAbsent("Three", key -> 5);
        System.out.println("HashMap использует computeIfAbsent(): " + numbers);
        // Использование computeIfPresent()
        numbers.computeIfPresent("Second", (key, oldValue) -> oldValue * 2);
        System.out.println("HashMap использует computeIfPresent(): " + numbers);
    }
}

Результат вывода

Оригинальный HashMap: {Second=2, First=1}
HashMap использует compute(): {Second=3, First=3}
HashMap использует computeIfAbsent(): {Second=3 First=3, Three=5}
HashMap использует computeIfPresent(): {Second=6, First=3, three=5}

В примере выше, мы используем метод compute() для пересчета значения карты.

Здесь мы используемlambda-выражениев качестве параметра метода для пересчета значения.

2. Использование метода merge()

Если указанный ключ еще не связан, то метод merge() свяжет указанное значение с указанным ключом.

Но если указанный ключ уже связан с значением, он объединит новое указанное значение с существующим старым значением. Например

import java.util.HashMap;
class Main {
    public static void main(String[] args) {
        HashMap<String, Integer> numbers = new HashMap<>();
        numbers.put("First", 1);
        numbers.put("Second", 2);
        System.out.println("Оригинальный HashMap: " + numbers);
        //Использование метода merge()
        numbers.merge("First", 4, (oldValue, newValue) -> oldValue + newValue);
        System.out.println("Новый HashMap: " + numbers);
    }
}

Результат вывода

Оригинальный HashMap: {Second=2, First=1}
Новый HashMap: {Second=2, First=5}

В примере выше, метод merge() принимает три параметра:key,newValueи lambda-выражение (для вычисления нового объединенного значения).

Другие методы HashMap

МетодОписание
clear()удалить все элементы из карты
containsKey()проверить, содержит ли карта указанный ключ и вернуть булево значение
containsValue()проверить, содержит ли карта указанное значение и вернуть булево значение
size()возвратить размер map
isEmpty()проверить, пуст ли map и вернуть булево значение

пройти по HashMap

В HashMap, мы можем

  • пройти по нему ключ

  • пройти по нему значение

  • пройти по нему ключ/значение

1. Использование цикла forEach

import java.util.HashMap;
import java.util.Map.Entry;
class Main {
    public static void main(String[] args) {
        //Создание HashMap
        HashMap<String, Integer> numbers = new HashMap<>();
        numbers.put("One", 1);
        numbers.put("Two", 2);
        numbers.put("Three", 3);
        System.out.println("HashMap: " + numbers);
        //Доступ к паре ключ/значение (key/value)
        System.out.print("Проект: ");
        for(Entry<String, Integer> entry: numbers.entrySet()) {
            System.out.print(entry);
            System.out.print(", ");
        }
        //Просмотр ключа
        System.out.print("\nВсе ключи: ");
        for(String key: numbers.keySet()) {
            System.out.print(key);
            System.out.print(", ");
        }
        //Просмотр значения
        System.out.print("\nВсе значения: ");
        for(Integer value: numbers.values()) {
            System.out.print(value);
            System.out.print(", ");
        }
    }
}

Результат вывода

HashMap: {One=1, Two=2, Three=3}
Все записи: One=1, Two=2, Three=3
Все ключи: One, Two, Three,
Все значения: 1, 2, ,3,

В上面的 программе обратите внимание, что мы импортировали пакет java.util.Map.Entry. Здесь Map.Entry является вложенным классом интерфейса Map.

Эта вложенная класс возвращает представление карты (элементы).

2. Использование метода iterator()

Также можно использовать метод iterator() для итерации по HashMap. Для использования этого метода необходимо импортировать пакет java.util.Iterator.

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
class Main {
    public static void main(String[] args) {
        //Создание HashMap
        HashMap<String, Integer> numbers = new HashMap<>();
        numbers.put("One", 1);
        numbers.put("Two", 2);
        numbers.put("Three", 3);
        System.out.println("HashMap: " + numbers);
        //Создание объекта Iterator
        Iterator<Map.Entry<String, Integer>> iterate1 = numbers.entrySet().iterator();
        // Просмотр пары ключ/значение
        System.out.print("Все элементы: ");
        while(iterate1.hasNext()) {
            System.out.print(iterate1.next());
            System.out.print(", ");
        }
        // Просмотр ключа
        Iterator<String> iterate2 = numbers.keySet().iterator();
        System.out.print("\nВсе ключи: ");
        while(iterate2.hasNext()) {
            System.out.print(iterate2.next());
            System.out.print(", ");
        }
        // доступ к value
        Iterator<Integer> iterate3 = numbers.values().iterator();
         System.out.print("\nВсе значения: ");
        while(iterate3.hasNext()) {
            System.out.print(iterate3.next());
            System.out.print(", ");
        }
    }
}

Результат вывода

HashMap: {One=1, Two=2, Three=3}
Все записи: One=1, Two=2, Three=3
Все ключи: One, Two, Three,
Все значения: 1, 2, 3,

В上面的 программе обратите внимание, что мы импортировали пакет java.util.Map.Entry. Здесь Map.Entry - это вложенный класс интерфейса Map.

Эта вложенная класс возвращает представление карты (элементы).