Mapy w Javie
W Javie mapy są strukturami danych, które wiążą klucze z wartościami, umożliwiając efektywne przechowywanie, dostęp do, aktualizowanie i usuwanie par klucz-wartość. W przeciwieństwie do kolekcji, które przechowują wyłącznie elementy, mapy utrzymują relację odwzorowania, w której każdy klucz jest unikalny i wskazuje dokładnie jedną wartość, chociaż wiele kluczy może mieć tę samą wartość.
Interfejs Map udostępnia mechanizmy pobierania wartości za pomocą unikalnych (niepowtarzających się) kluczy. Udostępnia również trzy widoki kolekcji, które pozwalają manipulować zawartością mapy na różne sposoby: jako zbiorem kluczy, kolekcją wartości lub zbiorem odwzorowań między kluczami a wartościami. Głównym interfejsem pochodnym od Map jest SortedMap, reprezentujący uporządkowane mapy, oraz jego podinterfejs NavigableMap. Map jest szeroko wykorzystywany przez klasy biblioteki standardowej. Główne klasy implementujące interfejs Map dla map nieprzeznaczonych do współbieżnego dostępu to HashMap, LinkedHashMap i TreeMap. W przypadku map współbieżnych głównymi klasami są ConcurrentHashMap i ConcurrentSkipListMap.
Poniżej przedstawiono fragment definicji interfejsu Map, zawierający tylko najważniejsze metody:
public interface Map<K,V>{
// Query Operations
int size();
boolean isEmpty();
boolean containsKey(Object key);
boolean containsValue(Object value);
V get(Object key);
// Modification Operations
V put(K key, V value);
V remove(Object key);
void putAll(Map<? extends K, ? extends V> m);
void clear();
// Views
Set<K> keySet();
Collection<V> values();
Set<Map.Entry<K, V>> entrySet();
// Definition of the Entry interface
interface Entry<K, V> {
// Body omitted
}
// (continues...)
}
Poniższy przykład przedstawia mapę samochodów, w której kluczami są tablice rejestracyjne, a wartościami nazwy odpowiednich modeli samochodów. Za pomocą tej mapy możemy na przykład sprawdzić, czy określony element istnieje, używając klucza jako argumentu metody containsKey. Ponadto metoda get zwraca wartość powiązaną z kluczem przekazanym jako argument, a metoda remove usuwa wpis z mapy:
void main() {
Map<String, String> cars = new HashMap<>();
cars.put("ABCD2935", "Tesla Model S");
cars.put("YJKF9353", "Toyota Corolla");
cars.put("WFLO1304", "Honda CRV");
var key = "ABCD2935";
if (cars.containsKey(key)){
IO.println("Vehicle data:");
IO.println(cars.get(key));
IO.println("Removing the vehicle...");
cars.remove(key);
} else
IO.println("Vehicle not found!");
}
Oprócz opisanych powyżej metod istnieje również kilka metod default, które zapewniają dodatkową funkcjonalność.
Interfejs udostępnia także metody służące do tworzenia niezmiennych map z podanych wartości (of i ofEntries wraz z metodą pomocniczą entry) lub z istniejącej mapy (copyOf).
Rysunek 1 przedstawia interfejs Map oraz jego najważniejsze podinterfejsy. Bezpośrednimi podinterfejsami Map są SequencedMap, Bindings i ConcurrentMap. Pośrednio od Map pochodzą również SortedMap, NavigableMap i ConcurrentNavigableMap (ten ostatni jest ponadto podinterfejsem ConcurrentMap).

Do najważniejszych potomków Map należą interfejsy SortedMap i NavigableMap.
Interfejs SortedMap jest rozszerzeniem interfejsu SequencedMap i reprezentuje mapy, które utrzymują swoje klucze w określonej kolejności, zgodnie z naturalnym porządkiem kluczy lub określonym obiektem Comparator podanym podczas tworzenia mapy. Jego jedyny bezpośredni podinterfejs w ramach Collections Framework, NavigableMap, dodaje metody do zaawansowanych operacji nawigacyjnych, na przykład do znajdowania klucza najbliższego określonej wartości lub przechodzenia przez mapę w kolejności rosnącej albo malejącej.
W praktyce często używamy NavigableMap zamiast SortedMap, ponieważ obie klasy implementujące SortedMap w Collections Framework robią to pośrednio (TreeMap implementuje NavigableMap, a ConcurrentSkipListMap implementuje ConcurrentNavigableMap). NavigableMap oferuje nieco większy zakres funkcjonalności i udostępnia specjalne metody nawigacji po mapie, podobnie jak NavigableSet w przypadku zbiorów.
Ten artykuł jest adaptacją treści z książki Orientação a Objetos com Java autorstwa Eduardo Kessler Piveta