以下に示すように、新しいキーワードを使用せずに、文字列のプールに2つの文字列を作成しています
String s="abc";
String s1="def";
以下に示すように、上記の2つの文字列を連結してもう1つ作成しています
String s3=s+s1;
System.out.println(s3==s+s1);
結果は偽です。
結果の背後にある理由を知りたいのですが、不変性、つまり文字列の状態を変更できないためですか。
ご存じのとおり、==
演算子はオブジェクトの内容ではなく、オブジェクトの参照を比較します。true
オペランドが同じ物理オブジェクトである場合にのみ返されます。
ここで返される理由false
は、単純に、連結が 2 回行われ、結果として 2 つの異なる計算String
オブジェクトになるためです。Java コンパイラは、コンパイル時に両方の式を評価するほど積極的ではなく、実行時にString
連結の結果がインターン プールに追加されません。
==
参考比較です。オブジェクトの比較が必要な場合は、使用する必要があります.equals
文字列連結について。
http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.5から
実行時に連結によって計算された文字列は新しく作成されるため、区別されます。
「==」演算子は、メモリ内のオブジェクトの場所を比較するか、参照を比較します
Java String クラスは、実際には Object クラスのデフォルトの equals() 実装をオーバーライドします。メソッドをオーバーライドして、メモリ内の位置ではなく、文字列の値のみをチェックするようにします。
したがって、s3.equals(s+s1) を比較すると、true が返されます。
ルール: 文字列を .equals() と比較する
これは一般的すぎるかもしれませんが、今のところそのルールに従ってください
はい、文字列は不変ですが、実行時に作成された文字列はシングルトンではありません。したがって、同じ文字シーケンスを含む 2 つの String インスタンスが存在する可能性があります。
両方の文字列は同じですが、同じではありません (これは == 演算子でテストするものです)。