2016-02-27 12 views
6

Ich verstehe HashSet basierend auf HashMap, da sie ziemlich ähnlich sind. Es macht den Code flexibler und minimiert den Implementierungsaufwand. Allerdings scheint eine Referenzvariable im HashSet Entry für mich unnötig zu sein, wenn die Klasse null Element verbietet, daher macht der ganze Eintrag keinen Sinn. Trotz dieser Tatsache nimmt ein Entry 24 Byte Speicher/Element, während ein einzelnes Array mit den Elementen des Satzes nur 4 Byte/Element nehmen würde, wenn meine Zahlen korrekt sind. (abgesehen von der Kopfzeile des Arrays)Java HashSet Leistung

Wenn mein Argument richtig ist, sind die Vorteile wirklich übergewichtig diese Leistung?

(wenn ich falsch bin, ich von ihm als gut lernen würde)

+1

Ein einzelnes Array wäre kein HashSet. Wie hättest du O (1) contains() mit einem einfachen Array? –

+2

@JBNizet lineares Sondieren (oder allgemein offene Adressierung) funktioniert mit nur einem einzigen Array. Ich bin auch neugierig, was die Designentscheidung war, aber ich bin nicht sicher, ob wir den Autor hier finden, um zu berichten ;-) –

+1

@JBNizet Sie können leicht verschiedene Arten von Hashtabellen in einem Array implementieren, dh Kuckuck, linear, etc ... EDIT: linear hat nicht O (1) enthält(), aber Kuckuck tut –

Antwort

1

Obwohl diese Frage in erster Linie Meinungs basiert, werde ich ein paar Punkte zum Thema zusammenfassen:

  • HashSet erschienen in Java 1.2 vor vielen Jahren. Es ist schwer zu erraten, welche Gründe für Designentscheidungen zu dieser Zeit getroffen wurden, aber Java wurde nicht für Hochlastanwendungen verwendet. Leistung spielte weniger Rolle als Einfachheit.
  • Sie haben Recht, dass HashSet in seinem Speicherverbrauch suboptimal ist. Das Problem ist bekannt, der Fehler JDK-6624565 ist registriert, und Diskussionen werden von Zeit zu Zeit unter core-libs-dev gehalten. Aber ist dies ein Blocker für viele reale Anwendungen? Wahrscheinlich nein.
  • Für die ungewöhnlichen Anwendungen, wo HashSet Speicherverbrauch inakzeptabel ist, gibt es bereits gute Alternativen, wie Trove THashSet.
  • Beachten Sie, dass offene Adressierungsalgorithmen ihre Nachteile haben, z. signifikante Leistungsverschlechterung mit Lastfaktoren nahe 1; Elemententfernungsschwierigkeiten. Siehe die related answer.