¿Cómo se puede inicializar una cadena usando " "?
Si String es una clase como cualquier otra, ¿cómo se puede inicializar usando comillas dobles?
La cadena Java es especial
Los diseñadores de Java decidieron conservar los tipos primitivos en un lenguaje orientado a objetos, en lugar de convertir todo en un objeto, para mejorar el rendimiento del lenguaje. Las primitivas se almacenan en la pila de llamadas, lo que requiere menos espacio de almacenamiento y es más económico de manipular. Por otro lado, los objetos se almacenan en el montón del programa, lo que requiere una gestión de memoria compleja y más espacio de almacenamiento.
Por motivos de rendimiento, String de Java está diseñado para estar entre una primitiva y una clase.
Por ejemplo
String s1 = "Hello"; // String literal
String s2 = "Hello"; // String literal
String s3 = s1; // same reference
String s4 = new String("Hello"); // String object
String s5 = new String("Hello"); // String object
Nota: Los literales de cadena se almacenan en un grupo común. Esto facilita compartir el almacenamiento de cadenas con el mismo contenido para conservar el almacenamiento. String
Los objetos asignados a través del new
operador se almacenan en heap
y no se comparte el almacenamiento para el mismo contenido.
Java trata a String como una clase especial, puede inicializar de ambas maneras
Asignación directa de literales
String a = "adsasdf";
Como otros objetos usando nueva palabra clave
String a = new String("adsasdf");
Debes tener especial cuidado cuando quieras comparar con ==
el signo:
String a = "asdf";
String b = "asdf";
System.out.println(a == b); // True
System.out.println(a.equals(b)); // True
String a = new String("asdf");
String b = new String("asdf");
System.out.println(a == b); // False
System.out.println(a.equals(b)); // True
Esto se debe a que en el primer caso los objetos a y b se mantienen en algo llamado literal pool
y ambos hacen referencia al mismo objeto, por lo que son iguales en ambos sentidos.
Pero en el segundo caso, a y b hacen referencia a objetos diferentes, como cuando inicializamos cualquier otro objeto. por lo que son desiguales en comparación con ==
el operador, mientras que tienen valores iguales.
String recibe un tratamiento especial en JLS: es uno de los dos tipos no primitivos para los que existen literales (el otro es Class
) * .
De la JLS :
Un literal de cadena es una referencia a una instancia de la clase `String [...].
* bueno, también existe el "tipo nulo" con su "literal nulo" null
, pero la mayoría de la gente no piensa en el "tipo nulo" como un tipo adecuado.
Es una característica del lenguaje Java. Los literales de cadena en el código fuente reciben un tratamiento especial.
La especificación del idioma, aquí , simplemente dice que una cadena literal es de String
tipo