En Java, una cadena se puede crear de dos formas:
String x = "abc"; String y = new String("abc"); |
¿Cuál es la diferencia entre usar comillas dobles y usar el constructor?
1. Cotizaciones dobles contra constructor
Esta pregunta se puede responder utilizando dos ejemplos sencillos.
Ejemplo 1:
String a = "abcd"; String b = "abcd"; System.out.println(a == b); // True System.out.println(a.equals(b)); // True |
a==b
es cierto porque a
y b
se refieren al mismo literal de cadena en el área de métodos. Las referencias a la memoria son las mismas.
Cuando se crea el mismo literal de cadena más de una vez, solo se almacena una copia de cada valor de cadena distinto. Se llama «pasantía de cuerdas«. Todas las cadenas de constantes en tiempo de compilación en Java se internan automáticamente.
Ejemplo 2:
String c = new String("abcd"); String d = new String("abcd"); System.out.println(c == d); // False System.out.println(c.equals(d)); // True |
c==d
es falso porque c
y d
se refieren a dos objetos diferentes en el montón. Los diferentes objetos siempre tienen diferentes referencias de memoria.
Este diagrama ilustra las dos situaciones anteriores:
2. Pasantía de cadenas en tiempo de ejecución
Gracias a LukasEder (su comentario a continuación):
La internación de cadenas aún se puede realizar en tiempo de ejecución, incluso si se construyen dos cadenas con constructores:
String c = new String("abcd").intern(); String d = new String("abcd").intern(); System.out.println(c == d); // Now true System.out.println(c.equals(d)); // True |
3. Cuándo usar cuál
Debido a que el literal «abcd» ya es de tipo String, el uso del constructor creará un objeto adicional innecesario. Por lo tanto, se deben usar comillas dobles si solo necesita crear una cadena.
Si necesita crear un nuevo objeto en el montón, debe usar el constructor. Aquí hay un caso de uso.