¿Qué hace String.intern() en Java y cuándo utilizarlo?

| Última modificación: 18 de diciembre de 2024 | Tiempo de Lectura: 3 minutos

Algunos de nuestros reconocimientos:

Premios KeepCoding

En una de mis tantas veces en las que he trabajado en proyectos en Java, hubo una en especial que me hizo buscar por cielo y tierra una solución. Resulta que, de repente mi aplicación empezó a consumir más memoria de la que tenía pensada. Al parecer tenía miles de textos que se repetían y cada uno ocupaba un espacio único en la memoria. Cuando me dijeron que podía usar String.intern() en Java para solucionarlo, no pude creer lo fácil que fue gestionar las cadenas reutilizando referencias, sin tener que crear objetos innecesarios. Voy a explicarte de una forma muy sencilla qué hace este método y cómo lo puedes utilizar.

String.intern() en Java qué es

¿Qué hace String.intern() en Java?

Lo que hace String.intern() en Java es crear una copia exacta de un objeto String en la memoria del String Constant Pool. Haz de cuenta que este pool es una especie de “almacén” que Java usa para gestionar cadenas de texto.

Características de String.intern():

  1. Evita duplicados: Si ya existe una cadena con el mismo contenido en el String Constant Pool, intern() no crea un nuevo objeto, sino que devuelve la referencia del existente.
  2. Optimización de memoria: Al reutilizar referencias en lugar de crear nuevas cadenas, reduce el uso de memoria.
  3. Comparaciones más rápidas: Al trabajar con referencias únicas, puedes usar el operador == para comparar cadenas en lugar de .equals().

¿Cómo funciona String.intern() en Java?

Acuérdate, si la cadena ya está en el String Constant Pool, pues el método devolverá la referencia a esa cadena, pero si no está, simplemente se agrega y luego es que se devuelve la referencia.

Ejemplo básico: Reutilización de cadenas

public class Main {
public static void main(String[] args) {
String cadena1 = "Hola";
String cadena2 = new String("Hola");
String cadena3 = cadena2.intern();

System.out.println(cadena1 == cadena2); // false
System.out.println(cadena1 == cadena3); // true
}
}

Te explico este código:

  • cadena1 es donde se guarda directamente en el String Constant Pool.
  • cadena2 es la que se crea en el heap como un objeto nuevo.
  • Al llamar a cadena2.intern(), se verifica si “Hola” ya existe en el pool (que es el caso), por lo que cadena3 apunta a la misma referencia que cadena1.

¿Cuándo deberías usar String.intern() en Java?

Sé que String.intern() parece una solución caída del cielo para todos los problemas de memoria, pero no te servirá siempre. Te dejo las situaciones en las que sí te será útil:

Grandes volúmenes de cadenas repetitivas

Si trabajas con miles (o millones) de cadenas que tienen contenidos repetidos, usa String.intern() en Java para ahorrar una cantidad significativa de memoria.

public class Main {
public static void main(String[] args) {
String[] datos = {"java", "python", "java", "java"};
for (int i = 0; i < datos.length; i++) {
datos[i] = datos[i].intern();
}

System.out.println(datos[0] == datos[2]); // true
}
}

Comparaciones frecuentes de cadenas

Cuando necesitas comparar cadenas constantemente, String.intern() puede simplificar el proceso al permitirte usar == en lugar de .equals().

public class Main {
public static void main(String[] args) {
String s1 = new String("KeepCoding");
String s2 = "KeepCoding";

if (s1.intern() == s2) {
System.out.println("Las cadenas son iguales.");
}
}
}

Optimización en aplicaciones legacy

En proyectos antiguos con un alto consumo de memoria debido al uso de cadenas, implementar String.intern() en Java en puntos estratégicos puede ser una mejora rápida.

Ejemplo avanzado: Uso en un mapa de datos

Si vas a procesar un archivo enorme con muchas claves repetidas, hazlo así:

import java.util.HashMap;

public class Main {
public static void main(String[] args) {
HashMap<String, Integer> mapa = new HashMap<>();
String[] claves = {"usuario", "admin", "usuario", "visitante"};

for (String clave : claves) {
String claveInternada = clave.intern();
mapa.put(claveInternada, mapa.getOrDefault(claveInternada, 0) + 1);
}

System.out.println(mapa);
}
}

Mira la salida:

{usuario=2, admin=1, visitante=1}

Consejos al momento de usar String.intern()

  • Sobrecarga inicial: Si tienes un programa pequeño, el beneficio de usar intern() puede no justificar la complejidad adicional.
  • Dependencia del tamaño del pool: El tamaño del String Constant Pool puede variar entre implementaciones y configuraciones de JVM.

Lo que yo te aconsejo es usarlo con cuidado y solo en casos donde realmente te beneficie, como grandes volúmenes de datos repetitivos.

Ya estás más que listo para usar String.intern() en Java. Ahora sabes que es muy valioso para ahorrar memoria y mejorar el rendimiento en aplicaciones que manejan cadenas de texto intensivamente. Espero que los ejemplos que te dejé, te ayuden a empezar a aplicarlo en tus proyectos desde ya.

Si quieres llevar tus habilidades de Java al siguiente nivel, en el Bootcamp de Java Full Stack de KeepCoding aprenderás no solo este tipo de trucos, sino también cómo diseñar aplicaciones eficientes y modernas. ¡Inscríbete hoy y transforma tu carrera en el mundo IT!

Ramón Maldonado

Full Stack Developer y Responsable de Formación base en KeepCoding.

Posts más leídos

¡CONVOCATORIA ABIERTA!

Java y Spring Boot

Full Stack Bootcamp

Clases en Directo | Profesores en Activo | Temario 100% actualizado