To ze względu na optymalizację pamięci wykonywanej przez kompilator ... mianowicie String
stałe (tj - String
s wykonane przez tego samego String
dosłowny) używają tego samego String
obiektu od Strings
są niezmienne. Operator ==
sprawdza tylko, czy dwa obiekty są tym samym rzeczywistym obiektem.
Jeśli uda ci się złapać książkę Java Puzzlers autorstwa Joshua Blocha i Neala Gaftera, spójrz na puzzle 13, "Animal Farm" ... ma świetne rady na ten temat. Mam zamiar skopiować jakiś istotny tekst:
"Być może zdajesz sobie sprawę, że stałe kompilacyjne typu String
są internowane [JLS 15,28]. Innymi słowy, dowolne dwa stałe wyrażenia typu String
, które oznaczają tę samą sekwencję znaków, są reprezentowane przez identyczne odniesienia do obiektów ...Twój kod powinien rzadko, jeśli w ogóle, zależeć od interakcji ciągów stałych. Interning został zaprojektowany wyłącznie w celu zmniejszenia wielkości pamięci maszyny wirtualnej, a nie jako narzędzie dla programistów ... Porównując referencje do obiektów, należy użyć metody equals
zamiast operatora ==
, chyba że konieczne jest porównanie tożsamości obiektu, a nie wartości .”.
to z powyższym odnośniku wspomniałem ... stronach 30 -. 31 w mojej książce
Aby uzyskać informacje o puli napisów, zajrzyj na wikipedia: http://en.wikipedia.org/wiki/String_interning (+1 ten sam pomysł) –
Tak, literały łańcuchowe są automatycznie internowane, zgodnie z metodyką intern internation API - http : //java.sun.com/javase/6/docs/api/java/lang/String.html – Ash
To nie tylko literały są internowane, ale także stałe w czasie kompilacji. –