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 Stringconstructor 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 lit1y lit2se construyen usando el mismo literal de cadena, por lo que apuntan a la misma dirección de memoria; lit1 == lit2da como resultado true, porque son exactamente el mismo objeto.
Sin embargo, consse 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 consque no es el mismo objeto que lit1y lit2, a pesar de contener los mismos datos.
Por supuesto, dado que las tres cadenas contienen los mismos datos de caracteres, el uso del equalsmétodo devolverá verdadero.
(Ambos tipos de construcción de cuerdas son inmutables, por supuesto)