Java i mapy

0

Witam,

Ostatio czytałem na temat Map w Javie i chciałem przetestować działanie różnych implementacji. W skrócie:

HashMap - nie gwarantuje kolejności elementów
TreeMap - sortuje według komparatora
LinkedHashMap - dane są przechowywane w takiej samej kolejności w jakiej je dodano

Pozwoliłem sobie to sprawdzić i napisałem krótki kod:

	public static void main(String[] args) {
		Map<Integer, String> hashMap = new HashMap<>();
		Map<Integer, String> treeMap = new TreeMap<>();
		Map<Integer, String> linkedHashMap = new LinkedHashMap<>();
		
		insertToMap(hashMap);
		insertToMap(treeMap);
		insertToMap(linkedHashMap);
		
		showContent(hashMap);
		showContent(treeMap);
		showContent(linkedHashMap);
	}

	private static void showContent(Map<Integer, String> map) {
		System.out.println("\n" + map.getClass().getName());
		
		for(Map.Entry<Integer, String> entry : map.entrySet()) {
			System.out.println( entry.getKey() + " " + entry.getValue());
		}
	}
	
	private static void insertToMap(Map<Integer, String> map) {
		map.put(2, "Dwa");
		map.put(3, "trzy");
		map.put(9, "dziesiec");
		map.put(1, "jeden");
		map.put(7, "siedem");
		map.put(8, "osiem");
		map.put(5, "piec");
	}

i wynik:

java.util.HashMap
1 jeden
2 Dwa
3 trzy
5 piec
7 siedem
8 osiem
9 dziesiec

java.util.TreeMap
1 jeden
2 Dwa
3 trzy
5 piec
7 siedem
8 osiem
9 dziesiec

java.util.LinkedHashMap
2 Dwa
3 trzy
9 dziesiec
1 jeden
7 siedem
8 osiem

Według LinkedHashMap i TreeMap wszystko wygląda dobrze, ale zastanawia mnie dlaczego w HashMap zawartośc jest posortowana względem klucza, skoro tutaj nie ma żadnej gwarancji że tak będzie?

0

Bo jest to przypadek.

0

Odpaliem ten kod w pętli x100 i mam x100 przypadków :)

4

HashMap oblicza hashCode dla każdego klucza i umieszcza wartość pod wskazanym indeksem w wewnętrznej tablicy. EntrySet iteruje prawdopodobnie od początku do końca tej tablicy.

Akurat tak się składa, że w wypadku gdy kluczami są Integery to hashCode jest taki jak wartość danego integera.

Wpływ ma też tutaj capacity i load factor mapy, ale w swoim śmiesznym przypadku masz tak mało elementów i tak małe wartości integerów, że tego nie doświadczasz.

Użyj kluczy typu 1_000_000 i dopiero zobacz.

0
nie100sowny napisał(a):

HashMapa oblicza hash dla każdego klucza i umieszcza pod wskazanym indeksem w wewnętrznej tablicy.

Akurat tak się składa, że w wy[adku gdy kluczami są integery to kolejność jest rosnąca.

Dzięki za wszystkie odpowiedz. Spróbuje z innym typem i dam znać.

2
vakil napisał(a):

Odpaliem ten kod w pętli x100 i mam x100 przypadków :)

No ale nie wiem, czego oczekujesz. Jeżeli dokumentacja mówi, że nie ma gwarancji, to nie ma i nie powinieneś na tym polegać. Równie dobrze ktoś inny dostanie zupełnie inne wyniki, albo pod spodem jest to zaklepane tak, że trzyma kolejność, ale w następnej wersji to zmienią. Nie ma gwarancji, to nie ma, jak chcesz mieć pewność, co się dzieje pod spodem, to zdekompiluj lub podejrzyj źródła.

1 użytkowników online, w tym zalogowanych: 0, gości: 1