Método intern() de Java

Java String类Clase String 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 class EjemploTest {
    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 lanewpalabra clave, estecrea un nuevo objeto de cadena en la memoria heap, es decir,str2 no 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 questr1 ya está en el grupo constante,str3ystr1apunta al mismo objeto.

System.out.println(str1 == str2);

  • str1 Apunta al grupo constante,str2 Apunta 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

Java String类Clase String de Java

Otras extensiones