Dotarliśmy do końca drogi kolekcji, dziś omówimy Mapy, które zamkną nam serię dotyczącą podstaw kolekcji. Jak to zostało wspomniane we wstępie serii, mapy nie są ściśle kolekcjami – nie dziedziczą interfejsu Collection, jednak zawsze gdy mówi się o kolekcjach w Javie, mapy dokłada do całego grona 😊
01. Mapy
Mapy są specyficzną strukturą danych, które przechowują elementy w sposób klucz – wartość. Oczywiście Mapy są generyczne – o typie kluczy jak i wartości decyduje programista, jest to kolejna cecha łącząca Mapy z resztą kolekcji.
Mapa jest bardzo przydatną strukturą, pozwala bardzo szybko pobrać z niej elementy, pod warunkiem że znasz odpowiedni klucz 😉
Klucze w Mapie są unikalne, jednak wartości w mapach mogą się powtarzać. W zależności od implementacji (HashMap oraz LinkedHashMap) możemy posiadać nulle jako klucz oraz wartość, natomiast w przypadku TreeMapy nulle są niedozwolone.
02. Implementacje
HashMap – Jest najpopularniejszą implementacją, podobnie jak HashSet, HashMapa nie zachowuje konkretnej kolejności.
Map<Integer, String> map = new HashMap<>(); map.put(10, "Arek"); map.put(2,"Zuza"); for (String value : map.values()) { System.out.println(value); }
Wynik:
Zuza Arek
LinkedHashMap – Jest analogiczna do LinkedHashSetu, zachowuje kolejność elementów w jakiej zostały one dodane.
Map<Integer, String> map = new LinkedHashMap<>(); map.put(10, "Arek"); map.put(2,"Zuza"); for (String value : map.values()) { System.out.println(value); }
Wynik:
Arek Zuza
TreeMap – Jest analogiczna do TreeSetu, wartość są posortowane według comparatora klucza. Możemy podać własny comparator podczas tworzenia mapy. Jeśli tego nie zrobimy, zostanie użyty domyślny comparator klucza.
Map<Integer, String> map = new TreeMap<>(); map.put(10, "Arek"); map.put(2,"Zuza"); map.put(8,"Klaudiusz"); for (String value : map.values()) { System.out.println(value); }
Wynik:
Zuza Klaudiusz Arek
03. Podstawowe operacje
Podstawowymi operacjami na Mapach są operacje put oraz get. Metoda put dodaje element do mapy w postaci klucz – wartość:
Map<Integer, String> map = new HashMap<>(); map.put(10, "Arek"); map.put(2,"Zuza"); map.put(8,"Klaudiusz");
Natomiast metoda get pozwala nam wyciągnąć daną wartość po konkretnym kluczu.
String value = map.get(2);
Jeśli chcemy przeszukać całą mapę, możemy pobrać wszystkie klucze jako Set:
Set<Integer> keySet = map.keySet();
wartości jako Collection:
Collection<String> values = map.values();
lub wszystkie elementy mapy w postaci klucz – wartość jako Set 😊
Set<Map.Entry<Integer, String>> entries = map.entrySet();
Dzięki takim pomocniczym metodą, możemy w łatwy sposób iterować po interesujących nas elementach, korzystamy przecież z dobrze nam znanych kolekcji 😊
04. Podsumowanie
Mapy są specyficzną strukturą danych. Umiejętne posługiwanie się mapami pozwoli oszczędzić nam naprawdę sporo mocy obliczeniowej w momencie gdy musimy wyszukiwać specyficzne elementy, dobrze przemyślana mapa może zdecydowanie przyspieszyć działanie naszego programu 😊