2010-08-29 14 views
8

Wie verhält sich ein TreeSet, HashSet oder LinkedHashSet, wenn die Objekte veränderbar sind? Ich kann mir nicht vorstellen, dass sie irgendwie funktionieren würden?Java-Sammlungen mit veränderbaren Objekten

Wenn ich ein Objekt ändern, nachdem ich es hinzugefügt habe; Wie ist das Verhalten der Liste?

Gibt es eine bessere Option, um mit einer Sammlung veränderbarer Objekte (die ich sortieren/indexieren/etc) anders als eine verknüpfte Liste oder ein Array umgehen und sie jedes Mal einfach durchlaufen muss?

Antwort

4

Die Set Schnittstelle behebt dieses Problem direkt: "Hinweis: Wenn veränderbare Objekte als Set-Elemente verwendet werden, muss sehr vorsichtig vorgegangen werden. Das Verhalten eines Sets wird nicht festgelegt, wenn der Wert eines Objekts beeinflusst wird Vergleiche, während das Objekt ein Element in der Menge ist. Ein Sonderfall dieses Verbots ist, dass es nicht zulässig ist, dass eine Menge sich selbst als Element enthält. "

Nachtrag:

Gibt es eine bessere Möglichkeit, mit einer Sammlung von veränderbaren Objekten für den Umgang?

Wenn Sie sich entscheiden, welche Sammlung Implementierung am besten geeignet ist, kann es sich lohnen, über die core collection interfaces zu schauen. Für Set Implementierungen insbesondere, solange equals() und hashCode() korrekt implementiert sind, können alle nicht verwandten Attribute veränderbar sein. In Analogie zu einer Datenbankbeziehung kann sich jedes Attribut ändern, aber der Primärschlüssel muss unantastbar sein.

1

Veränderbar ist nur ein Problem für die Sammlung, wenn sich der HashCode und das Verhalten der Vergleichsmethoden der Objekte nach dem Einfügen ändern.

Die Art, wie Sie damit umgehen könnten, ist, die Objekte aus der Sammlung zu entfernen und sie nach einer solchen Änderung wieder hinzuzufügen, so dass das Objekt.

Im Wesentlichen führt dies zu einem unveränderlichen Objekt aus der Sicht der Sammlungen.

Ein anderer weniger performanter Weg könnte sein, einen Satz zu behalten, der alle Objekte enthält, und einen TreeSet/HashSet zu erstellen, wenn der Satz sortiert oder indiziert werden soll. Dies ist keine echte Lösung für Situationen, in denen sich die Objekte ständig ändern und Sie gleichzeitig Kartenzugriff benötigen.

0

Der "beste" Weg, um mit dieser Situation fertig zu werden, besteht darin, zusätzliche Datenstrukturen für die Suche beizubehalten, ähnlich wie Indizes in einer Datenbank. Dann müssen alle Ihre Änderungen sicherstellen, dass die Indizes aktualisiert werden. Gute Beispiele wären Maps oder Multimaps - entfernen Sie vor einer Aktualisierung den Eintrag aus allen Indizes und fügen Sie sie nach einer Aktualisierung wieder mit den neuen Werten hinzu. Offensichtlich braucht dies Pflege mit Nebenläufigkeit etc.

Verwandte Themen