Não tenho certeza sobre JavaScript, mas em Java, as strings dão um passo adicional para a imutabilidade, com o "String Constant Pool". Strings podem ser construídas com literais de string ( "foo"
) ou com um String
construtor de classe. Strings construídos com literais de string fazem parte do String Constant Pool, e o mesmo string literal sempre será o mesmo endereço de memória do pool.
Exemplo:
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
Acima, ambos lit1
e lit2
são construídos usando o mesmo literal de string, então eles estão apontando para o mesmo endereço de memória; lit1 == lit2
resulta em true
, porque eles são exatamente o mesmo objeto.
No entanto, cons
é construído usando o construtor de classe. Embora o parâmetro seja a mesma constante de string, o construtor aloca nova memória para cons
, o significado cons
não é o mesmo objeto que lit1
e lit2
, apesar de conter os mesmos dados.
Obviamente, como todas as três strings contêm os mesmos dados de caractere, o uso do equals
método retornará true.
(Ambos os tipos de construção de string são imutáveis, é claro)