あなたのすべての例は、2番目のものtrue
も含めて結果でなければなりません
なんで?このクラスには、 2つの文字列が同じであるかどうかを文字ごとにチェックString
するオーバーライドされたメソッドがあります。equals
一方、Operator ==は、2つの文字列参照が同じオブジェクトを指しているかどうかをチェックします。
したがって、たとえば:
String a = new String("asd"); //new object, will add to pool though
String b = new String("asd"); //new object
String c = "asd"; //will use the pool
boolean b1 = (a == b); //false, different objects (same contents though)
boolean b2 = (a.equals(b)); //true, same contents
boolean b3 = (a == c); //false, different objects
boolean b3 = (a.equals(c)); //true, same contents
注目すべき点は、Javaが文字列をプールすることです。コード内のどこかで文字列リテラルを使用すると、JVMはその値をプールし、コード内の別の場所で再び使用すると、JVMはそれを検出し、参照をポイントします。文字列は不変なので、これは完全に安全です。
最後に強調したいのは構成String b = new String("asd");
です。この場合、新しいStringオブジェクトが作成されます(演算子のためnew
)。「asd」が文字列プールにすでに存在する場合でも、文字列b
は新しいオブジェクトを使用して別のメモリ位置を指します。
「asd」がプールに存在しなかった場合、プールされていないb
領域を指すだけでなく、万が一の場合に備えて「asd」もプールに追加されます(将来の参照用)。