Ich beschloss, eine einfach verknüpfte Liste zu schreiben, und plante, die interne verknüpfte Knotenstruktur unveränderlich zu machen.
Ich bin allerdings auf einen Haken gestoßen. Angenommen, ich habe die folgenden verknüpften Knoten (aus früheren add
Vorgängen):
1 -> 2 -> 3 -> 4
und sagen, ich möchte eine anhängen 5
.
Da der Knoten 4
unveränderlich ist, muss ich dazu eine neue Kopie von erstellen 4
, aber sein next
Feld durch einen neuen Knoten ersetzen, der a enthält 5
. Das Problem ist jetzt, 3
auf das alte zu verweisen 4
; der ohne das angehängte 5
. Jetzt muss ich kopieren 3
und das next
Feld ersetzen, um auf die 4
Kopie zu verweisen , aber jetzt 2
wird auf die alte 3
...
Mit anderen Worten, um einen Anhang zu erstellen, muss anscheinend die gesamte Liste kopiert werden.
Meine Fragen:
Ist mein Denken richtig? Gibt es eine Möglichkeit zum Anhängen, ohne die gesamte Struktur zu kopieren?
Anscheinend enthält "Effective Java" die Empfehlung:
Klassen sollten unveränderlich sein, es sei denn, es gibt einen sehr guten Grund, sie veränderlich zu machen ...
Ist dies ein guter Grund für die Wandlungsfähigkeit?
Ich denke nicht, dass dies ein Duplikat der vorgeschlagenen Antwort ist, da ich nicht über die Liste selbst spreche. das muss natürlich veränderbar sein, um mit der Schnittstelle übereinzustimmen (ohne die neue Liste intern zu behalten und über einen Getter abzurufen. Auf den zweiten Blick würde dies jedoch eine gewisse Veränderung erfordern; es würde nur auf ein Minimum beschränkt sein). Ich spreche darüber, ob die Interna der Liste unveränderlich sein müssen oder nicht.
CopyOnWritexxx
Klassen, die für Multithreading verwendet werden. Niemand erwartet, dass Sammlungen wirklich unveränderlich sind (obwohl es einige Macken schafft)