Was ist in Java strcpy?Was ist in Java strcpy?
String s1, s2;
s1 = new String("hello");
s2 = s1; // This only copies s1 to s2.
Was ist in Java strcpy?Was ist in Java strcpy?
String s1, s2;
s1 = new String("hello");
s2 = s1; // This only copies s1 to s2.
Diese Aussage:
s2 = s1;
kopiert den Wert von s1
in s2
. Dieser Wert ist nur eine Referenz, daher beziehen sich nun s1
und s2
auf dasselbe Objekt. Wenn dies ein veränderbarer Typ wäre (z. B. StringBuilder
oder ArrayList
), dann wäre es richtig, besorgt zu sein.
String
ist jedoch unveränderlich. Sie können das Objekt nicht ändern, um seine Textdaten zu ändern, daher genügt es, den Verweis zu kopieren. Das Ändern des Wertes s2
in eine andere Zeichenfolge zu verweisen (oder es sich um eine null
Vorlage) wird nicht Änderung der Wert von s1
:
String s1 = "hello";
String s2 = s1;
s1 = "Something else";
System.out.println(s2); // Prints hello
Wenn Sie wirklich ein neues String
Objekt erstellen möchten, können Sie können Sie den Konstruktor Sie bereits sind (unnötig) mit für s1
:
s2 = new String(s1);
Allerdings, das ist sehr selten eine gute Idee.
Ich frage mich: Hat jemals jemand ein reales Beispiel erlebt, in dem eine Kopie des Originals wirklich benötigt wurde? – amit
@amit: nicht für unveränderliche String, aber da gibt es offensichtlich legitimen Grund, einen veränderlichen StringBuffer –
@amit zu kopieren: Ja, tat ich. Beim Lesen vieler * sehr kurzer * Zeilen aus einer Wörterbuchdatei verwendeten die Standardbibliotheken * * einen String mit einem Backing-Array von mindestens 80 Zeichen. Der Unterschied in der Speichernutzung zwischen "line = new String (line)" und nicht war enorm. Ich glaube, die Dinge sind jetzt besser. –
Nein s2
bezieht sich auf das neu erstellte String-Objekt zusammen mit s1
.
String ist unveränderlich, so dass Sie es nie kopieren müssten. (Außer in seltenen Fällen)
z.B.
s1 = new String("hello");
ist grundsätzlich die gleiche wie
s1 = "hello";
und
s2 = s1;
ist grundsätzlich die gleiche wie
s2 = "hello";
Vielen Dank für ein einfaches Beispiel. – user1301568
String s1, s2;
s1 = new String("hello");
s2 = s1; // This only copies s1 to s2. Am I right?
s1="adsfsdaf";
System.out.println(s2);
System.out.println(s1);
Sie sind rechts s1 und s2 druckt die string nicht die gleiche string ... aber während dies für Objekte Änderungen in einem Objekt zu tun haben Auswirkungen auf andere ... gibt es eine Notwendigkeit für Objekt klonen. Es gibt kein Problem mit String
Es wäre für jedes andere Objekt nicht anders, unveränderlich oder nicht. Die zweite Zuweisung zu s1 ist das Setzen eines neuen Wertes für die Referenz (Zeiger), ohne das Objekt zu verändern. Das Ändern des Objekts wäre etwas wie 's1.someField = xyz;'. –
ya für die richtige Zeichenfolge ... für eine Bedingung wie dieses Objekt 0 = new Object(); Objekt o2 = o; Es gibt eine Notwendigkeit von clone..das ist, was ich gesagt habe – Aravind
Der "Klon" wird nur benötigt, wenn das Objekt in der Zukunft geändert werden kann, und Sie wünschen nicht, dass diese Änderung von der Kopie "gesehen" wird. Es gibt nichts "Magisches" an unveränderlichen Objekten - ihnen fehlt einfach jede Methode, um sie zu verändern. –
String-Konstruktor funktioniert das sehr leicht Job, weil die String-Objekte in Java
unveränderlich sindString st="hello";
String st1=new String(st);
OUTPUT von st1 sein wird, ist hallo
Hat nichts mit Unveränderlichkeit zu tun. Es ist einfach eine Frage, ob Sie getrennte Objekte erhalten oder Referenzen auf dasselbe Objekt duplizieren. Unveränderlichkeit bedeutet einfach, dass, wenn Sie nur die Referenz duplizieren, Sie garantiert sind, dass keine spätere Operation den Wert des Objekts ändern kann. –
@ sp00m: Nein, das nicht wahr ist. Es kopiert eine Referenz. Es gibt nichts Magisches an String in dieser Hinsicht - es ist nur, dass es unveränderlich ist. Sie können auch Ihre eigenen unveränderlichen Klassen schreiben. (Wenn Ihr Kommentar eine Antwort wäre, hätte ich ihn heruntergeregelt - es ist falsch und irreführend.) –
@JonSkeet Alles klar, verstanden. – sp00m
Ich meine s2 = s1 kopiert nur Referenz. Ich habe bearbeitet. – user1301568