2016-02-27 17 views
6

Rozumiem, HashSet na podstawie HashMap, ponieważ są one bardzo podobne. Dzięki temu kod staje się bardziej elastyczny i minimalizuje nakłady na wdrożenie. Jednak jedna zmienna referencyjna w HashSet's Entry wydaje mi się niepotrzebna, jeśli klasa zabrania elementu null, dlatego cały wpis nie ma sensu. Pomimo tego, Entry zajmuje 24-bajtową pamięć/element, podczas gdy pojedyncza tablica z elementami zestawu zajmuje tylko 4 bajty/element, jeśli moje dane są poprawne. (poza nagłówkiem tablicy)Wydajność Java HashSet

Jeśli mój argument jest poprawny, czy zalety naprawdę nadwątlają ten wynik?

(jeśli się mylę, chciałbym dowiedzieć się od niego aswell)

+1

Pojedyncza tablica nie byłaby HashSet. W jaki sposób miałbyś O (1) zawiera() z prostą tablicą? –

+2

Atestowanie liniowe @JBNizet (lub ogólnie otwarte adresowanie) działa tylko z jedną tablicą. Ciekawi mnie także decyzja dotycząca projektu, ale nie jestem pewien, czy znajdziemy tu autora raportu ;-) –

+1

@JBNizet Możesz łatwo zaimplementować kilka rodzajów tablic haszujących w tablicy, np. Kukułkę, linijkę itp. ... EDIT: linear nie ma O (1) zawiera(), ale kukułka ma –

Odpowiedz

1

Choć jest oparta przede wszystkim opinia-to pytanie, będę podsumować kilka punktów na temat:

  • HashSet pojawił w Javie 1.2 wiele lat temu. Trudno zgadnąć, jakie są teraz powody decyzji projektowych podjętych w tamtych czasach, ale wyraźnie Java nie była używana w aplikacjach o dużych obciążeniach; wydajność odgrywała mniejszą rolę niż prostota.
  • Masz rację, że HashSet jest nieoptymalny pod względem zużycia pamięci. Problem jest znany, błąd JDK-6624565 jest zarejestrowany, a dyskusje pod numerem core-libs-dev odbywają się od czasu do czasu. Ale czy jest to blokowanie wielu aplikacji w świecie rzeczywistym? Prawdopodobnie nie.
  • W przypadku rzadkich aplikacji, w których użycie pamięci jest niedozwolone, istnieją już dobre alternatywy, takie jak THashSet.
  • Należy zauważyć, że algorytmy otwierania adresów mają swoje wady, np. znaczna degradacja wydajności przy współczynnikach obciążenia bliskiej 1; trudności z usuwaniem elementów. Zobacz related answer.