-1

以下に示すように、新しいキーワードを使用せずに、文字列のプールに2つの文字列を作成しています

String s="abc";
String s1="def";

以下に示すように、上記の2つの文字列を連結してもう1つ作成しています

String s3=s+s1;
System.out.println(s3==s+s1);

結果は偽です。

結果の背後にある理由を知りたいのですが、不変性、つまり文字列の状態を変更できないためですか。

4

5 に答える 5

3

ご存じのとおり、==演算子はオブジェクトの内容ではなく、オブジェクトの参照を比較します。trueオペランドが同じ物理オブジェクトである場合にのみ返されます。

ここで返される理由falseは、単純に、連結が 2 回行われ、結果として 2 つの異なる計算Stringオブジェクトになるためです。Java コンパイラは、コンパイル時に両方の式を評価するほど積極的ではなく、実行時にString連結の結果がインターン プールに追加されません。

于 2013-06-12T12:56:48.123 に答える
2

==参考比較です。オブジェクトの比較が必要な場合は、使用する必要があります.equals

文字列連結について。

http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.5から

実行時に連結によって計算された文字列は新しく作成されるため、区別されます。

于 2013-06-12T12:56:52.707 に答える
0

「==」演算子は、メモリ内のオブジェクトの場所を比較するか、参照を比較します

Java String クラスは、実際には Object クラスのデフォルトの equals() 実装をオーバーライドします。メソッドをオーバーライドして、メモリ内の位置ではなく、文字列の値のみをチェックするようにします。

したがって、s3.equals(s+s1) を比較すると、true が返されます。

参照: http://www.programmerinterview.com/index.php/java-questions/java-whats-the-difference-before-equals-and/

于 2013-06-12T13:03:11.270 に答える
0

ルール: 文字列を .equals() と比較する

これは一般的すぎるかもしれませんが、今のところそのルールに従ってください

于 2013-06-12T13:31:26.700 に答える
0

はい、文字列は不変ですが、実行時に作成された文字列はシングルトンではありません。したがって、同じ文字シーケンスを含む 2 つの String インスタンスが存在する可能性があります。

両方の文字列は同じですが、同じではありません (これは == 演算子でテストするものです)。

于 2013-06-12T12:56:53.673 に答える