Eu acho que é apenas consistência, ou "princípio de menor espanto". String é um objeto, então seria surpreendente se fosse tratado de forma diferente de outros objetos.
No momento em que o Java apareceu (~ 1995), apenas ter algo como String
era um luxo total para a maioria dos programadores que estavam acostumados a representar strings como matrizes com terminação nula. O comportamento de String
é agora o que era naquela época, e isso é bom; sutilmente alterar o comportamento mais tarde poderia ter efeitos indesejáveis e surpreendentes em programas de trabalho.
Como observação, você pode usar String.intern()
para obter uma representação canônica (internada) da string, após a qual as comparações podem ser feitas com ==
. Internar leva algum tempo, mas depois disso, as comparações serão muito rápidas.
Adição: diferentemente de algumas respostas sugeridas, não se trata de dar suporte à sobrecarga do operador . O operador +
(concatenação) funciona em String
s, embora o Java não suporte a sobrecarga do operador; é simplesmente tratado como um caso especial no compilador, resolvendo para StringBuilder.append()
. Da mesma forma, ==
poderia ter sido tratado como um caso especial.
Então, por que surpreender com o caso especial +
, mas não com ==
? Porque, +
simplesmente não compila quando aplicado a objetos que não sejam String
, o que é rapidamente aparente. O diferente comportamento de ==
seria muito menos aparente e, portanto, muito mais surpreendente quando ele atinge você.