Entendiendo el Método intern() de la Clase String en Java

Al asignar cadenas mediante literales, como String texto = "ejemplo";, el sistema verifica primero la constant pool. Si la cadena ya está presente, la referencia en la pila apunta directamente a ella; de lo contrario, se crea en la constant pool y se asigna la referencia.

La concatenación de cadenas constantes en tiempo de compilación, como String concatenado = "JA" + "VA";, resulta en una sola cadena "JAVA", que se busca o crea en la constant pool.

Para campos finales (final), los valores se reemplazan en tiempo de compilación. Por ejemplo, con final String parte1 = "ja"; y final String parte2 = "va";, String resultado = parte1 + parte2; se convierte en "java" durante la compilación.

La concatenación de cadenas con variables, como String dinamica = base + "01";, utiliza StringBuilder en el heap, creando un nuevo objeto.

A partir de JDK 1.7, el método intern() funciona de manera distinta: si la cadena no está en la constant pool, en lugar de copiarla, se almacena una referencia al objeto en el heap. Esto difiere de versiones anteriores donde se creaba una copia en la constant pool.

Ejemplo de código ilustrativo:


String cadena1 = new String("abc") + new String("123");
cadena1.intern();
String cadena2 = "abc123";
System.out.println(cadena1 == cadena2);

En JDK 1.7, al ejecutar cadena1.intern(), como la constant pool no contiene "abc123", se agrega una referencia al heap. Al asignar cadena2 como literal, se obtiene esa referencia, por lo que ambas apuntan al mismo objeto y el resultado es true.


String cadena1 = new String("abc") + new String("123");
String cadena2 = "abc123";
cadena1.intern();
System.out.println(cadena1 == cadena2);

Al cambiar el orden, la asignación de cadena2 crea una entrada en la constant pool. Al invocar intern() en cadena1, ya no teine efecto, resultando en false.

Preguntas Comunes y Respuestas

P: ¿Cuál es la salida del siguiente código?
String s1 = "xyz";
String s2 = "xyz";
System.out.println(s1 == s2);
R: true, ambas referencias apuntan al mismo objeto en la constant pool.

P: ¿Cuál es la salida del siguiante código?
String s1 = new String("xyz");
String s2 = new String("xyz");
System.out.println(s1 == s2);
R: false, ya que se crean dos objetos distintos en el heap.

P: ¿Cuál es la salida del siguiente código?
String s1 = "xyz";
String s2 = "x";
String s3 = "yz";
String s4 = s2 + s3;
System.out.println(s1 == s4);
R: false, la concatenación usa StringBuilder, generando un objeto nuevo en el heap.

P: ¿Cuál es la salida del siguiente código?
String s1 = "xyz";
final String s2 = "x";
final String s3 = "yz";
String s4 = s2 + s3;
System.out.println(s1 == s4);
R: true, los campos finales se reemplazan en compilación, equivalentes a "x"+"yz", que se fusiona en "xyz".

Etiquetas: java String intern constant pool jvm

Publicado el 6-21 20:56