2010-09-06 21 views
14

Cuál es la diferencia entre String str = new String("SOME") y String str="SOME" ¿Estas declaraciones dan variación de rendimiento.Java String declaration

+0

Véase también http://stackoverflow.com/questions/334518/java-strings-string-s-new-stringsilly y http://stackoverflow.com/questions/390703/what-is-the-purpose-of -the-expression-new-string-in-java – polygenelubricants

Respuesta

29
String str = new String("SOME") 

siempre crear un nuevo objeto en el montón

String str="SOME" 

utiliza la String pool

probar este pequeño ejemplo:

 String s1 = new String("hello"); 
     String s2 = "hello"; 
     String s3 = "hello"; 

     System.err.println(s1 == s2); 
     System.err.println(s2 == s3); 

Para evitar la creación de objetos innecesarios en el uso montón la segunda forma.

9

Hay una pequeña diferencia entre ambos.

segunda declaración assignates la referencia asociada a la constante SOME a la variable str

Primera declaración crea una nueva cadena de valor que tenga el valor de la constante de SOME y assignates su referencia a la variable str.

En el primer caso, se ha creado una segunda cadena que tiene el mismo valor que SOME, lo que implica un mayor tiempo de inicialización. Como consecuencia, debes evitarlo. Además, en tiempo de compilación, todas las constantes SOME se transforman en la misma instancia, que utiliza mucha menos memoria.

Como consecuencia, siempre preferimos la segunda sintaxis.

+3

Para el registro, hay escenarios donde 'new String (String)' tiene sentido, como si tiene una cadena muy grande y solo le interesa retener una subcadena pequeña . Los métodos 'substring' solo devuelven una vista flyweight de la cadena original, por lo que usar' new String (hugeString.substring (a, b)) 'fuerza una copia y permite que GC recupere el contenido de' hugeString' cuando se apaga alcance. Sin embargo, no deberían haberlo convertido en un constructor ... – gustafc

+0

Es un caso interesante de optimización, de hecho, pero no iría por este camino antes de haber hecho algunas comprobaciones de perfil (por lo que tú, supongo). – Riduidel

0

Primero creará un nuevo objeto String en heap y str lo referirá. Además, literal también se colocará en String pool. Significa que se crearán 2 objetos y 1 variable de referencia.

La segunda opción creará String literal solo en pool y str lo referirá. Por lo tanto, solo se creará 1 objeto y 1 referencia. Esta opción usará siempre la instancia del conjunto de cadenas en lugar de crear una nueva cada vez que se ejecute.