Jaka jest różnica między IdentityHashMap a HashMap + porównanie wydajności w Javie?

Opublikowany: 2021-10-19
różnica-pomiędzy-identityhashmap-a-hashmap-porównanie-wydajności

Jakiś czas temu mam specjalny przypadek, w którym muszę porównać klucz mapy oparty na equality operator (==) . Operator równości (==) porównuje odwołania (adresy w pamięci) dwóch kluczy jako dwie różne liczby.

Z drugiej strony, HashMap jest najczęściej używanym komponentem Java Collection Framework, który porównuje unikalność klucza za pomocą metody equals() .

Ponadto IdentityHashMap nie używa skrótu z object.hashCode() , ale używa System.identityHashCode(object) . Moglibyśmy użyć IdentityHashMap dla mutowalnych obiektów, których kod skrótu zmienia się w czasie wykonywania.

Jeśli chcesz dowiedzieć się więcej o equals() i == , które dotyczą on String Object , skorzystaj z tego samouczka: https://crunchify.com/how-to-override-equals-and-hashcode-method-in-java/.

Test podstawowy, który demonstruje powyższe zachowanie equals() i ==:

Wynik:

Zróbmy testy wydajności na obu mapach:

  1. Utwórz klasę Java: CrunchifyIdentityHashMapVsHashMapPerformance .java
  2. startCrunchifyTest()
    • Generuje rozmiar losowej mapy w milionach
    • Utwórz wystąpienie i crunchifyString[] Obiekt String Array z wygenerowaną powyżej liczbą losową z tekstem: This is Crunchify's Test # number
  3. crunchifyCompareIdentityHashMapVsHashMap(String[] crunchifyString , Map<String, Integer> crunchifyMap , String name )
    • Przekaż wszystkie wymagane parametry do tej metody
    • crunchifyMap będzie miał wartość IdentityHashMap / HashMap
    • Iteruj przez crunchifyString[] i wstawiaj wartości do Map — ta operacja zajmuje trochę czasu
    • Przejdź przez crunchifyString[] i pobierz wartości z Map — ta operacja zajmuje trochę czasu
    • Poznamy czas wykonania obu powyższych operacji, aby móc porównać, który jest lepszy dla powyższych operacji? IdentityHashMap LUB HashMap
    • Wydrukuj powyżej wynik
  4. Wykonaj powyższe zadania 2 i 3 łącznie 8 razy.

Wynik:

Obserwacja:

Jak widać tutaj w rezultacie, dla dużych map IdentityHashMap działa znacznie lepiej. Czemu? IdentityHashMap doesn't use equals() and hashcode() methods , które są uważane za bardzo kosztowne.

Tylko do Twojej wiadomości:

Powyższe operacje, które wykonujemy w celu umieszczania i pobierania wartości zi do Mapy, są bardzo obciążające procesor.

Test IdentityHashMap vs HashMap - użycie procesora