2012-08-29 41 views
7

¿Qué es strcpy en Java?¿Qué es strcpy en Java?

String s1, s2; 

s1 = new String("hello"); 
s2 = s1; // This only copies s1 to s2. 
+3

@ sp00m: No, eso es falso. Copia una referencia. No hay nada mágico acerca de String en ese aspecto, es solo que es inmutable. Puedes escribir tus propias clases inmutables también. (Si su comentario fue una respuesta, lo habría rechazado, es incorrecto y engañoso) –

+0

@JonSkeet De acuerdo, lo tengo. – sp00m

+0

Quiero decir que s2 = s1 solo copia la referencia. Yo edité – user1301568

Respuesta

13

Esta afirmación:

s2 = s1; 

copia el valor de s1 en s2. Ese valor es solo una referencia, por lo que ahora s1 y s2 se refieren al mismo objeto. Por lo tanto, si se tratara de un tipo variable (por ejemplo, StringBuilder o ArrayList), entonces tendría razón en preocuparse. Sin embargo, String es inmutable. No puede modificar el objeto para cambiar sus datos de texto, por lo que basta con copiar la referencia. Cambiar el valor de s2 para referirse a una cadena diferente (o lo que es una referencia null) se no el cambio del valor de s1:

String s1 = "hello"; 
String s2 = s1; 
s1 = "Something else"; 
System.out.println(s2); // Prints hello 

Si realmente desea crear un nuevo String objeto, puede utilizar el constructor ya se encuentra (innecesariamente) utilizando para s1:

s2 = new String(s1); 

Sin embargo, eso es muy raramente una buena idea.

+0

Me pregunto: ¿alguien ha encontrado alguna vez un ejemplo de la vida real donde realmente se necesita una copia del original? – amit

+0

@amit: no para Cadena inmutable, pero hay una razón obvia legítima para copiar un mutable StringBuffer –

+3

@amit: Sí, lo hice. Al leer muchas líneas * muy cortas * de un archivo de diccionario, las bibliotecas estándar * se usaron * para asignar una cadena con una matriz de respaldo de al menos 80 caracteres. La diferencia en el uso de memoria entre hacer 'line = new String (line)' y no fue enorme. Creo que las cosas son mejores ahora. –

0

No s2 se referirá al objeto de cadena recientemente creado junto con s1.

4

La secuencia es inmutable, por lo que nunca tendrá que copiarla. (Excepto en circunstancias excepcionales)

p.

s1 = new String("hello"); 

es básicamente el mismo que

s1 = "hello"; 

y

s2 = s1; 

es básicamente el mismo que

s2 = "hello"; 
+1

Gracias por un ejemplo fácil. – 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); 

se es correcto s1 y s2 imprimen la cadena no la misma cadena ... pero al hacer esto para objetos los cambios hechos en un objeto afectan a otro ... hay una necesidad de clon para el objeto ... no hay problema con la cadena

+0

No sería diferente para cualquier otro objeto, inmutable o no. La segunda asignación a s1 es establecer un nuevo valor para la referencia (puntero), no modificando el objeto. Modificar el objeto sería algo como 's1.someField = xyz;'. –

+0

ya para la cadena que está bien ... para una condición como este Objeto 0 = nuevo Objeto(); objeto o2 = o; hay una necesidad de clonar ... eso es lo que dije – Aravind

+0

El "clon" solo es necesario si el objeto puede ser modificado en el futuro, y usted no desea que esa modificación sea "vista" desde la copia. No hay nada "mágico" sobre los objetos inmutables; simplemente carecen de cualquier método para modificarlos. –

0

cadena de constructor hace el trabajo muy fácilmente debido a que los objetos de cadena en java son inmutables

String st="hello"; 
String st1=new String(st); 

salida será de st1 es hola

+1

No tiene nada que ver con la inmutabilidad. Es simplemente una cuestión de si obtienes objetos separados o referencias duplicadas para el mismo objeto. La inmutabilidad simplemente significa que si solo duplica la referencia, se garantiza que ninguna operación posterior puede cambiar el valor del objeto. –