Frage Implementierungen von Java-Sammlungen (z. B. HashMaps vs HashSet vs HashTable ...), was kostet die Wahl des falschen? [geschlossen]


In meinem Code verwende ich standardmäßig ArrayList für alle Listen, HashMap für alle Maps, HashSet für alle Sets.

Aus praktischer Sicht, wie viel verliere ich an Flexibilität, Skalierbarkeit, Lesbarkeit und Leistung, indem ich die falsche Implementierung wähle? Wann ist es sinnvoll, Zeit zu investieren, um sich für einen zu entscheiden?

Ich sehe sicherlich einen sehr klaren Fall dafür, warum jemand unter bestimmten Umständen eine LinkedList anstelle einer ArrayList verwenden würde. Wann ist jemand der Meinung, dass es von entscheidender Bedeutung ist, dass er eine HashMap anstelle einer TreeMap oder HashTable verwendet? Was ist mit Sets?

Fragen:

  1. Was kostet die schlechte Wahl?
  2. Hat jemand eine Katastrophe Geschichten über die Wahl der falschen Implementierung und das Datacenter Feuer fangen?
  3. Irgendwelche guten Faustregeln?
  4. Gibt es obskure Inkasso-Implementierungen, ohne die Sie nicht leben können?

Ich habe gelesen:

ich fand Dies Frage aus einem theoretischen Blickwinkel zu beziehen, aber ich interessiere mich mehr für eine reale Welt, unten in den Schützengräben antworten.


6
2018-06-23 15:53


Ursprung


Antworten:


Das ist eine sehr allgemeine Frage, aber ich werde ein paar Gedanken werfen.

Wenn Sie auf Schnittstellen programmiert sind, wird die Flexibilität keinen großen Erfolg haben. Beispielsweise

void foo(List<E> list);

Die Kosten für eine schlechte Wahl können in Leistungsstrafen gesehen werden. Wenn Sie zum Beispiel eine LinkedList bei direktem Zugriff (wie in ArrayList) auswählen, ist das, wonach Sie suchen.

Sätze haben ein ähnliches Problem. Wenn Sie sortierte Sammlungen ohne Duplikate behalten möchten, wäre SortedSet eine klügere Wahl gegenüber einem HashSet. Im letzteren Fall müssten Sie das gesamte Set manuell sortieren (also einen Aufruf von Collections.sort ()).

<EDIT>

Wie für KartenEs gibt viele verschiedene Implementierungen. Jeder hat einen anderen Zweck. Zum Beispiel gibt es SortierteMap, analog zu SortedSet. Dann gibt es SchwacheHashMap, das funktioniert nicht wie eine HashMap in dem Sinne, dass Keys vom Garbage Collector entfernt werden können. Wie Sie sich vorstellen können, ist die Wahl zwischen einer HashMap und einer WeakHashMap nicht trivial. Wie immer, hängt davon ab, was Sie mit ihnen umsetzen möchten.

</EDIT>

Was die Story betrifft, haben wir in meinem aktuellen Projekt ein HashSet durch ein SortedSet ersetzt, da die Leistung beeinträchtigt wurde. DataCenter ist jedoch nicht in Brand geraten.

Meine zwei Cent.


7
2018-06-23 16:03



Solange du der guten OO - Praxis folgst abhängig von einem abstrakten Typ, Was macht es aus?

Wenn Sie zum Beispiel feststellen, dass Sie das falsche benutzt haben Map Sie ändern einfach die Implementierung, die Sie verwenden, und alle Ihre Abhängigkeiten sind aktiviert MapAlles funktioniert wie bisher nur mit den unterschiedlichen Leistungsmerkmalen.


1
2018-06-23 16:05



Ich denke, Sie können HashMap, HashSet und ArrayList als primäre Implementierungen verwenden. Wenn Sie einen sortierten Satz benötigen, ist es gut zu wissen, dass TreeSet verfügbar ist. Wenn du rekursive Dinge machst, ist es ähnlich, LinkedList in deiner Hosentasche zu haben. Aber Programm zu Schnittstellen und dann können Sie die Implementierungen nach Bedarf austauschen. Und wenn die gleiche Sammlung wie zum Beispiel eine LinkedList und eine ArrayList verarbeitet werden muss, ist es keine große Sache, eine von der anderen zu konstruieren.

Arbeiten Sie mit den Standardimplementierungen, die Sie aufgelistet haben. Wenn es Leistungsprobleme gibt und Grund zu der Annahme besteht, dass eine alternative Implementierung besser wäre, tauschen Sie sie aus - und messen Sie den Unterschied. Wenn Sie spezielles Verhalten benötigen (z. B. sortierte Sätze), verwenden Sie die speziellen Klassen.

Dieser Ansatz hat mich noch nicht verbrannt.


1
2018-06-23 18:14