2013-04-29 12 views
11

Czytałem/badałem powód, dla którego HashMap jest szybszy niż HashSet.Dlaczego HashMap jest szybszy niż HashSet?

nie jestem całkiem rozumiejąc następujące oświadczenia:

  1. HashMap jest szybszy niż HashSet ponieważ wartości te są powiązane z unikalnym kluczem.

  2. W obiekcie HashSet obiekt członkowski służy do obliczania wartości hashcode, która może być taka sama dla dwóch obiektów, więc do sprawdzenia równości wykorzystywana jest metoda equals(). Jeśli zwróci false, oznacza to, że dwa obiekty są różne. W HashMap wartość kodu haszującego jest obliczana przy użyciu obiektu klucza.

  3. Wartość hashcode HashMap jest obliczana przy użyciu obiektu klucza. W tym przypadku obiekt członkowski służy do obliczania kodu skrótu, który może być taki sam dla dwóch obiektów, więc metoda jest używana do sprawdzenia równości. Jeśli zwróci false, oznacza to, że dwa obiekty są różne.

Kończąc moje pytanie:

  1. Myślałem HashMap i HashSet obliczyć hashcode w ten sam sposób. Dlaczego oni są inni?

  2. Czy możesz podać konkretny przykład, w jaki sposób w inny sposób oblicza się kod hashowy na HashSet i HashMap?

  3. Wiem, co to jest "kluczowy obiekt", ale co to znaczy "obiekt członkowski"?

  4. HashMap może zrobić to samo, co HashSet i szybsze. Dlaczego potrzebujemy HashSet? Przykład:

    HashMap <Object1, Boolean>= new HashMap<Object1, boolean>(); 
    map.put("obj1",true); => exist 
    map.get("obj1"); =>if null = not exist, else exist 
    
+3

Powinieneś przeczytać o różnicy między 'Map' i' Set'. Są to dwa różne rodzaje "kolekcji". Gdy to zrobisz, powinno być jasne, dlaczego pobranie określonego obiektu z mapy jest szybsze niż ze zbioru. – Magnilex

+0

Hashset jest zbudowany na HashMap. A zestaw służy do unikalności. To nie jest zbiór kluczy wartości klucza. –

+0

Tak. Wiem, że implementują inny interfejs. Ale niektórzy ludzie mówią, że hashset używa hashmap w backend. Jeśli to prawda, dlaczego hashset będzie wolniejszy niż hashmap? – runcode

Odpowiedz

18

Wydajność:

Jeśli spojrzeć na kodzie źródłowym HashSet (przynajmniej JDK 6, 7 i 8), używa HashMap wewnętrznie, a więc w zasadzie robi dokładnie co robisz z przykładowym kodem.

Więc jeśli potrzebujesz wdrażania określony, należy użyć HashSet, jeśli trzeba mapa - HashMap. Kod używający HashMap zamiast HashSet będzie miał dokładnie taką samą wydajność jak użycie HashSet bezpośrednio.

Wybór prawa poboru

- mapy klucze do wartości (asocjacyjna) - http://en.wikipedia.org/wiki/Associative_array.

Zestaw - kolekcja, która nie zawiera powielonych elementów - http://en.wikipedia.org/wiki/Set_(computer_science).

Jeśli jedyną rzeczą, którą musisz swoją kolekcję na to, by sprawdzić, czy element jest obecny w nie - użyj Set.Twój kod będzie czystszy i zrozumiały dla innych.

Jeśli chcesz przechowywać niektóre dane dla swoich elementów - użyj mapy.

+2

Co denis powiedział. Możesz też zawinąć dowolną mapę za pomocą zestawu Collections.newSetFromMap. –

0

Żadna z tych odpowiedzi naprawdę nie wyjaśnia, dlaczego HashMap jest szybszy niż HashSet. Oba muszą obliczyć hashcode, ale pomyśl o naturze klucza HashMap - zazwyczaj jest to prosty ciąg lub nawet liczba. Obliczanie tego kodu jest znacznie szybsze niż domyślne obliczenie kodu kreskowego całego obiektu. Jeśli kluczem HashMap był ten sam obiekt, który przechowywany był w HashSet, nie byłoby rzeczywistej różnicy w wydajności. Różnica polega na tym, jakiego rodzaju obiektem jest klucz HashMap.

Powiązane problemy