String Interning en Java

Rupam Yadav 12 octubre 2023
String Interning en Java

Hoy hablaremos de String Interning o el método intern() de la clase String. En los puntos a continuación, aprenderemos qué es String Interning y por qué necesitamos usarlo, usando un ejemplo.

¿Qué es String Interning en Java y cuándo usarlo?

Java es un lenguaje de programación orientado a objetos. Cuando creamos cualquier objeto o variable, se necesita algo de memoria, lo que significa que si hacemos cien instancias de la clase String, se almacenarán en diferentes lugares de la memoria como un montón, lo que puede consumir mucho espacio.

Para abordar el problema, los desarrolladores de Java introdujeron la idea de un conjunto constante de cadenas (SCP) que contiene objetos que comparten el mismo conjunto de memoria.

El SCP contiene todos los objetos String con el mismo contenido, lo que hace que recuperar el objeto sea una tarea fácil y que ahorra memoria, ya que no tenemos que encontrar varios objetos. Solo necesitamos un único objeto que pueda hacer referencia.

Para entenderlo mejor, podemos echar un vistazo a un ejemplo sencillo:

String str1 = new String("String A");
String str2 = new String("String A");

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

Producción :

false

En el código anterior, hay dos objetos de la clase String str1 y str2, pero ambos contienen el mismo contenido. Si los comparamos usando el operador == para comprobar si son iguales, la salida muestra false, haciéndolos desiguales.

Ocurre porque están ubicados en diferentes ubicaciones en un montón. Además de ser dos objetos, no hay diferencias significativas en ambos objetos.

Si usamos el concepto de String Interning, solo creamos un solo objeto, asumámoslo como strObj, y ahora contiene el contenido de los objetos. Cuando queremos acceder a los objetos, podemos referirnos a este objeto y obtener el contenido.

Usando String Interning en Java

En el siguiente ejemplo, vemos cómo podemos usar el método de String Interning usando intern(). Creamos cinco variables String.

La primera variable String str se crea usando new String(), y la cadena se pasa en el constructor. A continuación, creamos otro objeto de cadena utilizando la palabra clave new, pero llamamos al método intern() desde el constructor String().

Las últimas tres variables son literales de cadena, en las que la última variable, str5, tiene un contenido diferente al de todas las demás variables de cadena. Tenga en cuenta que no hemos utilizado ningún método intern() con las últimas tres variables porque los literales de cadena ya están colocados en el SCP, lo que significa que la internación se les aplica automáticamente.

Ahora comparamos las variables para comprobar si coinciden. Usamos el operador == que devuelve true si el objeto hace referencia a la ubicación de memoria exacta. Como no llamamos al método intern() con la primera cadena str1, está en una ubicación de memoria diferente y, por lo tanto, str1 == str2 no se ejecuta.

str2 está en el SCP porque llamamos intern() con él, y cuando lo comparamos con str3, que es un literal de cadena, devuelve true y ejecuta la salida. A continuación, comparamos dos cadenas literales con el mismo contenido, str3 y str4, que generan el mensaje en la consola.

public class JavaExample {
  public static void main(String[] args) {
    String str1 = new String("String A");
    String str2 = new String("String A").intern();
    String str3 = "String A";
    String str4 = "String A";
    String str5 = "String B";

    if (str1 == str2) {
      System.out.println("str1 and str2 are in the same SCP");
    }

    if (str1 == str3) {
      System.out.println("str1 and str3 are in the same SCP");
    }

    if (str2 == str3) {
      System.out.println("str2 and str3 are in the same SCP");
    }

    if (str3 == str4) {
      System.out.println("str3 and str4 are in the same SCP");
    }

    if (str4 == str5) {
      System.out.println("str3 and str4 are in the same SCP");
    }
  }
}

Producción :

str2 and str3 are in the same SCP
str3 and str4 are in the same SCP
Rupam Yadav avatar Rupam Yadav avatar

Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.

LinkedIn

Artículo relacionado - Java String