2010-02-01 10 views

Respuesta

6
String s = "Test"; 

Primero buscaremos la cadena de "Prueba" en el grupo constante de cadenas. Si se encuentra, s se hará para referirse al objeto encontrado. Si no se encuentra, se crea un nuevo objeto String, se agrega al grupo y s se hace para referirse al objeto recién creado.

String s = new String("Test"); 

Primero crearemos un nuevo objeto de cadena y haremos referencia a él. Además, se realiza una entrada para la cadena "Prueba" en el grupo de constante de cadena, si no está allí.

Suponiendo que la cadena "Prueba" no está en la agrupación, la primera declaración creará un objeto, mientras que la segunda creará dos objetos.

+1

Según tengo entendido, la creación de búsqueda/objeto en la constante pool ocurre para todos los literales que aparecen en el código de una clase cuando se carga esa clase, no cuando se ejecuta esa línea de código en particular. –

5

La diferencia en el término de la memoria es que las expresiones de la forma: String s = "test" utilizan la cadena "interna" para compartir instancias únicas.

La invocación de la forma: String s = "test"
es eficiente en comparación con String s = new String("test")

La primera llamada hace uso de la expresión de la constante existente (si hay uno), la segunda llamada crea una nueva instancia sin hacer uso de cualquier instancia existente.

A continuación trozo de código se muestra esto:

String test = new String("test"); 
String internTest = "test"; 
String nonInternTest = new String("test"); 

System.out.println(test == internTest); // prints false 
System.out.println(test != nonInternTest); // prints true 
System.out.println(test.equals(nonInternTest)); // prints true 

También tenga en cuenta que el JLS especifica el comportamiento que ser así:
Cada cadena literal es una referencia a una instancia de la clase String (§4.3.3) Los objetos de cadena tienen un valor constante. Los literales de cadena o, más en general, las cadenas que son los valores de las expresiones constantes se "internan" para compartir instancias únicas, utilizando el método String.intern.

0

Primero se buscará el literal String "Test" en el String pool, si está presente, s lo referirá y no creará uno nuevo. y crea un objeto nuevo solo cuando el literal "Prueba" no está allí.

pero en el segundo caso creará otro objeto sin molestar mucho si está presente o no.

1

Cadena s = "Prueba"; // crea un objeto String y una variable de referencia En este caso simple, "Test" irá al grupo y s se referirá a él.

Cadena s = new Cadena ("Prueba"); // crea dos objetos y una variable de referencia En este caso, como utilizamos la nueva palabra clave, Java creará un nuevo objeto String en la memoria normal (sin agrupación), y s se referirá a ella. Además, la "Prueba" literal será se colocará en la piscina.

pero lo que tienen en común es que crean un nuevo objeto String, con un valor de "Prueba", y lo asignan a una variable de referencia s.

0

+ La diferencia entre crear un nuevo objeto String y crear una referencia no es nada, pero le estamos diciendo a jvm que cree un nuevo objeto. y crear la referencia significa que estamos creando el objeto solo nosotros mismos.

+0

No es una pregunta. – Luv

Cuestiones relacionadas