¿Cómo se puede inicializar una cadena usando " "?

Resuelto splitgames asked hace 11 años • 10 respuestas

Si String es una clase como cualquier otra, ¿cómo se puede inicializar usando comillas dobles?

splitgames avatar Jul 05 '13 19:07 splitgames
Aceptado

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

ingrese la descripción de la imagen aquí

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. StringLos objetos asignados a través del newoperador se almacenan en heapy no se comparte el almacenamiento para el mismo contenido.

Suresh Atta avatar Jul 05 '2013 12:07 Suresh Atta

Java trata a String como una clase especial, puede inicializar de ambas maneras

  1. Asignación directa de literales

    String a = "adsasdf";
    
  2. 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 pooly 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.

chetan avatar Jul 05 '2013 12:07 chetan

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.

Joachim Sauer avatar Jul 05 '2013 12:07 Joachim Sauer

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 Stringtipo

nos avatar Jul 05 '2013 12:07 nos