what is hashmap java
Този урок за HashMap на Java обяснява какво е HashMap в Java и как да го използвате. Включва как да декларирате, инициализирате, итерирате, внедрите и отпечатате HashMap:
HashMap в Java е колекция, базирана на Map и се състои от двойки ключ-стойност. HashMap се обозначава с или. Елементът на HashMap може да бъде достъпен с помощта на Key, т.е. трябва да знаем ключа за достъп до елемента HashMap.
HashMap използва техника, наречена „Hashing“. При хеширането по-дълъг низ се преобразува в по-къс низ чрез прилагане на някакъв алгоритъм или „хеш функция“. Низът се преобразува в по-кратък низ, тъй като помага за по-бързо търсене. Използва се и за ефективно индексиране.
=> Посетете тук за ексклузивната серия уроци за обучение по Java.
Какво ще научите:
- HashMap в Java
- Карта на Java срещу HashMap
- Заключение
HashMap в Java
HashMap е подобен на HashTable с тази разлика, че HashMap не е синхронизиран и позволява нулеви стойности за ключ и стойност.
Някои от важните характеристики на HashMap са дадени по-долу:
- HashMap е реализиран в Java в класа “Hashmap”, който е част от пакета java.util.
- Класът HashMap наследява от класа “AbstractMap”, който частично реализира интерфейса Map.
- HashMap също така прилага „клонируеми“ и „сериализуеми“ интерфейси.
- HashMap разрешава дублирани стойности, но не позволява дублиращи се ключове. HashMap също позволява множество нулеви стойности, но нулевият ключ може да бъде само един.
- HashMap е несинхронизиран и също не гарантира реда на елементите.
- Класът Java HashMap има първоначален капацитет 16, а коефициентът на натоварване по подразбиране (първоначален) е 0,75.
Как да декларирам HashMap в Java?
HashMap в Java е част от пакета java.util. Следователно, ако трябва да използваме HashMap в нашия код, първо трябва да импортираме класа на внедряване, използвайки един от следните изрази:
import java.util.*;
ИЛИ
import java.util.HashMap;
Общата декларация за клас HashMap е:
public class HashMap extends AbstractMap implements Map, Cloneable, Serializable
Тук K => тип ключове, присъстващи на картата
V => тип стойности, съпоставени с ключовете в картата
Създайте HashMap
HashMap в Java може да бъде създаден, както следва:
import java.util.HashMap; HashMap cities_map = new HashMap ();
Горното изявление първо включва класа HashMap в Java. След това в следващото изявление ние създаваме HashMap с име ‘cities_map’ с тип ключ като Integer и Стойности като String.
След като HashMap е създаден, трябва да го инициализираме със стойности.
Как да инициализирам хеш карта?
Можем да инициализираме HashMap, използвайки метода put, като поставим някои стойности в картата.
Програмата по-долу показва инициализацията на HashMap в Java.
import java.util.*; class Main{ public static void main(String args()){ //create a HashMap and print HashMap colorsMap=new HashMap(); System.out.println('Initial Map: '+colorsMap); //put some initial values into it using put method colorsMap.put(100,'Red'); colorsMap.put(101,'Green'); colorsMap.put(102,'Blue'); //print the HashMap System.out.println('After adding elements:'); for(Map.Entry m:colorsMap.entrySet()){ System.out.println(m.getKey()+' '+m.getValue()); } } }
Изход:
Първоначална карта: {}
След добавяне на елементи:
100 Мрежа
101 Зелено
102 Синьо
Как HashMap работи вътрешно?
Знаем, че HashMap е колекция от двойки ключ-стойност и използва техника, наречена „Hashing“. Вътрешно, HashMap е масив от възли. HashMap използва масив и LinkedList за съхранение на двойки ключ-стойност.
По-долу е дадена структура на възел на HashMap, който е представен програмно като клас.
Както се вижда от представяне на възел по-горе, възел има структура, подобна на свързан възел със списък. Масив от тези възли се нарича Bucket. Всяка кофа може да няма същия капацитет и може да има и повече от един възел.
Производителността на HashMap се влияе от два параметъра:
(i) Първоначален капацитет: Капацитетът се определя като броя на сегментите в HashMap. Първоначалният капацитет се дефинира като капацитет на обекта HashMap, когато е създаден. Капацитетът на HashMap винаги се умножава по 2.
(ii) LoadFactor: LoadFactor е параметърът, който измерва при препрограмиране - увеличаване на капацитета, ще бъде направено.
Имайте предвид, че ако капацитетът е висок, коефициентът на натоварване ще бъде малък, тъй като няма да е необходимо повторно прослушване. По същия начин, когато капацитетът е нисък, коефициентът на натоварване ще бъде висок, тъй като ще трябва да препрограмираме често. По този начин трябва да внимаваме внимателно да изберем тези два фактора, за да създадем ефективна hashMap.
Как да повторя HashMap?
HashMap трябва да бъде пресечен, за да манипулира или отпечата двойките ключ-стойност.
Има два начина, по които можем да преминем или да повторим през HashMap.
- Използване на цикъл for
- Използване на цикъла while и итератора.
Програмата Java по-долу показва изпълнението на двата метода.
Първо извличаме набора от записи от HashMap с помощта на метода entrySet и след това обхождаме набора с помощта на цикъл for. След това отпечатваме двойките ключ-стойност, използвайки съответно методите getKey () и getValue ().
За да прекосим HashMap с помощта на цикъл while, първо задаваме итератор за HashMap и след това осъществяваме достъп до двойките ключ-стойност с помощта на итератора.
import java.util.*; public class Main{ public static void main(String () args) { //create a HashMap and initialize it HashMap cities_map = new HashMap(); cities_map.put(10, 'MUM'); cities_map.put(1, 'DL'); cities_map.put(20, 'PUN'); cities_map.put(7, 'GOA'); cities_map.put(3, 'HYD'); //print using for loop System.out.println('HashMap using for Loop:'); System.out.println(' KEY VALUE'); for (Map.Entry mapSet : cities_map.entrySet()) { System.out.println(' '+mapSet.getKey() + ' ' + mapSet.getValue()); } //print using while loop with iterator System.out.println('HashMap using while Loop:'); System.out.println(' KEY VALUE'); Iterator iterator = cities_map.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry mapSet2 = (Map.Entry) iterator.next(); System.out.println(' '+mapSet2.getKey() + ' ' + mapSet2.getValue()); } } }
Изход:
HashMap използва за Loop:
КЛЮЧОВА СТОЙНОСТ
1 DL
3 ДЪЛГО
20 PUN
7 ПЪРВА
10 МАМА
HashMap използва, докато Loop:
КЛЮЧОВА СТОЙНОСТ
1 DL
3 ДЪЛГО
20 PUN
7 ПЪРВА
10 МАМА
Отпечатайте хеш карта
Нека да видим друг пример за отпечатване на hashMap с помощта на foreach цикъл, показан в програмата по-долу.
import java.util.HashMap; public class Main { public static void main(String() args) { // create a HashMap and initialize HashMap colors = new HashMap(); colors.put('Red', 1); colors.put('Orange', 5); colors.put('Magenta', 8); //print the HashMap System.out.println('HashMap contents:'); System.out.println(' KEY VALUE'); for (String i : colors.keySet()) { System.out.println(' ' + i + ' ' + colors.get(i)); } } }
Изход:
Съдържание на HashMap:
КЛЮЧОВА СТОЙНОСТ
Мрежа 1
Пурпурен 8
Оранжево 5
Конструктор / методи на HashMap в Java
Таблиците по-долу показват конструкторите и методите, предоставени от класа HashMap в Java.
Конструктори
Прототип на конструктора | Описание | |
---|---|---|
putAll | void putAll (Карта на картата) | Вмъква посочени елементи на „map“ в HashMap. |
HashMap () | Конструктор по подразбиране. | |
HashMap (карта m) | Създава нова HashMap от дадения обект на карта m. | |
HashMap (вътрешен капацитет) | Създава нова HashMap с първоначалния капацитет, зададен с аргумент ‘капацитет’. | |
HashMap (вътрешен капацитет, float loadFactor) | Създава нова HashMap, използвайки стойностите на капацитет и loadFactor, предоставени от конструктора. |
Методи
Метод | Прототип на метода | Описание |
---|---|---|
ясно | празно ясно () | Изчиства всички съпоставяния в HashMap |
празно е | boolean isEmpty () | Проверява дали HashMap е празен. Връща вярно, ако да. |
клон | Клон на обект () | Връща плитко копие, без да се клонират съпоставянията на ключове и стойности в HashMap. |
entrySet | Задаване на entrySet () | Връща картографиране в HashMap като колекция |
набор от клавиши | Set keySet () | Връща набор от ключове в HashMap. |
слагам | V put (Object key, Object value) | Вмъква запис ключ-стойност в HashMap. |
putIfAbsent | V putIfAbsent (ключ K, стойност V) | Вмъква дадена двойка ключ-стойност в HashMap, ако тя все още не е налице. |
Премахване | V премахване (Object key) | Изтрийте запис от HashMap за дадения ключ. |
Премахване | булево премахване (Object key, Object value) | Изтрива дадената двойка ключ-стойност от HashMap. |
изчисли | V изчисление (ключ K, BiFunction remappingFunction) | Изчислява картографиране, използвайки „функция за повторно присвояване“ за дадения ключ и текущата му стойност или нулева стойност. |
Метод | Прототип на метода | Описание |
computeIfAbsent | V computeIfAbsent (клавиш K, Функция mappingFunction) | Изчислява картографирането, използвайки ‘mappingFunction’ и вмъква двойки ключ-стойност, ако то вече не е налице или е нула. |
computeIfPresent | V computeIfPresent (ключ K, BiFunction remappingFunction) | Изчислява ново картографиране, използвайки ‘remappingFunction’, даден на ключа, ако ключът вече е наличен и не е нулев. |
съдържа стойност | boolean containsValue (стойност на обекта) | Проверява дали дадената стойност съществува в HashMap и връща true, ако да. |
съдържаКлюч | boolean containsKey (Object key) | Проверява дали даден ключ присъства в HashMap и връща true, ако да. |
се равнява | булево равно (Обект o) | Сравнява даден обект с HashMap. |
за всеки | void forEach (действие на BiConsumer) | Изпълнява дадено „действие“ за всеки от записите в HashMap. |
вземете | V get (Object key) | Връща обекта, съдържащ дадения ключ със свързаната стойност. |
getOrDefault | V getOrDefault (Object key, V defaultValue) | Връща стойността, към която е даден съответният ключ. Ако не е картографирано, връща стойността по подразбиране. |
празно е | boolean isEmpty () | Проверява дали HashMap е празен. |
отивам | V сливане (K ключ, V стойност, BiFunction remappingFunction) | Проверява дали даденият ключ е нула или не е свързан със стойност и след това го свързва с ненулева стойност, използвайки remappingFunction. |
замени | V заместване (ключ K, стойност V) | Заменя дадената стойност за посочения ключ. |
замени | булева замяна (ключ K, V oldValue, V newValue) | Заменя старата стойност на дадения ключ с новата стойност |
replaceAll | void replaceAll (функция BiFunction) | Изпълнява дадената функция и замества всички стойности в HashMap с резултата от функцията. |
стойности | Стойности на колекцията () | Връща колекцията от стойности, налични в HashMap. |
размер | размер int () | Връща размера на броя на записите в HashMap. |
Внедряване на Hashmap
След това ще внедрим повечето от тези функции в Java програма, за да разберем по-добре тяхната работа.
Следващата програма Java показва изпълнение на HashMap в Java. Имайте предвид, че сме използвали повечето методи, които обсъдихме по-горе.
import java.util.*; public class Main { public static void main(String args()) { HashMap hash_map = new HashMap(); hash_map.put(12, 'Leo'); hash_map.put(2, 'Seville'); hash_map.put(7, 'Lacy'); hash_map.put(49, 'Lily'); hash_map.put(3, 'Dillon'); System.out.println('HashMap contents:'); System.out.println(' KEY VALUE'); //display HashMap contents Set setIter = hash_map.entrySet(); Iterator map_iterator = setIter.iterator(); while(map_iterator.hasNext()) { Map.Entry map_entry = (Map.Entry)map_iterator.next(); System.out.println(' '+ map_entry.getKey() + ' ' + map_entry.getValue()); } //get value for the given key String var= hash_map.get(2); System.out.println('Value at index 2 is: '+var); //delete value given the key hash_map.remove(3); System.out.println('Hashmap after removal:'); System.out.println(' KEY VALUE'); Set iter_set = hash_map.entrySet(); Iterator iterator = iter_set.iterator(); while(iterator.hasNext()) { Map.Entry mentry = (Map.Entry)iterator.next(); System.out.println(' '+mentry.getKey() + ' ' + mentry.getValue() ); } } }
Изход:
класификация на дървото на решения при извличане на данни
Съдържание на HashMap:
КЛЮЧОВА СТОЙНОСТ
49 Лили
2 Севиля
3 Дилон
7 Дантелена
12 Лъв
Стойност при индекс 2 е: Севиля
Hashmap след премахване:
КЛЮЧОВА СТОЙНОСТ
49 Лили
2 Севиля
7 Дантелена
12 Лъв
Сортирайте HashMap в Java
В Java HashMap не запазва реда. Следователно трябва да сортираме елементите в HashMap. Можем да сортираме елементите в HashMap или въз основа на ключове или стойности. В този раздел ще обсъдим двата подхода за сортиране.
Сортирайте HashMap по ключове
import java.util.*; public class Main { public static void main(String() args) { //create and initialize a HashMap HashMap colors_map = new HashMap(); colors_map.put(9, 'Magenta'); colors_map.put(11, 'Yellow'); colors_map.put(7, 'Cyan'); colors_map.put(23, 'Brown'); colors_map.put(5, 'Blue'); colors_map.put(3, 'Green'); colors_map.put(1, 'Red'); //print the unsorted HashMap by getting a set and using iterator System.out.println('Unsorted HashMap:'); Set set = colors_map.entrySet(); Iterator iterator = set.iterator(); while(iterator.hasNext()) { Map.Entry me = (Map.Entry)iterator.next(); System.out.print(me.getKey() + ': '); System.out.println(me.getValue()); } //create a treemap from given HashMap so that the keys are sorted Map map = new TreeMap(colors_map); System.out.println('HashMap Sorted on keys:'); //print the sorted HashMap Set set2 = map.entrySet(); Iterator iterator2 = set2.iterator(); while(iterator2.hasNext()) { Map.Entry me2 = (Map.Entry)iterator2.next(); System.out.print(me2.getKey() + ': '); System.out.println(me2.getValue()); } } }
Изход:
Несортирана HashMap:
1: Мрежа
3: Зелено
5: Синьо
7: Циан
23: Кафяво
9: Магента
11: Жълто
HashMap Сортирано по клавиши:
1: Мрежа
3: Зелено
5: Синьо
7: Циан
9: Магента
11: Жълто
23: Кафяво
В горната програма виждаме, че след като hashmap е дефиниран и попълнен със стойности, ние създаваме treemap от тази hashmap. Тъй като hashmap се преобразува в дървесна карта, ключовете му се сортират автоматично. По този начин, когато показваме тази дървесна карта, получаваме сортираната карта на ключове.
Сортирайте HashMap по стойности
За сортиране на HashMap според стойностите, първо преобразуваме hashmap в LinkedList. След това използваме метода Collections.sort заедно с компаратора, за да сортираме списъка. След това този списък се преобразува обратно в HashMap. След това се отпечатва сортираната HashMap.
import java.util.*; public class Main { public static void main(String() args) { //Create and initialize the HashMap HashMap colors_map = new HashMap(); colors_map.put(5, 'B'); colors_map.put(11, 'O'); colors_map.put(3, 'I'); colors_map.put(13, 'R'); colors_map.put(7, 'G'); colors_map.put(1, 'V'); colors_map.put(9, 'Y'); //print the HashMap using iterator after converting to set System.out.println('Unsorted HashMap:'); Set set = colors_map.entrySet(); Iterator iterator = set.iterator(); while(iterator.hasNext()) { Map.Entry map_entry = (Map.Entry)iterator.next(); System.out.print(map_entry.getKey() + ': '); System.out.println(map_entry.getValue()); } //call sortByValues method that returns a sorted Map. Map c_map = sortByValues(colors_map); System.out.println('HashMap sorted on values:'); //print the sorted HashMap Set set2 = c_map.entrySet(); Iterator iterator2 = set2.iterator(); while(iterator2.hasNext()) { Map.Entry map_entry2 = (Map.Entry)iterator2.next(); System.out.print(map_entry2.getKey() + ': '); System.out.println(map_entry2.getValue()); } } private static HashMap sortByValues(HashMap hash_map) { //create a LinkedList from HashMap List list = new LinkedList(hash_map.entrySet()); // use Collections.sort method with Comparator to sort the list Collections.sort(list, new Comparator() { public int compare(Object o1, Object o2) { return ((Comparable) ((Map.Entry) (o1)).getValue()) .compareTo(((Map.Entry) (o2)).getValue()); } }); //create a HashMap from linkedlist which preserves the order HashMap sortedHashMap = new LinkedHashMap(); for (Iterator it = list.iterator(); it.hasNext();) { Map.Entry entry = (Map.Entry) it.next(); sortedHashMap.put(entry.getKey(), entry.getValue()); } return sortedHashMap; } }
Изход:
Несортирана HashMap:
1: V
3: I
5: Б
7: G
9: и
11: О
13: R
HashMap сортиран по стойности:
5: Б
7: G
3: I
11: О
13: R
1: V
9: и
Едновременна HashMap в Java
В нормалната HashMap няма да можем да модифицираме елементите по време на изпълнение или докато се извършва итерация.
Изпълнението на едновременна карта е показано по-долу:
import java.util.*; import java.util.concurrent.ConcurrentHashMap; public class Main { public static void main(String() args) { //declare and initialize ConcurrentHashMap Map cCMap = new ConcurrentHashMap(); cCMap.put('1', '10'); cCMap.put('2', '10'); cCMap.put('3', '10'); cCMap.put('4', '10'); cCMap.put('5', '10'); cCMap.put('6', '10'); //print the initial ConcurrentHashMap System.out.println('Initial ConcurrentHashMap: '+cCMap); //define the iterator over the keys of ConcurrentHashMap Iterator it = cCMap.keySet().iterator(); //change one of the keys using iterator while(it.hasNext()){ String key = it.next(); if(key.equals('3')) cCMap.put(key+'c_map', 'c_map'); } //print the changed ConcurrentHashMap System.out.println('
ConcurrentHashMap after iterator: '+cCMap); } }
Изход:
Първоначална ConcurrentHashMap: {1 = 10, 2 = 10, 3 = 10, 4 = 10, 5 = 10, 6 = 10}
ConcurrentHashMap след итератор: {1 = 10, 2 = 10, 3 = 10, 4 = 10, 5 = 10, 6 = 10, 3c_map = c_map}
Имайте предвид, че ако бяхме извършили същата операция с HashMap, тогава тя щеше да хвърли ConcurrentModificationException.
Карта на Java срещу HashMap
Нека да обобщим някои от разликите между Map и HashMap в Java.
Карта | HashMap |
---|---|
Това е абстрактен интерфейс. | Е внедряване на интерфейс Map. |
Интерфейсът трябва да бъде реализиран от други класове, за да бъде налична неговата функционалност. | Е конкретен клас и могат да се създават обекти на класа, за да се получи функционалността. |
Внедряването на интерфейс на карта като TreeMap не позволява нулеви стойности. | Позволява нулеви стойности и ключове. |
TreeMap не позволява дублирани стойности. | Може да има дублирани стойности. |
Поддържа се естествен ред на обектите. | В HashMap не се поддържа ред за въвеждане. |
често задавани въпроси
Въпрос # 1) Защо HashMap се използва в Java?
Отговор: HashMap като колекция от двойки ключ-стойност помага да се търсят данните само въз основа на ключа. Също така, тъй като използва техники за хеширане, той осигурява ефективно търсене на данни.
Q # 2)Как се създава хеш карта?
Отговор: HashMap може да бъде създаден чрез създаване на инстанция на класа „HashMap“ на пакета java.util. Може да се създаде hashMap с ключове от цяло число и стойности на тип низ, както следва:
HashMap myMap= new HashMap();
Q # 3)Подредена ли е HashMap в Java?
Отговор: Не, HashMap не е поръчан в Java. Той не се използва в Java за тази цел, но се използва за съхраняване на елементи в двойки ключ-стойност.
Q # 4)Безопасен ли е HashMap с нишки?
Отговор: НЕ, hashMap не е безопасен за нишки в Java.
Q # 5)Кое е по-бързо HashMap или ConcurrentHashMap?
Отговор: HashMap е по-бърз от ConcurrentHashMap. Причината е, че HashMap обикновено работи само с една нишка, поради което нейната производителност е добра. Паралелната HashMap обаче, както подсказва името, е едновременна и може да работи едновременно на множество нишки.
Заключение
В този урок разбрахме работата на HashMap заедно с друг вариант на HashMap, наречен ConcurrentHashMap. Виждали сме конструктори, методи и примери за HashMap. Също така обсъдихме ConcurrentHashMap заедно с неговия пример.
В предстоящите ни уроци ще научим повече за Java Collections.
=> Проверете тук, за да видите A-Z на уроците за обучение по Java тук.
Препоръчително четене
- LinkedHashMap в Java - Пример и изпълнение на LinkedHashMap
- Урок за JAVA за начинаещи: 100+ практически ръководства за Java видео
- TreeMap в Java - Урок с примери за TreeMap на Java
- Какво е Java Vector | Урок за Java Vector Class с примери
- Java String съдържа () Урок за метод с примери
- Как да сортираме масив в Java - Урок с примери
- Назъбен масив в Java - урок с примери
- Урок за клас Java Scanner с примери