Рубрики

HashMap в Java с примерами

HashMap является частью коллекции Java начиная с Java 1.2. Он обеспечивает базовую реализацию интерфейса Map Java. Хранит данные в парах (ключ, значение). Чтобы получить доступ к значению, нужно знать его ключ. HashMap известен как HashMap, потому что он использует технику, называемую Hashing. Хеширование — это метод преобразования большой строки в маленькую строку, представляющую одну и ту же строку. Более короткое значение помогает в индексации и ускоряет поиск. HashSet также использует HashMap для внутреннего использования. Он внутренне использует список ссылок для хранения пар ключ-значение, которые подробно описаны в HashSet и в других статьях.
Несколько важных функций HashMap:

  • HashMap является частью пакета java.util.
  • HashMap расширяет абстрактный класс AbstractMap, который также обеспечивает неполную реализацию интерфейса Map.
  • Он также реализует интерфейс Cloneable и Serializable . K и V в вышеприведенном определении представляют Ключ и Значение соответственно.
  • HashMap не позволяет дублировать ключи, но позволяет дублировать значения. Это означает, что один ключ не может содержать более 1 значения, но более 1 ключа может содержать одно значение.
  • HashMap допускает также нулевой ключ, но только один раз и несколько нулевых значений.
  • Этот класс не дает никаких гарантий относительно порядка карты; в частности, это не гарантирует, что порядок останется постоянным с течением времени. Это примерно похоже на HashTable, но не синхронизировано.

Внутренняя структура HashMap

Внутренне HashMap содержит массив Node, а узел представлен в виде класса, который содержит 4 поля:

  1. int hash
  2. К ключ
  3. Значение V
  4. Узел следующий

Видно, что узел содержит ссылку на свой собственный объект. Так что это связанный список.
HashMap:

Узел:

Производительность HashMap

Производительность HashMap зависит от 2 параметров:

  1. Начальная емкость
  2. Коэффициент нагрузки

Как уже говорилось, Capacity — это просто количество сегментов, тогда как Initial Capacity — это емкость экземпляра HashMap при его создании. Коэффициент загрузки — это показатель, который при повторной перемотке должен быть выполнен. Перефразировка — это процесс увеличения емкости. В HashMap емкость умножается на 2. Коэффициент загрузки также является мерой того, какую долю HashMap можно заполнить перед повторной перепрошивкой. Когда количество записей в HashMap увеличивает произведение текущей емкости и коэффициента загрузки, увеличивается емкость, выполняется перефразировка. Если первоначальная емкость сохраняется выше, то перефразировка никогда не будет выполнена. Но поддерживая его выше, это увеличивает временную сложность итерации. Поэтому его следует выбирать очень умно, чтобы повысить производительность. Ожидаемое количество значений должно быть принято во внимание, чтобы установить начальную емкость. Наиболее предпочтительное значение коэффициента нагрузки составляет 0,75, что обеспечивает значительную экономию времени и пространства. Значение коэффициента нагрузки варьируется от 0 до 1.

Синхронизированный HashMap

Как сказано, HashMap не синхронизирован, то есть несколько потоков могут получить к нему доступ одновременно. Если несколько потоков обращаются к этому классу одновременно и по крайней мере один поток управляет им структурно, необходимо сделать его внешне синхронизированным. Это делается путем синхронизации некоторого объекта, который инкапсулирует карту. Если такого объекта не существует, его можно обернуть вокруг Collections.synchronizedMap (), чтобы синхронизировать HashMap и избежать случайного несинхронизированного доступа. Как в следующем примере:

Map m = Collections.synchronizedMap(new HashMap(...));

Теперь карта m синхронизирована.

Итераторы этого класса работают быстро, если какая-либо модификация структуры выполняется после создания итератора, любым способом, кроме метода удаления итератора. В случае сбоя итератора он выдаст исключение ConcurrentModificationException.

Конструкторы в HashMap

HashMap предоставляет 4 конструктора, и модификатор доступа каждого является общедоступным:

  1. HashMap (): это конструктор по умолчанию, который создает экземпляр HashMap с начальной емкостью 16 и коэффициентом загрузки 0,75.
  2. HashMap (int начальная емкость): создается экземпляр HashMap с указанной начальной емкостью и коэффициентом загрузки 0,75.
  3. HashMap (int начальная емкость, float loadFactor): создает экземпляр HashMap с указанной начальной емкостью и указанным коэффициентом загрузки.
  4. HashMap (Карта карты): создает экземпляр HashMap с теми же отображениями, что и указанная карта.

Пример:

// Java-программа для иллюстрации
// Java.util.HashMap

  

import java.util.HashMap;

import java.util.Map;

  

public class GFG {

    public static void main(String[] args)

    {

  

        HashMap<String, Integer> map

            = new HashMap<>();

  

        print(map);

        map.put("vishal", 10);

        map.put("sachin", 30);

        map.put("vaibhav", 20);

  

        System.out.println("Size of map is:- "

                           + map.size());

  

        print(map);

        if (map.containsKey("vishal")) {

            Integer a = map.get("vishal");

            System.out.println("value for key"

                               + " \"vishal\" is:- "

                               + a);

        }

  

        map.clear();

        print(map);

    }

  

    public static void print(Map<String, Integer> map)

    {

        if (map.isEmpty()) {

            System.out.println("map is empty");

        }

  

        else {

            System.out.println(map);

        }

    }

}

Выход:

map is empty
Size of map is:- 3
{vaibhav=20, vishal=10, sachin=30}
value for key "vishal" is:- 10
map is empty

Временная сложность HashMap

HashMap обеспечивает постоянную временную сложность для базовых операций, получает и помещает, если хеш-функция написана правильно и правильно распределяет элементы между сегментами. Итерация по HashMap зависит от емкости HashMap и количества пар ключ-значение. По сути, оно прямо пропорционально емкости + размеру. Емкость — это количество сегментов в HashMap. Поэтому изначально не рекомендуется хранить большое количество сегментов в HashMap.

Методы в HashMap

  1. void clear (): Используется для удаления всех отображений с карты.
  2. boolean containsKey (Object key): используется для возврата True, если для указанного ключа отображение присутствует на карте.
  3. boolean containsValue (Object value): используется для возврата true, если один или несколько ключей сопоставлены с указанным значением.
  4. Object clone (): используется для возврата поверхностной копии упомянутой хэш-карты.
  5. boolean isEmpty (): Используется, чтобы проверить, является ли карта пустой или нет. Возвращает true, если карта пуста.
  6. Set entrySet (): используется для возврата установленного представления хэш-карты.
  7. Object get (Object key): используется для извлечения или извлечения значения, сопоставленного определенному ключу.
  8. Set keySet (): используется для возврата установленного вида ключей.
  9. int size (): используется для возврата размера карты.
  10. Object put (Object key, Object value): используется для вставки определенного отображения пары ключ-значение в карту.
  11. putAll (Карта M): используется для копирования всех элементов с одной карты на другую.
  12. Удаление объекта (ключ объекта): используется для удаления значений любого конкретного ключа на карте.
  13. Collection values (): используется для возврата представления Collection значений в HashMap.
  14. compute (клавиша K, BiFunction <K, V> remappingFunction) : этот метод пытается вычислить сопоставление для указанного ключа и его текущего сопоставленного значения (или ноль, если текущего сопоставления нет).
  15. computeIfAbsent (ключ K, функция <K> mappingFunction) : этот метод, если указанный ключ еще не связан со значением (или сопоставлен со значением NULL), пытается вычислить его значение с использованием данной функции сопоставления и вводит его в эту карту, если только значение NULL.
  16. computeIfPresent (ключ K, BiFunction <K, V> remappingFunction): этот метод, если значение для указанного ключа присутствует и не равно нулю, пытается вычислить новое сопоставление, учитывая ключ и его текущее сопоставленное значение.
  17. forEach (действие BiConsumer <K, V>): этот метод выполняет заданное действие для каждой записи в этой карте, пока все записи не будут обработаны или действие не вызовет исключение.
  18. getOrDefault (Object key, V defaultValue): этот метод возвращает значение, которому сопоставлен указанный ключ, или defaultValue, если эта карта не содержит сопоставления для ключа.
  19. слияние (ключ K, значение V, BiFunction <K, V> remappingFunction): этот метод, если указанный ключ еще не связан со значением или связан с нулевым значением, связывает его с заданным ненулевым значением.
  20. putIfAbsent (ключ K, значение V): этот метод, если указанный ключ еще не связан со значением (или сопоставлен со значением NULL), связывает его с данным значением и возвращает значение NULL, иначе возвращается текущее значение.
  21. replace (ключ K, значение V): этот метод заменяет запись для указанного ключа, только если она в настоящий момент сопоставлена с некоторым значением.
  22. replace (ключ K, V oldValue, V newValue): этот метод заменяет запись для указанного ключа, только если в данный момент отображается на указанное значение.
  23. replaceAll (функция BiFunction <K, V>): этот метод заменяет значение каждой записи на результат вызова данной функции для этой записи, пока все записи не будут обработаны или функция не выдаст исключение.

Статьи по Теме:

Последние статьи о Java HashMap!

Эта статья предоставлена Вишалом Гаргом . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

HashMap в Java с примерами

0.00 (0%) 0 votes