No estoy seguro acerca de JavaScript, pero en Java, las cadenas dan un paso adicional hacia la inmutabilidad, con el "String Constant Pool". Las cadenas se pueden construir con cadenas literales ( "foo"
) o con un String
constructor de clases. Las cadenas construidas con literales de cadena son parte del Grupo de constantes de cadena, y el mismo literal de cadena siempre será la misma dirección de memoria del grupo.
Ejemplo:
String lit1 = "foo";
String lit2 = "foo";
String cons = new String("foo");
System.out.println(lit1 == lit2); // true
System.out.println(lit1 == cons); // false
System.out.println(lit1.equals(cons)); // true
En lo anterior, ambos lit1
y lit2
se construyen usando el mismo literal de cadena, por lo que apuntan a la misma dirección de memoria; lit1 == lit2
da como resultado true
, porque son exactamente el mismo objeto.
Sin embargo, cons
se construye utilizando el constructor de clases. Aunque el parámetro es la misma constante de cadena, el constructor asigna nueva memoria para cons
, lo que significa cons
que no es el mismo objeto que lit1
y lit2
, a pesar de contener los mismos datos.
Por supuesto, dado que las tres cadenas contienen los mismos datos de caracteres, el uso del equals
método devolverá verdadero.
(Ambos tipos de construcción de cuerdas son inmutables, por supuesto)