Deep Copy LinkedHashMap

leon_20v

Aktives Mitglied
Hallo Leute,

ich hab glaub ein copy Problem. Da es performant bleiben soll will ich eigentlich ein Deep Copy vermeiden.

Ich hab eine Data Klasse und eine Buffer Klasse. Die Bufferklasse soll Segmente aus der Dataklasse Buffern und später wegspeichern.

Hier mal unvollständiger Code:
Java:
public class Data{

LinkedHashmap <JDouble, DataEntry> myMap;
Bufferklasse m_bufferklasse;

Data(){
myMap = new LinkedHashmap<JDouble, DataEntry>;
m_bufferklasse = new Bufferklasse();

myMap.put......
}


// später
public void writeToBuffer(){

m_bufferklasse.write(myMap);

// erzeuge neue Map, ### ich glaub hier liegt der fehler bzw. beim copy nacher
myMap = new LinkedHashmap<JDouble, DataEntry>;

// myMap wird dann wieder mit neuen Daten befüllt.
}

}


public class Bufferklasse{

LinkedHashmap<Integer, LinkedHashmap<JDouble, DataEntry> > m_buffer = new .....

public void write( LinkedHashmap<JDouble, DataEntry> myMap, int segment){

// muss ich hier wirklich ein deep copy machen? D.h auch alle DataEntry müssen eigentlich kopiert werden.
m_buffer.put(segment, myMap);

}

}

Das Problem ist jetzt, das ich im m_buffer zwar gleich viele Werte wie oben habe, aber irgendwie passen die Werte nicht mehr. Wenn ich die Werte nicht wegbuffer sondern in der map in Data lasse, dann passen die werte.

der grund warum ich das mache ist, wenn der Buffer voll ist, werden die Segmente serialisiert und auf die Platte gespeichert.

Irgendwas ist hier in dem Java einfach komisch.
 
Zuletzt bearbeitet:

Joose

Top Contributor
Wenn du uns noch als Beispiel sagen könntest was an den Werten nicht passt kann man dir vielleicht besser helfen. Ist die Reihenfolge falsch? Sind die Werte grundsätzlich falsch? Wird immer die gleiche Liste/Map gespeichert/gebuffered?

Das Erstellen einer neuen LinkedHashmap in "writeToBuffer" passt schon, du erzeugst einfach eine neue Liste, die Referenz auf die bisherige Liste geht verloren (bzw. die Bufferklasse referenziert nun auf diese).

Nein die Bufferklasse muss sich die Daten nicht kopieren. Es reicht die LinkedHashmap zu referenzieren (was du eh schon machst).

Ich kann hier kein Problem erkennen, aber es sind auch nur Codestücke und es wird nicht gezeigt wie die LinkedHashmap befüllt wird
 

leon_20v

Aktives Mitglied
Hallo,

das Problem war, das ich eine eigene Double Klasse geschrieben habe. Wenn ich hier dann meine Objekte verglichen habe, dann hat er die Werte in der Map nicht gefunden

new EignesDouble(5) != new EigenesDouble(5) --> False

Ich hab jetzt alles auf normales Double umgebaut, jetzt klappt zumindest der Zugriff.




Aktuell bin ich am Serialisieren der Hashmap, was für ein Käse, da die Values der Hashmap auch Objekte mit mehreren Values sind.
 

Joose

Top Contributor
new EignesDouble(5) != new EigenesDouble(5) --> False

Das funktioniert auch nicht, da es sich hierbei um 2 unterschiedliche Objekte handelt. Beide Objekte repräsentieren/speichern die gleichen Daten, aber es sind trotzdem 2 unterschiedliche Objekte.

Mit == bzw. != überprüfst du die Gleichheit der Objekte nicht deren Inhalt. Um den Inhalt von 2 Objekten zu vergleichen musst du "equals()" verwenden. (und in diesem Fall in deiner eigenen Double Klasse die Methode equals überschreiben.
 

leon_20v

Aktives Mitglied
Vielen 'Dank für deine Antwort, das habe ich auch schon ergoogeln können.

Aktuell hab ich die Map einfach auf Normales Double umgewandelt und lass mir bei meiner Doubleklasse immer die Value geben wenn ich auf die Map zugreife. Bei StandardWrapperklassen wie Double funktioniert es irgendwie durch Autoboxing. Wenn ich Zeit habe werde ich es wieder zurückbauen und equals überschreiben. Ich denke das ist die elegantere und schnellere Lösung wie dieses boxing geschichte
 

leon_20v

Aktives Mitglied
So ich hab jetzt doch den Fall, das ich wieder auf meine "EigeneDouble" Klasse umbauen muss.



Da ich jetzt des Java erst 3 Wochen mache, bin ich mir da noch bissl unsicher und google hat mich jetzt ned so befriedigt.


Wenn ich jetzt in meiner Klasse die "equals()" überschreibe, wie mache ich es denn am besten, dass meine Map "Double", "double" und "EigeneKlasse" versteht? Nen Typecast möchte ich wegen der Performance vermeiden, da sehr sehr sehr oft Daten aus der Map gelesen werden. (Eigentlich durchgehend).


Vielen Dank.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Deep & Shallow Copy Allgemeine Java-Themen 2
windl Text mining / deep learning Allgemeine Java-Themen 0
B Quellcode einer Java libary finden um zu copy & paste'n Allgemeine Java-Themen 5
llabusch Cut, Copy & Paste Symbole Allgemeine Java-Themen 2
H Copy Paste implementieren ausserhalb des Programms? Allgemeine Java-Themen 2
K Copy/Paste klappt nicht einwandfrei Allgemeine Java-Themen 15
E Eingabeprüfung JTextField. Fehler bei Copy-Paste Allgemeine Java-Themen 4
X Copy Constructor in Java ? Allgemeine Java-Themen 7
D java.util.ConcurrentModificationException - per Copy vermeiden Allgemeine Java-Themen 11
Daniel_L Bug in Copy-Funktion bei HTML-Editorpane? Allgemeine Java-Themen 4
P [SWT] Copy, Paste und Cut abfangen Allgemeine Java-Themen 6
X Wann ist Runtime.getRuntime().exec mit Copy fertig? Allgemeine Java-Themen 10
P Copy-Constructor aufrufen - Wie ??? Allgemeine Java-Themen 3
A copy Allgemeine Java-Themen 4
T Anti-Kommerzielle Lizenz mit Copy-Left? Allgemeine Java-Themen 58
L Copy&Paste Allgemeine Java-Themen 2
U JEditorPane & copy'n'paste Allgemeine Java-Themen 34
G Copy Allgemeine Java-Themen 2
A Zusammenfassen von zwei Dateien (wie beim DOS-Befehl copy) Allgemeine Java-Themen 6
V Objekt aus Session als copy by value bekommen Allgemeine Java-Themen 4
P Copy mit Runtime.exec() unter Unix Allgemeine Java-Themen 4
N Nochmal Clipboard. cut copy paste Allgemeine Java-Themen 2
N Struct oder Record? Und COPY in und aus Zwischenablage Allgemeine Java-Themen 2
F JTree: Nodes dynamisch anlegen via LinkedHashMap Allgemeine Java-Themen 2
F ArrayList schneller als LinkedHashMap? Allgemeine Java-Themen 8

Ähnliche Java Themen


Oben