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 Map
skł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 HashMap
jest 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 HashMap
za 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 HashMap
posiada 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 HashMap
wygląda jak tablica lub lista, jeśli String
zamiast 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 HashMap
na 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 HashMap
nie 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 map Uzyskaj 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ć Map
na zestaw par elementów , a następnie użyć cyklu przez elementy zestawu, jak już się nauczyliśmy.
Kolekcja HashMap
ma 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 Set
z 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, var
aby 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 ArrayList
vs.HashMap
HashMap
bardzo 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
, Integer
staje się jeszcze bardziej jak ArrayList
. Porównywać:
Kod z ArrayList<String> | Kod z HashMap<Integer, String> |
---|---|
|
|
GO TO FULL VERSION