これは、コンパイラによって実行されるメモリの最適化が原因です...つまり、String
定数 (つまり、同じリテラルString
によって作成された s ) は、不変であるため、同じオブジェクトを使用します。オペレーターは、2 つのオブジェクトが同じ実際のオブジェクトであることを確認するだけです。String
String
Strings
==
Joshua Bloch と Neal Gafter による Java Puzzlers という本を手に取り、パズル 13 の「Animal Farm」を見ていただければ... 彼はこの問題について素晴らしいアドバイスをしてくれます。関連するテキストをいくつかコピーします。
「タイプのコンパイル時定数がインターンされていることに気付いているかもしれませんString
[JLS 15.28]。つまり、同じ文字シーケンスを指定するタイプの2つの定数式はString
、同一のオブジェクト参照によって表されます...あなたのコードは、あったとしてもめったにすべきではありません。 、文字列定数のインターンに依存しますインターンは、プログラマー向けのツールとしてではなく、仮想マシンのメモリフットプリントを削減するためにのみ設計されました... オブジェクト参照を比較するときは、必要でない限り、演算子よりもequals
メソッドを優先して使用する必要があります==
値ではなくオブジェクトの同一性を比較します。」
それは私が言及した上記の参照からのものです...私の本の30〜31ページ。