2012-05-25 10 views
8
String h = "hi"; 

aquí estamos haciendo referencia a la cadena h a la cadena literal hi. JVM tiene un grupo literal de cadenas para almacenar literales de cadena para que podamos reutilizar las cadenas ya que son inmutables ...Reutilización de cadenas en java?

Cuando decimos reusable, ¿cuál es el significado exacto de esto? estamos hablando del address? que se selecciona de la misma dirección cada vez?

+0

Creo que la respuesta es sí. –

Respuesta

6

Sí, para hacer las cosas más simples que usted puede pensar en él como seleccionando desde la misma dirección, pero para ser más precisas, las variables mantienen la misma referencia - identificador que JVM puede usar para asignar a la dirección de memoria adecuada del objeto (ya que los objetos se pueden mover en la memoria).

Puede probarlo por código como este:

String w1 = "word"; 
String w2 = "word"; 
String b = new String("word"); // explicitly creating String by calling `new` operator 
           // won't put it in string pool 
System.out.println(w1 == w2); // true -> variables hold same reference 
System.out.println(w1 == b); // false -> variable hold different references 
b = b.intern(); // check if pool contains this string, if not put this string in pool, 
       // then return reference of such string from pool and store it in b variable 
System.out.println(w1 == b); // true -> now w1 and b hold same reference 
+0

b = b.intern(); // poner cadena en conjunto de cadenas, devolverla desde el grupo, luego almacenarla en b refrence .... ponerlo en pool ok resto no entendido :( – Nil

+0

Necesito almacenar algo de valor de 'b.intern()' porque La cadena es inmutable (no se puede cambiar) así que hago 'b = b.intern()' es por eso que escribí "guárdalo en b refrence" – Pshemo

+0

Estaba leyendo algunas cosas ... cuando dices que la cadena no se puede cambiar una vez se crea, ¿qué significa eso? [lo siento 4 preguntas de aficionados] – Nil

8

En el caso de

String h = "hi"; 
String i = "hi"; 
String j = new String("hi"); 

Dependiendo de la versión del JDK el compilador puede hacer lo que se llama interning y crear una única instancia de los datos de bytes que representa la "hi" y reutilizarla entre el a referencias variables En las especificaciones más recientes, todos String literals están internados en el conjunto de cadenas en la generación permanente.

El uso de la palabra clave new como en la última declaración creará una nueva instancia de los mismos bytes exactos que un objeto separado.

objetos String creados en tiempo de ejecución son no en el grupo de cadena a menos .intern() se llama en ellos. This is usually not needed and can cause problems, rarely has any significant benefits.

h == i; // true 
h == j; // false 
j.intern(); 
h == j; // true 
+0

Cadena h = "hi"; y Cadena i = nueva Cadena ("hola"); .... algo diferente sucede en este caso? – Nil

+0

para que el contenido "hi" de hyi se almacene en una dirección y el contenido "hi" del objeto j se almacene en otra dirección ¿estoy en lo correcto? – Nil

4

Lo que se quiere decir es que si 20 objetos utilizan la misma cadena literal:

private String h = "hi"; 

todos estos objetos serán, de hecho, hacer referencia a la misma instancia de cadena en la memoria. Y no importa, porque es imposible cambiar el contenido del String, ya que es inmutable. La misma instancia se puede compartir sin problemas entre los objetos.

3

Hay un grupo literal String dentro de la JVM con todos los String creados durante la vida útil del programa. Por reutilizable, significa que, cuando desea utilizar otro String con exactamente los mismos caracteres y la misma codificación, no se crea un nuevo objeto String. En cambio, la referencia apuntará al String ya existente en el grupo de cadenas. Esto se llama internamiento.

Esto se puede hacer porque String s son inmutables en Java.

La razón para hacer algo como esto es evitar el costo de crear un nuevo objeto String.

Mire aquí para más detalles sobre lo que la piscina literal de cadena es y cómo funciona: http://www.xyzws.com/Javafaq/what-is-string-literal-pool/3

También, busque en esta pregunta: Shouldn't I do `String s = new String("a new string");` in Java, even with automatic string interning?