Além do que já foi dito, literais String [ou seja, Strings like "abcd"
but not like new String("abcd")
] em Java são internados - isso significa que toda vez que você se refere a "abcd", você obtém uma referência para uma única String
instância, em vez de uma nova cada vez. Então você terá:
String a = "abcd";
String b = "abcd";
a == b; //True
mas se você tivesse
String a = new String("abcd");
String b = new String("abcd");
então é possível ter
a == b; // False
(e caso alguém precise ser lembrado, use sempre .equals()
para comparar Strings; ==
testes de igualdade física).
Internar literais String é bom porque geralmente são usados mais de uma vez. Por exemplo, considere o código (inventado):
for (int i = 0; i < 10; i++) {
System.out.println("Next iteration");
}
Se não tivéssemos internação de Strings, a "Próxima iteração" precisaria ser instanciada 10 vezes, enquanto agora será instanciada apenas uma vez.