2012-08-29 10 views
7

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. 
+3

@ 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.) –

+0

@JonSkeet Alles klar, verstanden. – sp00m

+0

Ich meine s2 = s1 kopiert nur Referenz. Ich habe bearbeitet. – user1301568

Antwort

13

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.

+0

Ich frage mich: Hat jemals jemand ein reales Beispiel erlebt, in dem eine Kopie des Originals wirklich benötigt wurde? – amit

+0

@amit: nicht für unveränderliche String, aber da gibt es offensichtlich legitimen Grund, einen veränderlichen StringBuffer –

+3

@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. –

0

Nein s2 bezieht sich auf das neu erstellte String-Objekt zusammen mit s1.

4

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"; 
+1

Vielen Dank für ein einfaches Beispiel. – user1301568

0
   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

+0

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;'. –

+0

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

+0

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. –

0

String-Konstruktor funktioniert das sehr leicht Job, weil die String-Objekte in Java

unveränderlich sind
String st="hello"; 
String st1=new String(st); 

OUTPUT von st1 sein wird, ist hallo

+1

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. –