what is hashmap java
Цей підручник з HashMap Java пояснює, що таке HashMap у Java та як ним користуватися. Він включає в себе те, як оголосити, ініціалізувати, повторити, реалізувати та роздрукувати HashMap:
HashMap в Java - це колекція, заснована на Map і складається з пар ключ-значення. HashMap позначається або. Елемент HashMap можна отримати за допомогою ключа, тобто ми повинні знати ключ, щоб отримати доступ до елемента HashMap.
HashMap використовує техніку, яка називається 'хешування'. У хешуванні довший рядок перетворюється на коротший рядок, застосовуючи якийсь алгоритм або «хеш-функцію». Рядок перетворюється на коротший рядок, оскільки це допомагає швидше здійснювати пошук. Він також використовується для ефективного індексування.
=> Завітайте сюди, щоб ознайомитись із ексклюзивною серією навчальних посібників 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.
Як оголосити хеш-карту в 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 з назвою ‘maps_map’ з типом ключа як цілим числом та значеннями як рядком.
Після створення 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 - це сукупність пар ключ-значення, і вона використовує техніку, яка називається „хешування”. Внутрішньо HashMap - це масив вузлів. HashMap використовує масив і LinkedList для зберігання пар ключ-значення.
Нижче наведена структура вузла HashMap, яка програмно представлена як клас.
Як видно з подання вузла вище, вузол має структуру, подібну до пов'язаного вузла списку. Масив цих вузлів називається Bucket. Кожне відро може мати не однакову ємність, а також може мати більше одного вузла.
На продуктивність HashMap впливають два параметри:
(i) Початкова потужність: Ємність визначається як кількість сегментів у HashMap. Початкова ємність визначається як ємність об'єкта HashMap при його створенні. Ємність HashMap завжди множиться на 2.
(ii) LoadFactor: LoadFactor - це параметр, який вимірює при повторній обробці - збільшується пропускна здатність.
Зверніть увагу, що якщо ємність велика, коефіцієнт навантаження буде невеликим, оскільки не потрібно буде повторної перепрофілювання. Подібним чином, коли ємність низька, коефіцієнт навантаження буде високим, оскільки нам доведеться часто переробляти. Таким чином, ми повинні бути обережними, ретельно вибираючи ці два фактори для розробки ефективної хеш-карти.
Як повторити хеш-карту?
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 GOA
10 МАМ
HashMap, використовуючи while Loop:
КЛЮЧОВА ЦІННІСТЬ
1 DL
3 ДОВГО
20 PUN
7 GOA
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
що таке операційна система linux та unix
Конструктор HashMap / методи в Java
У наведених нижче таблицях показані конструктори та методи, надані класом HashMap в Java.
Конструктори
Прототип конструктора | Опис | |
---|---|---|
putAll | void putAll (карта мапи) | Вставляє вказані елементи 'map' у HashMap. |
HashMap () | Конструктор за замовчуванням. | |
HashMap (карта м) | Створює нову HashMap з даного об'єкта карти m. | |
HashMap (внутрішня потужність) | Створює нову HashMap з початковою місткістю, заданою аргументом ‘ємність’. | |
HashMap (внутрішня потужність, плаваючий навантажувальний фактор) | Створює нову HashMap, використовуючи значення ємності та loadFactor, надані конструктором. |
Методи
Метод | Метод-прототип | Опис |
---|---|---|
ясно | void clear () | Очищає всі зіставлення в HashMap |
пусто | логічний isEmpty () | Перевіряє, чи HashMap порожній. Повертає true, якщо так. |
клон | Клон об'єкта () | Повертає поверхневу копію без клонування ключів та зіставлення значень у HashMap. |
entrySet | Встановити entrySet () | Повертає відображення в HashMap як колекцію |
набір клавіш | Встановити keySet () | Повертає набір ключів у HashMap. |
поставити | V put (ключ об'єкта, значення об'єкта) | Вставляє запис ключ-значення в HashMap. |
putIfAbsent | V putIfAbsent (K key, V value) | Вставляє задану пару ключ-значення в HashMap, якщо вона ще не присутня. |
видалити | V видалити (клавіша об'єкта) | Видаліть запис із HashMap для даного ключа. |
видалити | логічне видалення (ключ об'єкта, значення об'єкта) | Видаляє дану пару ключ-значення з HashMap. |
обчислити | V обчислення (клавіша K, функція переназначення BiFunction) | Обчислює зіставлення з використанням функції 'перепризначення' для даного ключа та його поточного значення або нульового значення. |
Метод | Метод-прототип | Опис |
computeIfAbsent | V computeIfAbsent (клавіша K, функція відображення функції) | Обчислює зіставлення за допомогою функції ‘mappingFunction’ і вставляє пари ключ-значення, якщо воно ще не присутнє або має значення null. |
computeIfPresent | V computeIfPresent (клавіша K, BiFunction remappingFunction) | Обчислює нове зіставлення, використовуючи функцію ‘remappingFunction’, задану ключем, якщо ключ уже присутній і не є нульовим. |
містить значення | boolean containsValue (значення об'єкта) | Перевіряє, чи вказане значення існує в HashMap, і повертає true, якщо так. |
міститьКлюч | boolean containsKey (Ключ об'єкта) | Перевіряє, чи вказаний ключ присутній у HashMap, і повертає true, якщо так. |
дорівнює | логічне значення дорівнює (Об'єкт o) | Порівнює даний об'єкт з HashMap. |
для кожного | void forEach (дія BiConsumer) | Виконує задану 'дію' для кожного із записів у HashMap. |
отримати | V get (Ключ об'єкта) | Повертає об'єкт, що містить вказаний ключ, з відповідним значенням. |
getOrDefault | V getOrDefault (Ключ об’єкта, V defaultValue) | Повертає значення, на яке наведено відповідний ключ. Якщо не зіставлено, повертає значення за замовчуванням. |
пусто | логічний isEmpty () | Перевіряє, чи HashMap порожній. |
піти | Злиття V (клавіша K, значення V, BiFunction remappingFunction) | Перевіряє, чи вказаний ключ є нульовим чи не пов'язаний зі значенням, а потім пов'язує його з ненульовим значенням за допомогою remappingFunction. |
замінити | Заміна V (клавіша K, значення V) | Замінює задане значення для вказаного ключа. |
замінити | логічна заміна (клавіша K, V oldValue, V newValue) | Замінює старе значення даного ключа новим |
replaceAll | void replaceAll (функція BiFunction) | Виконує задану функцію і замінює всі значення в HashMap результатом функції. |
значення | Значення колекції () | Повертає колекцію значень, присутніх у HashMap. |
розмір | розмір int () | Повертає розмір кількості записів у 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: Севілья
Хеш-карта після видалення:
КЛЮЧОВА ЦІННІСТЬ
49 Лілія
2 Севілья
7 Мереживна
12 Лев
Сортувати HashMap на Java
У Java 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 за значеннями спочатку ми перетворюємо хеш-карту в 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: Я
5: Б
7: Г.
9: і
11: О
13: Р
HashMap відсортовано за значеннями:
5: Б
7: Г.
3: Я
11: О
13: Р
1: V
9: і
Паралельна хеш-карта в 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 не зберігається жодного порядку введення. |
Часті запитання
Q # 1) Чому HashMap використовується в Java?
Відповідь: HashMap, яка є колекцією пар ключ-значення, допомагає шукати дані, базуючись лише на ключі. Окрім того, що він використовує методи хешування, він забезпечує ефективний пошук даних.
Q # 2)Як створити хеш-карту?
Відповідь: HashMap можна створити, створивши екземпляр класу ‘HashMap’ пакета java.util. Хеш-карту з ключами цілого типу типу та значеннями рядка типу можна створити наступним чином:
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 - Підручник з прикладами Java TreeMap
- Що таке Java Java | Підручник з класу Java Vector з прикладами
- Рядок Java містить () Підручник із методів із прикладами
- Як відсортувати масив на Java - Підручник з прикладами
- Нерівний масив у Java - Підручник із прикладами
- Підручник з класу сканера Java із прикладами