1. Wiele par: klucz-wartość.

Java ma jeszcze jedną interesującą kolekcję (w najszerszym tego słowa znaczeniu) — Map. Nie ma dokładnego tłumaczenia jego nazwy na język rosyjski: najczęściej nazywa się to „mapa”, „słownik” lub po prostu „mapa”.
Ta kolekcja jest podobna do kolekcji Set, tyle że nie przechowuje zestawu elementów, ale zestaw „par elementów”. Każda para elementów Mapskłada się z dwóch: „klucza” i „wartości”.
Załóżmy, że chcesz przechowywać w programie nazwiska pracowników firmy, ich wynagrodzenia lub nazwiska współpracowników i ich wiek. Wtedy potrzebujesz takiej tabeli:
| Nazwa | Wiek |
|---|---|
| Siergiej | 21 |
| Mikołaj | 22 |
| Iwan Pietrowicz | 48 |
| Anyuta | ? |
Każda linia zawiera parę wartości. Nazwijmy imię kluczem pary , a wiek wartością pary .
Cały zbiór takich par będzie nazywany mapą - Map.
Klucz pary może być dowolny, ale kluczem nie może być null. Klucze muszą być unikalne: jedna karta nie może zawierać dwóch identycznych kluczy.
2. KlasaHashMap
Klasa HashMapjest najpopularniejszą kolekcją wszystkich kart ( Map). Z jednej strony jest bardzo podobny do HashSet i ma wszystkie swoje metody, az drugiej strony wygląda jak lista ( ArrayList), gdyby indeksami listy nie były liczby, a słowa.
Możesz utworzyć obiekt typu HashMapza pomocą polecenia view:
HashMap<TКлюч, TЗначение> Nazwa = new HashMap<TКлюч, TЗначение>();
Gdzie TКлючjest typ kluczy w parze elementów, TЗначениеto typ wartości w parze elementów, które będą przechowywane w pliku HashMap.
Klasa HashMapposiada następujące metody:
| metoda | Opis |
|---|---|
|
Dodaje parę ( key, value) do kolekcji |
|
Zwraca wartość według klucza. |
|
Sprawdza, czy klucz istnieje w kolekcji |
|
Sprawdza, czy wartość istnieje w kolekcji |
|
Usuwa element z kolekcji |
|
Czyści kolekcję: usuwa wszystkie elementy |
|
Zwraca liczbę par elementów w kolekcji |
|
Zwraca zestaw kluczy kolekcji |
|
Zwraca zestaw elementów w kolekcji |
|
Zwraca wszystkie wartości w kolekcji jako zbiór ( Set) par ( Map.Entry). |
Dodawanie elementów doHashMap
Elementy są dodawane do mapy jednocześnie parami: w tym celu plik put(). Klucz jest przekazywany jako pierwszy, wartość jako druga.
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Серега", 21);
map.put("Николай", 22);
map.put("Iwan Piotrович", 48);
map.put("Анюта", null);
Jeśli podczas dodawania elementu okaże się, że istnieje już element z takim samym kluczem, stara wartość klucza zostanie zastąpiona nową.
To zachowanie sprawia, że HashMapwygląda jak tablica lub lista, jeśli Stringzamiast liczb miały słowa ( ) jako indeksy.
Prawie każdy typ może działać jako typ klucza i typ wartości. Istnieje kilka drobnych dodatkowych wymagań dotyczących klucza typu, ale dowiesz się o nich, gdy szczegółowo przestudiujesz kolekcje w zadaniu Java Collections.
3. Podzbiory HashMap: zestaw kluczy
Powiedzmy, że chcemy po prostu wyświetlić wszystkie elementy HashMapna ekranie, jak to zrobić? Aby to zrobić, musisz zrozumieć, jak przejść przez wszystkie elementy HashMap. Można to zrobić na wiele sposobów.
Najprostszym sposobem jest użycie pętli klawiszy
Elementy klasy HashMapnie mają numeru seryjnego, więc pętla z licznikiem nie zadziała tutaj. Ale metodą możemy uzyskać wiele kluczy keySet(), a ty już wiesz, jak przejść przez zestaw:
| Kod | Opis |
|---|---|
|
Przejrzyj wszystkie klucze mapUzyskaj wartość według klucza |
Metoda keySet()zwraca zestaw kluczy. Zestaw możesz wykorzystać na dwa sposoby:
| notacja zwarta | długi wpis |
|---|---|
|
|
4. Korzystanie z pętli nad parami
Istnieje bardziej skomplikowany sposób: możesz przekonwertować Mapna zestaw par elementów , a następnie użyć cyklu przez elementy zestawu, jak już się nauczyliśmy.
Kolekcja HashMapma klasę pomocniczą do przechowywania kilku elementów. Wygląda to mniej więcej tak:
class Entry<KeyType, ValueType>
{
private KeyType key;
private ValueType value;
public KeyType getKey()
{
return this.key;
}
public ValueType getValue()
{
return this.value;
}
}
Wynikiem wywołania metody entrySet()na obiekcie typu będzie typ :HashMap<ТКлюч, ТЗначение>Set<Entry<ТКлюч, ТЗначение>>
Set<Entry<Ключ, Значение>> Nazwa = map.entrySet();
Tutaj widzimy typ złożony Setz parametrem wartości, a inny typ złożony ( Entry) działa jako parametr wartości, również z dwoma parametrami.
Początkującemu bardzo łatwo jest się pomylić. Chociaż, jeśli rozumiesz, możesz napisać kod taki jak:
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Серега", 21);
map.put("Николай", 22);
map.put("Iwan Piotrович", 48);
map.put("Анюта", null);
Set<Map.Entry<String, Integer>> entries = map.entrySet();
for(Map.Entry<String, Integer> pair: entries)
{
String key = pair.getKey();
Integer value = pair.getValue();
System.out.println(key + " --> " + value);
}
Chociaż ten kod można nieco uprościć:
Po pierwsze, nie można utworzyć osobnej zmiennej dla entries, ale natychmiast wywołać metodę entrySet()wewnątrz pętli for:
for(Map.Entry<String, Integer> pair: map.entrySet())
{
String key = pair.getKey();
Integer value = pair.getValue();
System.out.println(key + " --> " + value);
}
Po drugie, możesz użyć nowo wprowadzonego operatora, varaby automatycznie wywnioskować typ pary elementów :
for(var pair: map.entrySet())
{
String key = pair.getKey();
Integer value = pair.getValue();
System.out.println(key + " --> " + value);
}
Już dobrze, prawda?
5. Porównanie ArrayListvs.HashMap
HashMapbardzo przypomina ArrayList, w którym nie liczby są używane jako indeksy, ale słowa (lub inny rodzaj kluczy).
A jeśli używasz HashMap, Integerstaje się jeszcze bardziej jak ArrayList. Porównywać:
| Kod z ArrayList<String> | Kod z HashMap<Integer, String> |
|---|---|
|
|
GO TO FULL VERSION