0Pricing
Java Academy · Lección

Por qué las cadenas son inmutables

Comprenda la inmutabilidad de las cadenas

Por qué las cadenas son inmutables es una lección gratuita de Java Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Java Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Java Academy incluye 4 lecciones en total.

Las cadenas no pueden cambiar

En Java, un String es inmutable: una vez creado, sus caracteres nunca pueden cambiar. Cualquier método que parezca modificar una cadena en realidad devuelve una cadena completamente nueva.

Los métodos devuelven cadenas nuevas

toUpperCase(), replace() y otros métodos similares no modifican la cadena original. Producen un String nuevo y dejan intacta la cadena original.

public class Main {
    public static void main(String[] args) {
        String original = "hello";
        String upper = original.toUpperCase();
        System.out.println("original: " + original);
        System.out.println("upper: " + upper);
    }
}

Reasignar no es mutar

Cuando escribe s = s + "!", la variable pasa a apuntar a una cadena nueva. El objeto de cadena antiguo no cambia y puede ser recolectado por el recolector de basura.

public class Main {
    public static void main(String[] args) {
        String s = "hi";
        String firstRef = s;
        s = s + "!";
        System.out.println("s: " + s);
        System.out.println("firstRef: " + firstRef);
    }
}

¿Por qué la inmutabilidad?

La inmutabilidad ofrece ventajas reales:

  • Seguridad de hilos: las cadenas se pueden compartir sin bloqueos
  • Almacenamiento en caché: los códigos hash y las entradas del pool siguen siendo válidos
  • Seguridad: una cadena que se pasa a un método no puede cambiar sin que usted lo sepa

El string pool

Varios literales de cadena idénticos pueden compartir un mismo objeto en el string pool. Esto solo es seguro porque las cadenas nunca cambian. Aquí, dos literales hacen referencia al mismo objeto del pool.

public class Main {
    public static void main(String[] args) {
        String a = "java";
        String b = "java";
        System.out.println(a == b);
        System.out.println(a.equals(b));
    }
}

new String rompe el pooling

Usar new String(...) fuerza la creación de un objeto independiente, por lo que la igualdad de referencias es distinta aunque el contenido coincida. Compare siempre el contenido con equals.

public class Main {
    public static void main(String[] args) {
        String a = "java";
        String b = new String("java");
        System.out.println("== : " + (a == b));
        System.out.println("equals: " + a.equals(b));
    }
}

El coste de la concatenación

Cada + aplicado a cadenas crea un objeto nuevo. Hacerlo dentro de un bucle reserva muchas cadenas de corta duración, lo que desperdicia tiempo y memoria.

public class Main {
    public static void main(String[] args) {
        String result = "";
        for (int i = 1; i <= 5; i++) {
            result = result + i;
        }
        System.out.println(result);
    }
}

Crecimiento cuadrático

Como cada concatenación copia todos los caracteres anteriores, construir una cadena larga con + dentro de un bucle escala mal (aproximadamente O(n al cuadrado)). Este es el problema principal de rendimiento.

public class Main {
    public static void main(String[] args) {
        String s = "";
        for (int i = 0; i < 1000; i++) {
            s += "x";
        }
        System.out.println("Length: " + s.length());
    }
}

Los valores inmutables son predecibles

Pasar una cadena a un método es seguro: el método no puede cambiar su copia. Aquí, el método crea una cadena nueva y el valor de quien llama permanece intacto.

public class Main {
    static void shout(String s) {
        s = s + "!!!";
        System.out.println("inside: " + s);
    }
    public static void main(String[] args) {
        String msg = "hello";
        shout(msg);
        System.out.println("outside: " + msg);
    }
}

Avance de la solución

Cuando necesita construir cadenas de forma eficiente, Java proporciona StringBuilder, una clase mutable complementaria. Esta modifica el contenido en el mismo objeto en lugar de reservar objetos nuevos cada vez.

public class Main {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        for (int i = 1; i <= 5; i++) {
            sb.append(i);
        }
        System.out.println(sb.toString());
    }
}

Comparación de los dos enfoques

Para unas pocas concatenaciones, + es perfectamente válido y legible. Para muchas concatenaciones dentro de un bucle, prefiera StringBuilder. Elija según la cantidad de texto que necesite construir.

public class Main {
    public static void main(String[] args) {
        String simple = "a" + "b" + "c";
        StringBuilder sb = new StringBuilder("a");
        sb.append("b").append("c");
        System.out.println(simple);
        System.out.println(sb);
    }
}

Comprobación rápida

¿Qué ocurre realmente cuando llama a s.toUpperCase() sobre un String?

Resumen

Ha aprendido por qué las cadenas son inmutables:

  • El contenido de un String nunca cambia
  • Los métodos devuelven cadenas nuevas
  • La inmutabilidad permite la seguridad de hilos, el uso del pool y la seguridad
  • Concatenar con + dentro de bucles escala mal
  • StringBuilder es la solución mutable

Preguntas frecuentes

¿La lección «Por qué las cadenas son inmutables» es gratis?

Sí — el texto completo de «Por qué las cadenas son inmutables» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Java Academy, actualiza a CoddyKit PRO. El curso de Java Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Por qué las cadenas son inmutables»?

Comprenda la inmutabilidad de las cadenas Practicas Java Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Java Academy?

No se requiere experiencia previa. Java Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «Por qué las cadenas son inmutables»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Java Academy?

Sí. Cada lección de Java Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Por qué las cadenas son inmutables
  2. Construcción de cadenas con StringBuilder
  3. Métodos de StringBuilder
  4. StringBuilder frente a StringBuffer
← Volver a Java Academy