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);
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);
文字列はオブジェクトです。==
文字列の内容ではなく、オブジェクト参照を比較します。そのためには、 メソッドを使用しString#equals
ます。
最初の例でtxt1
は、同じオブジェクトtxt2
を指す 2 つの変数です。だから彼らはお互いにいます。 String
==
2番目の例でtxt1
は、2つの異なるオブジェクト(同じ文字シーケンスを持つ)をtxt2
指しているため、それらは互いにではありません。 String
==
個別に: を書く意味はほとんどありませんnew String("string literal")
。それを行う本当に本当に正当な理由が具体的にわからない場合は、しないでください。低レベルのものとのやり取りに関連して、それを行う可能性がある非常に非常に珍しい状況がいくつかあります。通常の移植可能な Java コードではありません。
使用する理由がときどきnew String(String)
あります(文字列リテラルではなく、 などの別の場所から取得したインスタンスsubstring
)。詳細については、この記事を参照してください ( Rp-に感謝します)。
==
演算子は、参照が等しいかどうかをチェックします。つまり、2 つの引数が同じインスタンスである場合に戻りtrue
ますString
。
String
リテラル (インスタンス"Hello"
) がクラスで発生するたびに、String
インスタンスがインターンされます(再利用できるように内部キャッシュに格納されます)。
やった後はインターン生と全く同じリファレンスになりString txt1="Hello"
ます。そう、txt1
String
String txt1="Hello";
String txt2="Hello";
その結果txt1
、txt2
同じインスタンス、つまりインターンされたインスタンスになります。
あなたがやっているとき、インターンされたインスタンスを引数としてコンストラクターを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()
内容に基づいて文字列比較を実行するために使用することを忘れないでください。
Java は、可能な場合、文字列をセーフ スペースに「共有」しようとします。
String txt1="Hello";
String txt2="Hello";
同じオブジェクトへの 2 つの参照 ("Hello")
String txt1=new String("Hello");
String txt2=new String("Hello");
それぞれがコピーによって初期化される、2 つの異なるインスタンスへの 2 つの参照です。
文字列を比較する場合は、常に「equals()」を使用してください。そうしないと、結果を予測するのが難しくなります。
参照を比較する場合は、==
演算子を使用します。
2 つの文字列の内容を比較する場合は、equals
メソッドを使用します。
これを行う
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 が内部でどのように処理するかを取得できます。