Es debido a una optimización de la memoria realizada por el compilador ... a saber, String
constantes (es decir, - String
s hechas por el mismo String
literal) utilizan el mismo objeto desde String
Strings
son inmutables. El operador ==
simplemente comprueba que dos objetos son el mismo objeto real.
Si puedes agarrar el libro Java Puzzlers de Joshua Bloch y Neal Gafter, y mira el rompecabezas 13, "Animal Farm" ... él tiene buenos consejos sobre este tema. Voy a copiar un texto relevante:
"Usted puede ser consciente de que las constantes de tiempo de compilación de tipo String
internadas [JLS 15.28] En otras palabras, las dos expresiones constantes de tipo String
que designan la misma secuencia de caracteres son. representado por referencias de objeto idénticas ...Su código rara vez, si es que alguna vez, depende del internamiento de constantes de cadena. El internamiento se diseñó únicamente para reducir la huella de memoria de la máquina virtual, no como una herramienta para programadores ... Al comparar referencias de objetos, debe usar el método equals
con preferencia al operador ==
a menos que necesite comparar identidad de objeto en lugar de valor .."
Eso es de la referencia anterior he mencionado ... páginas 30 -. 31 en mi libro
Para obtener información sobre el grupo de cadenas, eche un vistazo a la wikipedia: http://en.wikipedia.org/wiki/String_interning (+1 misma idea) –
Sí, los literales de cadenas se internan automáticamente, según el método interno API - http : //java.sun.com/javase/6/docs/api/java/lang/String.html – Ash
No son solo literales internados, sino también constantes de tiempo de compilación. –