Object mit clone kopieren

Generic1

Top Contributor
Hallo,

mir ist folgender Code nicht gnaz klar, ich kopiere eine Hashtable mit clone() und es wird eine Shallow- Copy gemacht -> das heißt für mich, dass nur die Referenz auf die Hashtable kopiert wird nicht aber deren Inhalt -> aber es wird anscheinend doch das ganze Objekt gekloned, also ein deep copy gemacht?
Kann da jemand was dazu sagen.


Java:
package dictionarytest;

import java.util.Hashtable;

public class Main {

    public Main() {
        final Hashtable dictionary = new Hashtable();
        dictionary.put("key1", "value1");
        dictionary.put("key2", "value2");
        dictionary.put("key3", "value3");
        dictionary.put("key4", "value4");
        dictionary.put("key5", "value5");
        dictionary.put("key6", "value6");
        System.out.println("Dictionary: " + dictionary);
        
        final Hashtable newHashtable = (Hashtable)dictionary.clone();
        newHashtable.put("key1", "valueNeu");
        System.out.println("dictionary: " + dictionary + ", newHashtable:" + newHashtable);
        }

    public static void main(String[] args) {
        final Main main = new Main();
        }
}
 
Zuletzt bearbeitet:
G

Gast2

Gast
Die Referenzen der Einträge werden ebenfalls kopiert.
Wenn du allerdings einen eintrag in dictionary änderst, ändert sich der selbe Eintrag in newHashTable. Daher ist das keine deep copy.
 
S

SlaterB

Gast
ob clone() für die Keys und Werte "key1" und Co. echte Kopien erstellt oder die Originalobjekte wiederverwendet, wäre für das Beispiel irrelevant,
dass mindestens die Map neu erstellt wird, kann man doch erwarten,
also wird nach neuer Value-Zuordnung garantiert die Ausgabe kommen wie sie kommt

alles andere wäre ja
> final Hashtable newHashtable = dictionary;
statt
> final Hashtable newHashtable = (Hashtable)dictionary.clone();
dafür brauchts keine clone()-Methode..
 

Generic1

Top Contributor
Eben nicht, probiers mal aus, es kommt folgendes raus:

Code:
Dictionary: {key6=value6, key5=value5, key4=value4, key3=value3, key2=value2, key1=value1}
dictionary: {key6=value6, key5=value5, key4=value4, key3=value3, key2=value2, key1=value1}, newHashtable:{key6=value6, key5=value5, key4=value4, key3=value3, key2=value2, key1=valueNeu}

Nö, verstehs jetzt ehrlich gesagt nicht. Wenn ich clone() mache, dann hab ich meiner Meinung nach 2 Referenzen auf die Hashtable und ob ich mit der einen oder der anderen referenz einen value über einen key ändere müsste ja egal sein, oder?
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Schau Dir doch die Implementierung von clone() in der Hashtable an:
Es wird eine neue Hashtable erzeugt in die geklonte Entries (ebenfalls neu erzeugt) eingefügt werden.
Einzig das Schlüssel-Werte-Paar bleibt erhalten.
Es wird alse eine Art middle-deep-copy gemacht ;-)
 

Michael...

Top Contributor
Zur Veranschaulichung:
Java:
final Hashtable<String, JLabel> origTable = new Hashtable<String, JLabel>();
origTable.put("k1", new JLabel("original"));
origTable.put("k2", new JLabel());
System.out.println("Dictionary key1: " + origTable.get("k1").getText());

final Hashtable<String, JLabel> cloneTable = (Hashtable<String, JLabel>) origTable.clone();
cloneTable.get("k1").setText("ueberschrieben");
System.out.println("Original key1: " + origTable.get("k1").getText());
System.out.println("Clone key1   : " + cloneTable.get("k1").getText());
 
S

SlaterB

Gast
immer gerne angemerkt: nie (Hashtable<String, JLabel>) schreiben, generisch sicher ist das sowieso nicht, (Hashtable) reicht
 

Generic1

Top Contributor
OK, ich nehme es zur Kenntnis, dass es so funktioniert mit JLabel, mit Strings ist das wahrscheinlich ein bisschen anders gelagert, da Strings immutable sind:

Java:
final Hashtable<String, String> origTable = new Hashtable<String, String>();
        origTable.put("k1", new String("original1"));
        origTable.put("k2", new String("original2"));
        System.out.println("Dictionary key1: " + origTable.get("k1"));
        
        final Hashtable<String, String> cloneTable = (Hashtable<String, String>) origTable.clone();
        cloneTable.put("k1", "ueberschrieben");
        System.out.println("Original key1: " + origTable.get("k1"));
        System.out.println("Clone key1   : " + cloneTable.get("k1"));

Man kann also sagen, dass mit einer Hashtable, die nur Strings enthält, eine komplette Deep Copy erzeugt wird!?
 

Michael...

Top Contributor
Man kann also sagen, dass mit einer Hashtable, die nur Strings enthält, eine komplette Deep Copy erzeugt wird!?
Von deep copy würde ich da nicht sprechen. Mit Strings ist das so ne Sache, quasi halb Objekt halb primitiv, auf jeden Fall immutable - wie Du schon angemerkt hast. D.h. Du kannst das "Stringobjekt" in Deiner Hashtable nicht mehr ändern, aber Du kannst - wie in Deinem Codebeispiel - einen neuen String in die geklonte Hashtable stecken. Da die geklonte Hashtable inkl. deren Entries neu erzeugte Objekte sind und der eingefügte String ein neues "Objekt" ist, wirkt sich das nicht auf die originale Hashtable aus.
 
S

SlaterB

Gast
noch ne allgemeine Weisheit: nie new String() schreiben!

und zum JLabel-Beispiel:
wenn du da ein neues JLaben einfügen würdest
cloneTable.put("k2", new JLabel("other"));
dann wäre der Inhalt wieder unterschiedlich

aber es besteht schon ein Unterschied zu String, eben dass man das JLabel (beibehalten und) ändern kann, einen String ist unveränderbar
 

VfL_Freak

Top Contributor
Moin,

weil "bla" schon einen String erzeugt. und new String("bla") erzeugt aus dem neu erzeugten String einen neuen String

verstehe - Danke.
Ist in meinem Fall eh' nur eine Membervariable einer (älteren) Klasse, die mit "private String m_Text = null;" angelegt wird und nach dem "new String()" aus verschiedenen anderen Klassen heraus mit get- und set-Methoden gefükllt wird.

Hier wäre es wohl sinniger, die Deklaration auf "private String m_Text = "";" umzustellen, oder ??

gruß
Klaus
 

Der Müde Joe

Top Contributor
>"new String()" aus verschiedenen anderen Klassen heraus mit get- und set-Methoden gefükllt wird.

Verstehe ich nicht?

Umstellen? m_Text gefällt mir nicht aber sonst..?

EDIT:
Java:
    /**
     * Initializes a newly created {@code String} object so that it represents
     * an empty character sequence.  Note that use of this constructor is
     * unnecessary since Strings are immutable.
     */
    public String() {
	this.offset = 0;
	this.count = 0;
	this.value = new char[0];
    }
 
Zuletzt bearbeitet:

VfL_Freak

Top Contributor
Warum? Was spricht dagegen eine Variable mit null zu "initialisieren"? Eventuell ist das ja im späteren Programmablauf relevant

Nein, das ist es hier wohl nicht, da diese Membervariable (die Klasse stellt eine Art Report zu Verfügung) immer nur gefüllt und ausgelesen, aber nie auf Inhalt, oder besser: auf 'null', wird!

Eigentlich wird das in diesem Projekt überall so gehandelt, aber ich bin noch in der Einarbeitungphase und habe - dank fehlender Doku - an manchen Stellen noch so meine Verständnisprobleme ..... ;(

Danke und Gruß
Klaus
 
S

SlaterB

Gast
wenn man andere vielleicht komplizierte Projekte übernimmt, dann vorsichtig mit Änderungen,
in Extremfällen kann new String() schon zum Einsatz kommen,

es reicht wenn man weiß/ beachtet:
solange ich
String s = "x";
schreiben kann und mir kein triftiger Grund einfällt, sollte ich es unterlassen
String s = new String("x");
zu schreiben ;)
 

VfL_Freak

Top Contributor
wenn man andere vielleicht komplizierte Projekte übernimmt, dann vorsichtig mit Änderungen,
in Extremfällen kann new String() schon zum Einsatz kommen,

es reicht wenn man weiß/ beachtet:
solange ich
String s = "x";
schreiben kann und mir kein triftiger Grund einfällt, sollte ich es unterlassen
String s = new String("x");
zu schreiben ;)

ok, Danke .... ;)

Soweit ich das sehe, wird das "new String()" nur im Konstruktor verwendet und das Objekt wirklich zu instantiieren resp. in einer Reset-Funktion, um die Membervariable zu leeren .....
Ich werde mir das bei Gelegenheit mal in Ruhe im Debugger anschauen müssen ...

[OFFTOPIC]
Wird Hansa (ich vermute mal Rostock) denn DIESES Jahr Meister ???:L:D
[/OFFTOPIC]

Gruß aus OS
Klaus
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K The method clone() from the type Object is not visible. Allgemeine Java-Themen 9
H Object cast exception Allgemeine Java-Themen 7
P JDK nicht installiert in Net Object Fusion Allgemeine Java-Themen 7
Erwin82a Object cannot be converted to Custom Class in Lampda Expression Allgemeine Java-Themen 2
Zeppi Cast Object in Generics Allgemeine Java-Themen 4
MoxxiManagarm Mapping into existing object Allgemeine Java-Themen 15
coolian Swing erstellt fillreckt immmer ein neues object Allgemeine Java-Themen 13
N Wo ist Object.class ? Allgemeine Java-Themen 0
R Erste Schritte Object reference funktioniert nicht. Wie mach ichs richtig? Allgemeine Java-Themen 3
RalleYTN Datentypen Herausfinden ob Object ein Array ist ohne den Typen des Arrays zu kennen? Allgemeine Java-Themen 12
N Gibt es etwas allgemeineres as Object? Allgemeine Java-Themen 16
Bananabert Swing jtree : image als user object Allgemeine Java-Themen 2
N ArrayList in eigenem Object nicht richtig serialisierbar Allgemeine Java-Themen 14
B [Android] EditText-Object ist null - Nimmt nicht den Wert des enthaltenen Textfeldes ein Allgemeine Java-Themen 2
Z Vergleich zwischen int und Object Allgemeine Java-Themen 1
D Object nach Vererbung mit Class Object überprüfen Allgemeine Java-Themen 4
T InvalidClassException - Read null attempting to read class descriptor for object Allgemeine Java-Themen 8
J Ist eine Instanz von einem bestimmten Object Typ? Allgemeine Java-Themen 6
L Sortieren von "Map<String, Object>" Allgemeine Java-Themen 2
M Cast double[]-->Object[] oder Vector<double[]> Allgemeine Java-Themen 3
G REST- Object darstellung Allgemeine Java-Themen 6
C Object.equals() liefert falschen Wert? Allgemeine Java-Themen 14
darekkay Generics: Wildcard und Object Allgemeine Java-Themen 5
O Socket Object wird scheinbar falsch empfangen Allgemeine Java-Themen 6
N Klasse/Object Eigenaufruf Allgemeine Java-Themen 5
G JNI Shared Object Allgemeine Java-Themen 10
B Variable class in java.lang.Object Allgemeine Java-Themen 11
S Klassen Zuorgnung Object-char Allgemeine Java-Themen 2
N java.lang.IllegalMonitorStateException: object not locked by thread before notify() Allgemeine Java-Themen 2
S Type mismatch: cannot convert from Object to float Allgemeine Java-Themen 3
A Input/Output Serialisierung und Object.hashCode() Allgemeine Java-Themen 3
M Jaxb und JPA: A cycle is detected in the object graph Allgemeine Java-Themen 5
H double dispatch und equals(Object) Allgemeine Java-Themen 6
J Datentypen Problem mit Date-Object Allgemeine Java-Themen 2
B Variablen Alle RenderingHints.Keys (KEY_*) in Array + alle RenderingHints.Keys (VALUE_*) in Object[] Allgemeine Java-Themen 8
J Verschiedene Klassen als "Object" in ArrayList und dann in for-Schleife erzeugen!? Allgemeine Java-Themen 2
L Object Instanz anhand eines Strings Allgemeine Java-Themen 10
A Datei als Object einlesen und das Object als Singleton instance setzen. Allgemeine Java-Themen 13
DEvent embedded Object Database in Text Format Allgemeine Java-Themen 5
J Casting Problem Object, Double und String Allgemeine Java-Themen 3
M Object-Instanz in Date übersetzen Allgemeine Java-Themen 6
P Tree Object structure Allgemeine Java-Themen 19
J merkwürdig: Object Allgemeine Java-Themen 6
woezelmann Object nach Deserialisierung nicht mehr gleich Allgemeine Java-Themen 13
Iron Monkey Object in Datei effizienter lesen / schreiben Allgemeine Java-Themen 13
L Object = null? Allgemeine Java-Themen 16
dayaftereh Serializable und Object In/Out Stream Allgemeine Java-Themen 2
T Object auf Double, Int, String testen Allgemeine Java-Themen 5
N serialize deserialize java object über string Allgemeine Java-Themen 8
N getName() of reflection Object Allgemeine Java-Themen 4
B Probelm mit File Object Allgemeine Java-Themen 6
G NoClassDefFoundError: java/lang/Object Allgemeine Java-Themen 4
S Liste Object Löschen Allgemeine Java-Themen 7
P not enough space for object heap - Trotz mehr RAM? Allgemeine Java-Themen 6
MQue List<String> aus List<Object> generieren Allgemeine Java-Themen 2
M ArrayList<Object[]> und toArray() Allgemeine Java-Themen 5
Daniel_L LinkedList vom Typ Object-Array? Allgemeine Java-Themen 4
B Warum return type Object ? Allgemeine Java-Themen 4
D Generisches Object erstellen Allgemeine Java-Themen 2
M Databinding von Object zu properties-Datei Allgemeine Java-Themen 10
P Wieso HashMap-Zugriff mit Object, statt mit MyObject? Allgemeine Java-Themen 12
A NullPointer bei konvertierung von byteArr --> Object Allgemeine Java-Themen 3
foobar Object to byte[] ohne Serializable Allgemeine Java-Themen 6
reibi Object clonen spezial Allgemeine Java-Themen 8
C casten vom Typ Object nach Double[][] Allgemeine Java-Themen 2
X cannot convert from Object[] to Integer[] Allgemeine Java-Themen 2
G JSON Object auslesen Allgemeine Java-Themen 1
T cast Object to Double[] Allgemeine Java-Themen 2
G Object. Wrapper Allgemeine Java-Themen 12
V Object durchsuchen Allgemeine Java-Themen 4
U eigene Datenstruktur ArrayList<String> nach Object [][ Allgemeine Java-Themen 2
T "Object o = new Object()" vs. "new Object()&q Allgemeine Java-Themen 8
T Object -> byte[] Allgemeine Java-Themen 5
M Implementation von Zugriffen auf Object[index] in der JVM Allgemeine Java-Themen 9
T Klasse => Primitiv ? Object instanceof Klasse Allgemeine Java-Themen 2
B mit methode ein object zurückgeben. Allgemeine Java-Themen 5
R Object Dynamisch erzeugen (Reflection API) Allgemeine Java-Themen 22
T HashMap (String, Object(String , int)) nach int sortieren Allgemeine Java-Themen 7
P Typ Object in socket umwandeln Allgemeine Java-Themen 4
G Object cast via Reflection Allgemeine Java-Themen 8
Zed JList Object einfügen und Text anzeigen Allgemeine Java-Themen 3
MQue Object in Integer umwandeln Allgemeine Java-Themen 3
G Error: Hashtable Type safety: The method put(Object, Object) Allgemeine Java-Themen 6
T double to object Allgemeine Java-Themen 3
S File Object zu Directory machen ? Allgemeine Java-Themen 9
V Brauche dringend Hilfe. Object-handling Allgemeine Java-Themen 4
N Warning "The Cast from Object to" Allgemeine Java-Themen 9
K Threads und ein übergeordnetes Object Allgemeine Java-Themen 7
F Zugriff mittels getObject() oder this.object ? Allgemeine Java-Themen 8
W Object -> isPrimitiv? Allgemeine Java-Themen 7
D Cast schlägt fehl : Object[] zu Button[] Allgemeine Java-Themen 2
S Object nach Integer umwandeln Allgemeine Java-Themen 13
R object zu array casten. Allgemeine Java-Themen 2
N Map Object Allgemeine Java-Themen 13
G Eine C/C++ Referenz in einem Java Object speichern Allgemeine Java-Themen 5
N Ermitteln welchen Typ ein "Object"-Objekt enthält Allgemeine Java-Themen 11
K Cast ohne neues Object zu erzeugen Allgemeine Java-Themen 12
D Object in int casten Allgemeine Java-Themen 7
N Object-Array mit Comparator absteigend sortieren? Allgemeine Java-Themen 10
D Object to Long casting Allgemeine Java-Themen 9

Ähnliche Java Themen


Oben