3

重複の可能性:
== 演算子があるのに equals() メソッドを使用するのはなぜですか?

Javaでコードを実行しようとすると、2つの異なる出力が得られました

String txt1="Hello";
String txt2="Hello";
System.out.println((boolean)txt1==txt2);

String txt1=new String("Hello");
String txt2=new String("Hello");
System.out.println((boolean)txt1==txt2);
4

5 に答える 5

8

文字列はオブジェクトです。==文字列の内容ではなく、オブジェクト参照を比較します。そのためには、 メソッドを使用しString#equalsます。

最初の例でtxt1は、同じオブジェクトtxt2を指す 2 つの変数です。だから彼らはお互いにいます。 String==

2番目の例でtxt1は、2つの異なるオブジェクト(同じ文字シーケンスを持つ)をtxt2指しているため、それらは互いにではありません。 String==


個別に: を書く意味はほとんどありませんnew String("string literal")。それを行う本当に本当に正当な理由が具体的にわからない場合は、しないでください。低レベルのものとのやり取りに関連して、それを行う可能性がある非常に非常に珍しい状況がいくつかあります。通常の移植可能な Java コードではありません。

使用する理由がときどきnew String(String)あります(文字列リテラルではなく、 などの別の場所から取得したインスタンスsubstring)。詳細については、この記事を参照してください ( Rp-に感謝します)。

于 2012-11-05T13:03:13.207 に答える
3

==演算子は、参照が等しいかどうかをチェックします。つまり、2 つの引数が同じインスタンスである場合に戻りtrueますString

Stringリテラル (インスタンス"Hello") がクラスで発生するたびに、Stringインスタンスがインターンされます(再利用できるように内部キャッシュに格納されます)。

やった後はインターン生と全く同じリファレンスになりString txt1="Hello"ます。そう、txt1String

String txt1="Hello";
String txt2="Hello";

その結果txt1txt2同じインスタンス、つまりインターンされたインスタンスになります。

あなたがやっているとき、インターンされたインスタンスを引数としてコンストラクターをString txt1=new String("Hello")呼び出しています(一種のコピーコンストラクター)。Stringしたがって、txt1はインターンされたインスタンスと同じ値を保持する新しい Stringインスタンスになり、==演算子は を返しfalseます。

この件に関する詳細は、 3.10.5 にあります。JLS の文字列リテラルセクション。

文字列リテラルは、クラス String (§4.3.1、§4.3.3) のインスタンスへの参照です。

さらに、文字列リテラルは常に String クラスの同じインスタンスを参照します。これは、文字列リテラル (より一般的には、定数式の値である文字列 (§15.28)) が、メソッド String.intern を使用して一意のインスタンスを共有するために「インターン」されているためです。

次の質問の回答は、Java Strings がインターンされるのはいつですか? . 次のリンクでは、この件について詳しく説明しています: String Equality and Interning

補足として、equals()内容に基づいて文字列比較を実行するために使用することを忘れないでください。

于 2012-11-05T13:06:17.693 に答える
2

Java は、可能な場合、文字列をセーフ スペースに「共有」しようとします。

String txt1="Hello";
String txt2="Hello";

同じオブジェクトへの 2 つの参照 ("Hello")

String txt1=new String("Hello");
String txt2=new String("Hello");

それぞれがコピーによって初期化される、2 つの異なるインスタンスへの 2 つの参照です。

文字列を比較する場合は、常に「equals()」を使用してください。そうしないと、結果を予測するのが難しくなります。

于 2012-11-05T13:05:52.280 に答える
0

参照を比較する場合は、==演算子を使用します。

2 つの文字列の内容を比較する場合は、equalsメソッドを使用します。

于 2012-11-05T13:05:50.453 に答える
0

これを行う

String txt1="Hello";
String txt2="Hello";
System.out.println(txt1.hashCode());
System.out.println(txt2.hashCode());
System.out.println((boolean)txt1==txt2);


String txt1=new String("Hello");
String txt2=new String("Hello");
System.out.println(txt1.hashCode());
System.out.println(txt2.hashCode());
System.out.println((boolean)txt1==txt2);

Java が内部でどのように処理するかを取得できます。

于 2012-11-05T13:07:44.267 に答える