what is hashmap java
Ten samouczek dotyczący języka Java HashMap wyjaśnia, czym jest HashMap w języku Java i jak go używać. Obejmuje sposób deklarowania, inicjowania, iteracji, wdrażania i drukowania HashMap:
HashMap w Javie to zbiór oparty na Mapie i składa się z par klucz-wartość. HashMap jest oznaczony przez lub. Dostęp do elementu HashMap można uzyskać za pomocą klucza, tj. Musimy znać klucz, aby uzyskać dostęp do elementu HashMap.
HashMap wykorzystuje technikę zwaną „Hashing”. Podczas mieszania dłuższy ciąg jest konwertowany na krótszy ciąg przez zastosowanie jakiegoś algorytmu lub „funkcji skrótu”. Ciąg jest konwertowany na krótszy ciąg, ponieważ pomaga to w szybszym wyszukiwaniu. Służy również do wydajnego indeksowania.
=> Odwiedź tutaj ekskluzywną serię samouczków szkoleniowych Java.
Czego się nauczysz:
- HashMap w Javie
- Java Map Vs HashMap
- Wniosek
HashMap w Javie
HashMap jest podobny do HashTable z tą różnicą, że HashMap nie jest zsynchronizowany i zezwala na wartości null dla klucza i wartości.
Poniżej podano niektóre z ważnych cech HashMap:
- HashMap jest zaimplementowany w Javie w klasie „Hashmap”, która jest częścią pakietu java.util.
- Klasa HashMap dziedziczy po klasie „AbstractMap”, która częściowo implementuje interfejs Map.
- HashMap implementuje również interfejsy „klonowalne” i „serializowalne”.
- HashMap zezwala na zduplikowane wartości, ale nie zezwala na zduplikowane klucze. HashMap zezwala również na wiele wartości null, ale klucz o wartości null może być tylko jednym.
- HashMap nie jest zsynchronizowany, a także nie gwarantuje kolejności elementów.
- Klasa Java HashMap ma początkową pojemność 16, a domyślny (początkowy) współczynnik obciążenia to 0,75.
Jak zadeklarować HashMap w Javie?
HashMap w Javie jest częścią pakietu java.util. Stąd, jeśli musimy użyć HashMap w naszym kodzie, najpierw musimy zaimportować klasę implementacji, używając jednej z poniższych instrukcji:
import java.util.*;
LUB
import java.util.HashMap;
Ogólna deklaracja klasy HashMap to:
public class HashMap extends AbstractMap implements Map, Cloneable, Serializable
Tutaj K => rodzaj kluczy obecnych na mapie
V => typ wartości przypisanych do kluczy w mapie
Utwórz HashMap
HashMap w Javie można utworzyć w następujący sposób:
import java.util.HashMap; HashMap cities_map = new HashMap ();
Powyższa instrukcja zawiera najpierw klasę HashMap w Javie. Następnie w następnej instrukcji tworzymy HashMap o nazwie „mapa_miasta” z kluczem typu Integer i Values as String.
Po utworzeniu mapy HashMap musimy ją zainicjować wartościami.
Jak zainicjować mapę skrótów?
Możemy zainicjować HashMap za pomocą metody put, umieszczając pewne wartości w mapie.
Poniższy program przedstawia inicjalizację HashMap w Javie.
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()); } } }
Wynik:
Mapa początkowa: {}
Po dodaniu elementów:
100 Network
101 Green
102 niebieski
Jak HashMap działa wewnętrznie?
Wiemy, że HashMap to zbiór par klucz-wartość i wykorzystuje technikę o nazwie „Hashing”. Wewnętrznie HashMap jest tablicą węzłów. HashMap wykorzystuje tablice i LinkedList do przechowywania par klucz-wartość.
Poniżej podano strukturę węzła HashMap, który jest programowo reprezentowany jako klasa.
Jak widać z powyższej reprezentacji węzła, węzeł ma strukturę podobną do połączonego węzła listy. Tablica tych węzłów nosi nazwę Bucket. Każdy zasobnik może nie mieć takiej samej pojemności i może mieć również więcej niż jeden węzeł.
Na wydajność HashMap wpływają dwa parametry:
(i) Początkowa pojemność: Pojemność jest definiowana jako liczba segmentów w HashMap. Pojemność początkowa jest definiowana jako pojemność obiektu HashMap podczas jego tworzenia. Pojemność HashMap jest zawsze mnożona przez 2.
(ii) Współczynnik obciążenia: LoadFactor jest parametrem, który mierzy podczas ponownego haszowania - zwiększenie wydajności zostanie wykonane.
Zauważ, że jeśli pojemność jest wysoka, współczynnik obciążenia będzie mały, ponieważ nie będzie wymagane ponowne mieszanie. Podobnie, gdy pojemność jest niska, współczynnik obciążenia będzie wysoki, ponieważ będziemy musieli często powtarzać. Dlatego powinniśmy uważać, aby starannie wybrać te dwa czynniki w celu zaprojektowania wydajnej mapy mieszania.
Jak iterować HashMap?
Należy przejść przez HashMap, aby manipulować lub drukować pary klucz-wartość.
Istnieją dwa sposoby, w których możemy przeglądać lub iterować po HashMap.
- Korzystanie z pętli for
- Korzystanie z pętli while i iteratora.
Poniższy program Java przedstawia implementację obu tych metod.
Najpierw pobieramy zestaw wpisów z HashMap za pomocą metody entrySet, a następnie przechodzimy przez zbiór za pomocą pętli for. Następnie drukujemy pary klucz-wartość za pomocą odpowiednio metod getKey () i getValue ().
Aby przejść przez HashMap za pomocą pętli while, najpierw ustawiamy iterator dla HashMap, a następnie uzyskujemy dostęp do par klucz-wartość za pomocą iteratora.
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()); } } }
Wynik:
HashMap przy użyciu for Loop:
KLUCZOWA WARTOŚĆ
1 DL
3 DŁUGIE
20 PUN
7 GOA
10 MUM
HashMap przy użyciu while Loop:
KLUCZOWA WARTOŚĆ
1 DL
3 DŁUGIE
20 PUN
7 GOA
10 MUM
Wydrukuj mapę skrótów
Zobaczmy kolejny przykład drukowania hashMap przy użyciu pętli foreach pokazanej w poniższym programie.
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)); } } }
Wynik:
Zawartość HashMap:
KLUCZOWA WARTOŚĆ
Sieć 1
Purpurowy 8
Pomarańczowy 5
Konstruktor / metody HashMap w Javie
Poniższe tabele przedstawiają konstruktory i metody udostępniane przez klasę HashMap w języku Java.
Konstruktorzy
Prototyp konstruktora | Opis | |
---|---|---|
połóż wszystko | void putAll (Mapa mapy) | Wstawia określone elementy „mapy” w HashMap. |
HashMap () | Konstruktor domyślny. | |
HashMap (mapa m) | Tworzy nową HashMap z danego obiektu mapy m. | |
HashMap (pojemność int) | Tworzy nową HashMap z początkową pojemnością podaną przez argument „pojemność”. | |
HashMap (pojemność int, współczynnik obciążenia zmiennoprzecinkowego) | Tworzy nową HashMap przy użyciu wartości capacity i loadFactor podanych przez konstruktora. |
Metody
metoda | Prototyp metody | Opis |
---|---|---|
jasny | void clear () | Czyści wszystkie mapowania w HashMap |
jest pusty | boolean isEmpty () | Sprawdza, czy HashMap jest pusty. Zwraca wartość true, jeśli tak. |
klon | Klon obiektu () | Zwraca płytką kopię bez klonowania kluczy i mapowań wartości w HashMap. |
entrySet | Ustaw entrySet () | Zwraca mapowania w HashMap jako kolekcję |
zestaw kluczy | Ustaw keySet () | Zwraca zestaw kluczy w HashMap. |
położyć | V put (klucz obiektu, wartość obiektu) | Wstawia wpis klucz-wartość w HashMap. |
putIfAbsent | V putIfAbsent (klawisz K, wartość V) | Wstawia daną parę klucz-wartość w HashMap, jeśli nie jest jeszcze obecna. |
usunąć | V usuń (klucz obiektu) | Usuń wpis z HashMap dla danego klucza. |
usunąć | usunięcie logiczne (klucz obiektu, wartość obiektu) | Usuwa daną parę klucz-wartość z HashMap. |
obliczać | V obliczenie (klawisz K, funkcja ponownego odwzorowania funkcji BiFunction) | Oblicza mapowanie przy użyciu funkcji „remappingfunction” dla danego klucza i jego bieżącej wartości lub wartości null. |
metoda | Prototyp metody | Opis |
computeIfAbsent | V computeIfAbsent (klawisz K, funkcja mapowania funkcji) | Oblicza mapowanie przy użyciu funkcji „mappingFunction” i wstawia pary klucz-wartość, jeśli jeszcze ich nie ma lub ma wartość null. |
computeIfPresent | V computeIfPresent (klawisz K, funkcja remappingu BiFunction) | Oblicza nowe mapowanie przy użyciu funkcji „remappingFunction” z podanym kluczem, jeśli klucz jest już obecny i nie ma wartości null. |
zawieraValue | boolean zawieraValue (wartość obiektu) | Sprawdza, czy podana wartość istnieje w HashMap i zwraca wartość true, jeśli tak. |
zawieraKlucz | boolean containsKey (klucz obiektu) | Sprawdza, czy podany klucz jest obecny w HashMap i zwraca wartość true, jeśli tak. |
równa się | boolean równa się (Object o) | Porównuje dany obiekt z HashMap. |
dla każdego | void forEach (akcja BiConsumer) | Wykonuje daną „akcję” dla każdego wpisu w HashMap. |
otrzymać | V get (klucz obiektu) | Zwraca obiekt zawierający podany klucz ze skojarzoną wartością. |
getOrDefault | V getOrDefault (klucz obiektu, V defaultValue) | Zwraca wartość, na którą mapowany jest dany klucz. Jeśli nie jest mapowane, zwraca wartość domyślną. |
jest pusty | boolean isEmpty () | Sprawdza, czy HashMap jest pusty. |
iść | Scalanie V (klawisz K, wartość V, funkcja remapowania BiFunction) | Sprawdza, czy dany klucz ma wartość null lub nie jest skojarzony z wartością, a następnie kojarzy go z wartością inną niż null za pomocą funkcji remappingFunction. |
zastąpić | Zastąp V (klawisz K, wartość V) | Zastępuje daną wartość dla określonego klucza. |
zastąpić | boolean replace (klawisz K, V oldValue, V newValue) | Zastępuje starą wartość danego klucza nową wartością |
Zamień wszystko | void replaceAll (funkcja BiFunction) | Wykonuje daną funkcję i zastępuje wszystkie wartości w HashMap wynikiem funkcji. |
wartości | Wartości kolekcji () | Zwraca kolekcję wartości obecnych w HashMap. |
rozmiar | rozmiar int () | Zwraca rozmiar liczby wpisów w HashMap. |
Implementacja Hashmap
Następnie zaimplementujemy większość tych funkcji w programie Java, aby lepiej zrozumieć ich działanie.
Poniższy program Java przedstawia implementację HashMap w Javie. Zauważ, że użyliśmy większości metod, które omówiliśmy powyżej.
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() ); } } }
Wynik:
Zawartość HashMap:
KLUCZOWA WARTOŚĆ
49 Lily
2 Sewilla
3 Dillon
7 Lacy
12 Leo
Wartość w indeksie 2 to: Sewilla
Hashmap po usunięciu:
KLUCZOWA WARTOŚĆ
49 Lily
2 Sewilla
7 Lacy
12 Leo
Sortuj HashMap w Javie
W Javie HashMap nie zachowuje kolejności. Dlatego musimy posortować elementy w HashMap. Możemy sortować elementy w HashMap na podstawie kluczy lub wartości. W tej sekcji omówimy oba podejścia do sortowania.
Sortuj HashMap według kluczy
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()); } } }
Wynik:
Niesortowana HashMap:
1: Sieć
3: zielony
5: niebieski
7: cyjan
23: brązowy
9: purpurowy
11: żółty
HashMap posortowane według kluczy:
1: Sieć
3: zielony
5: niebieski
7: cyjan
9: purpurowy
11: żółty
23: brązowy
W powyższym programie widzimy, że po zdefiniowaniu mapy mieszania i wypełnieniu jej wartościami tworzymy mapę drzewa z tej mapy. Ponieważ haszmapa jest konwertowana na mapę drzewa, jej klucze są automatycznie sortowane. Zatem kiedy wyświetlamy tę mapę drzewa, otrzymujemy posortowaną mapę na klawiszach.
Sortuj HashMap według wartości
Aby posortować HashMap według wartości, najpierw konwertujemy hashmap na LinkedList. Następnie używamy metody Collections.sort wraz z komparatorem do sortowania listy. Ta lista jest następnie konwertowana z powrotem do HashMap. Następnie drukowana jest posortowana 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; } }
Wynik:
Niesortowana HashMap:
1: V
3: ja
5: B
7: G.
9: i
11: O
13: R
HashMap posortowane według wartości:
5: B
7: G.
3: ja
11: O
13: R
1: V
9: i
Współbieżna HashMap w Javie
W normalnej HashMap nie będziemy mogli modyfikować elementów w czasie wykonywania lub podczas wykonywania iteracji.
Implementację współbieżnej mapy pokazano poniżej:
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); } }
Wynik:
Początkowa ConcurrentHashMap: {1 = 10, 2 = 10, 3 = 10, 4 = 10, 5 = 10, 6 = 10}
ConcurrentHashMap po iteratorze: {1 = 10, 2 = 10, 3 = 10, 4 = 10, 5 = 10, 6 = 10, 3c_map = c_map}
Zwróć uwagę, że gdybyśmy wykonali tę samą operację z HashMap, wyrzuciłaby ona ConcurrentModificationException.
Java Map Vs HashMap
Przedstawmy w tabeli niektóre różnice między Mapami i HashMapami w Javie.
Mapa | HashMap |
---|---|
Jest to abstrakcyjny interfejs. | Jest implementacją interfejsu Map. |
Interfejs musi być zaimplementowany przez inne klasy, aby jego funkcjonalność była dostępna. | Czy konkretna klasa i obiekty klas mogą być tworzone w celu uzyskania funkcjonalności. |
Implementacja interfejsu mapy, taka jak TreeMap, nie zezwala na wartości null. | Zezwala na wartości null i klucze. |
TreeMap nie zezwala na zduplikowane wartości. | Może mieć zduplikowane wartości. |
Zachowany jest naturalny porządek obiektów. | W HashMap nie jest utrzymywana kolejność wprowadzania. |
Często Zadawane Pytania
P # 1) Dlaczego HashMap jest używany w Javie?
Odpowiedź: HashMap będący zbiorem par klucz-wartość pomaga w wyszukiwaniu danych na podstawie samego klucza. Ponieważ używa technik mieszania, zapewnia wydajne wyszukiwanie danych.
Pytanie nr 2)Jak tworzysz mapę skrótów?
Odpowiedź: HashMap można utworzyć, tworząc wystąpienie klasy „HashMap” pakietu java.util. HashMap z kluczami typu integer i wartościami typu string można utworzyć w następujący sposób:
HashMap myMap= new HashMap();
Pytanie nr 3)Czy HashMap jest zamawiany w Javie?
jak znaleźć klucz bezpieczeństwa sieci na moim komputerze
Odpowiedź: Nie, HashMap nie jest uporządkowany w Javie. Nie jest używany w Javie do tego celu, ale służy do przechowywania elementów w parach klucz-wartość.
Pytanie 4)Czy HashMap jest bezpieczny dla wątków?
Odpowiedź: NIE, mapa hash nie jest bezpieczna wątkowo w Javie.
Pytanie nr 5)Który jest szybszy HashMap czy ConcurrentHashMap?
Odpowiedź: HashMap jest szybszy niż ConcurrentHashMap. Powodem jest to, że HashMap zwykle działa tylko na jednym wątku, więc jego wydajność jest dobra. Jednak Concurrent HashMap, jak sama nazwa wskazuje, jest współbieżny i może działać jednocześnie na wielu wątkach.
Wniosek
W tym samouczku zrozumieliśmy działanie HashMap wraz z inną odmianą HashMap o nazwie ConcurrentHashMap. Widzieliśmy konstruktory, metody i przykłady HashMap. Omówiliśmy również ConcurrentHashMap wraz z jej przykładem.
W naszych nadchodzących samouczkach dowiemy się więcej o kolekcjach Java.
=> Zajrzyj tutaj, aby zobaczyć A-Z samouczków szkoleniowych Java tutaj.
rekomendowane lektury
- LinkedHashMap w Javie - Przykład i implementacja LinkedHashMap
- Samouczek JAVA dla początkujących: ponad 100 praktycznych samouczków wideo Java
- TreeMap w Javie - samouczek z przykładami TreeMap w języku Java
- Co to jest wektor Java | Samouczek klasy wektorowej Java z przykładami
- Java String zawiera () Samouczek dotyczący metody z przykładami
- Jak posortować tablicę w Javie - samouczek z przykładami
- Postrzępiona tablica w Javie - samouczek z przykładami
- Samouczek klasy skanera Java z przykładami