Java-Sammlungen mit veränderbaren Objekten

8

Wie verhält sich TreeSet, HashSet oder LinkedHashSet, wenn die Objekte änderbar sind? Ich kann mir nicht vorstellen, dass sie irgendwie funktionieren würden?

Wenn ich ein Objekt ändere, 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?

    
laurencer 29.08.2010, 06:19
quelle

3 Antworten

4

Die Set -Schnittstelle spricht dieses Problem direkt an: " Hinweis: Wenn veränderbare Objekte als Mengenelemente verwendet werden, muss sehr vorsichtig vorgegangen werden.Das Verhalten einer Menge wird nicht angegeben, wenn der Wert eines Objekts so geändert wird, dass Gleichheitsvergleiche ausgeführt werden, während das Objekt ein Element in der Menge ist Sonderfall dieses Verbotes ist, dass es nicht zulässig ist, dass eine Menge sich selbst als Element enthält. "

Nachtrag:

  

Gibt es eine bessere Option für den Umgang mit einer Sammlung veränderbarer Objekte?

Bei der Entscheidung, welche Collection-Implementierung am besten geeignet ist, lohnt es sich, Kernsammlungsschnittstellen . Für Set Implementierungen, 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.

    
trashgod 29.08.2010, 06:42
quelle
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önnen, besteht darin, die Objekte aus der Sammlung zu entfernen und sie nach einer solchen Änderung wieder hinzuzufügen, so dass das Objekt.

Daraus ergibt sich im Grunde genommen ein aus der Sicht der Sammlungen unveränderbares Objekt.

Ein anderer, weniger leistungsfähiger Weg könnte darin bestehen, ein Set zu behalten, das alle Objekte enthält, und ein TreeSet / HashSet zu erstellen, wenn das Set 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.

    
rsp 29.08.2010 06:39
quelle
0

Der beste Weg, um mit dieser Situation fertig zu werden, besteht darin, zusätzliche Datenstrukturen für die Suche beizubehalten, ähnlich den 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 Sorgfalt mit Nebenläufigkeit usw.

    
rjw 29.08.2010 10:19
quelle

Tags und Links