¿Cómo se puede inicializar una cadena usando “”?

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

Java String 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, a fin de mejorar el rendimiento del lenguaje. Las primitivas se almacenan en la stack de llamadas, que requieren menos espacio de almacenamiento y son más baratas de manipular. Por otro lado, los objetos se almacenan en el montón del progtwig, lo que requiere una administración de memoria compleja y más espacios de almacenamiento.

Por razones de rendimiento, Java’s String 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 

enter image description here

Nota: Los literales de cadena se almacenan en un grupo común. Esto facilita compartir el almacenamiento de cadenas con los mismos contenidos para conservar el almacenamiento. String objetos de String asignados a través de un nuevo operador se almacenan en el heap y no se comparte el almacenamiento para los mismos contenidos.

Java trata String como una clase especial, puede inicializar en ambos sentidos

  1. Directamente asignando literal

     String a = "adsasdf"; 
  2. Como otros objetos que usan nueva palabra clave

     String a = new String("adsasdf"); 

Debe tener especial cuidado cuando quiera 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 un 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 hace referencia a objetos diferentes, como cuando inicializamos cualquier otro objeto. por lo tanto, son desiguales en comparación con == operador, mientras que son iguales en valores.

String recibe un trato especial en el JLS: es uno de los dos tipos no primitivos para los que existen literales (el otro es Class ) * .

Desde el JLS :

Un literal de cadena es una referencia a una instancia de la clase `String […].

* bueno, también existe el “tipo nulo” con su null literal ” null “, pero la mayoría de la gente no piensa en el “tipo nulo” como un tipo apropiado.

Es una característica del lenguaje Java. Los literales de cadena en el código fuente reciben un trato especial.

La especificación de idioma, aquí , simplemente dice que una cadena literal es de tipo String

El texto dentro de las comillas dobles crea un objeto String literal.

 String myString = "Some text"; 

El código anterior crea un objeto String , usando comillas dobles.

Las cadenas se usan muy a menudo en un lenguaje de progtwigción. Como java está orientado a objetos, una cadena es un objeto. Para evitar la nueva cadena engorrosa (“someString”); statement cada vez que necesita un objeto de cadena java le permite crear un objeto de cadena utilizando el literal de cadena.

Pero debes tener en cuenta la igualdad de cuerdas. Aquí una breve prueba JUnit para demostrar a qué me refiero.

  @Test public void stringTest() { // a string literal and a string object created // with the same literal are equal assertEquals("string", new String("string")); // two string literals are the same string object assertSame("string", "string"); // a string literal is not the same object instance // as a string object created with the same string literal assertFalse("string" == new String("string")); // java's String.intern() method gives you the same // string object reference for all strings that are equal. assertSame("string", new String("string").intern()); } 

Solo por mencionar. A una cadena literal es una referencia a una instancia de la clase String, puede escribir código de esta manera:

  "abc" .getBytes ();

  "a: b: c" .split (":");

  "愛" .codePointAt (0);

String es una clase en Java . Tiene razón al respecto, por lo que siempre podemos inicializar con la new palabra clave.

Pero cuando hacemos algo como:

String s = "";

La statement anterior está marcada por el comstackdor como un objeto String especial y luego como JVM durante la carga de la clase (la carga se realiza antes de la inicialización), ve esto lo que se conoce como un literal de cadena , que se almacena en un conjunto literal de cadena .

Entonces se puede crear un String usando el método new() y el "" , pero este último proporciona un literal de cadena que permanece en el montón incluso cuando no hay referencia a ese objeto de cadena, porque tiene una referencia del literal de cadena piscina.

Java hace un proceso de dos pasos para nosotros.

 String str = "hello"; 

es equivalente a

 char data[] = {'h', 'e', 'l' , 'l', 'o'}; String str = new String(data); 

Al igual que [.NET] [1] obtuvo una cosa similar.

 String(Char[]) constructor 

hace

 String(char[] value) 

Agregar referencias: –

Java.lang.String no es solo una clase. Es una parte integral del lenguaje central. El comstackdor tiene azúcar sintáctico para ello. Por ejemplo, "" es como una abreviatura de new String("") . Cuando se escribe "" el comstackdor optimiza cadenas idénticas a la misma instancia para ahorrar espacio. "a" + 5 == "a5" ==> true

El comstackdor tiene azúcar sintáctico para muchas cosas, incluyendo no tener que empaquetar / unbox entre las versiones de los objetos y sus tipos nativos, ningún padre significa Objeto, constructor predeterminado, …