Método intern() de Java
El método intern() se utiliza para agregar la cadena al grupo de cadenas interno en tiempo de ejecución y devolver la referencia del grupo de cadenas.
Cuando se llama al método intern(), si el grupo constante de cadenas ya contiene esa cadena, devuelve la referencia del grupo; si la cadena no está en el grupo, la agrega y devuelve la referencia de la cadena.
El método intern() sigue las siguientes reglas:Para dos cadenas cualesquiera s y t, s.intern() == t.intern() es true si y solo si s.equals(t) es true.
String s1 = new String("Hello");
String s2 = "Hello";
String s3 = s1.intern();
System.out.println(s1 == s2); // false
System.out.println(s2 == s3); // true
Sintaxis
public String intern()
Parámetros
Ninguno
Valor de retorno
El valor de retorno del método intern() es la referencia de la cadena en el grupo constante de cadenas (String Pool).
Reglas del valor de retorno:
- Si el grupo constante de cadenasya contienela cadena: devuelve la referencia de la cadena existente en el grupo.
- Si el grupo constante de cadenasno contienela cadena: almacena la referencia de la cadena del heap en el grupo constante (en lugar de crear un nuevo objeto) y devuelve esa referencia.
Diferencias entre versiones de Java:
En JDK 6 y anteriores, el grupo constante de cadenas se almacenaba en el área de métodos (generación permanente), con capacidad limitada; el uso excesivo de intern() puede provocar OutOfMemoryError.
En JDK 7 y posteriores, el grupo constante de cadenas se movió a la memoria heap, lo que permite almacenar más datos.
Ejemplo
El siguiente ejemplo demuestra la aplicación del método intern():
Ejemplo
public static void main(String args[]) {
// str1 se asigna directamente con el literal de cadena "Ejemplo", que se almacena en el grupo constante de cadenas (String Pool)
String str1 = "Ejemplo";
// str2 se crea con la palabra clave new, y se almacena en la memoria heap
String str2 = new String("Ejemplo");
// str3 es la referencia obtenida después de que str2 llama al método intern()
// El método intern() colocará "Ejemplo" en el grupo constante de cadenas y devolverá la referencia del grupo
String str3 = str2.intern();
// Comparación de str1 y str2
// str1 apunta a "Ejemplo" en el grupo constante, str2 apunta al objeto en la memoria heap
// Como sus direcciones son diferentes, el resultado es false
System.out.println(str1 == str2); // false
// Comparación de str1 y str3
// str3 es la referencia devuelta después de que str2 llama al método intern(), apunta a "Ejemplo" en el grupo constante
// Y str1 también apunta a "Ejemplo" en el grupo constante, por lo que sus direcciones son iguales y el resultado es true
System.out.println(str1 == str3); // true
}
}
Explicación del código:
String str1 = "Ejemplo";
-
Asignar directamente un literal de cadena
"Ejemplo", este sealmacena automáticamente en el grupo constante de cadenas(String Pool).
String str2 = new String("Ejemplo");
-
Debido al uso de la
newpalabra clave, estecrea un nuevo objeto de cadena en la memoria heap, es decir,str2no apunta al grupo constante, sino que apunta a una nueva dirección de memoria.
String str3 = str2.intern();
-
intern()El método verifica si la cadena"Ejemplo"ya estápresente en el grupo constante de cadenas:Si existe, devuelve la referencia de la cadena;
Si no existe, la agrega al grupo constante y devuelve la referencia del grupo.
-
Dado que
str1ya está en el grupo constante,str3ystr1apunta al mismo objeto.
System.out.println(str1 == str2);
-
str1Apunta al grupo constante,str2Apunta al objeto en el heap, por lo tanto==se comparan direcciones de memoria diferentes, el resultadofalse。
System.out.println(str1 == str3);
-
str3Después deintern(),apunta a la cadena del grupo constante, ystr1apunta al mismo objeto, el resultadotrue。
El resultado de la ejecución del programa anterior es:
false true
Otras extensiones
Clase String de Java