0

次のケースを検討してください。

String cat = "cat";
String cat2 = "cat";        
out.println(cat == cat2);  // true // Uses String#equals(...)
out.println(((Object) cat) == ((Object) cat2));  // true. Object#equals(...)???
// So it should be false!

==デフォルトは、StackOverflow で回答.equalsによって比較されるオブジェクトのです。

これらをオブジェクトとしてキャストしているので、参照比較であるデフォルトの比較を使用すべきではありませんか?

4

4 に答える 4

5

はい、それはそれがしていることです。

文字列リテラルの特徴は、それらが同じオブジェクトであることです! 詳しく説明します: あなたが行っているように文字列を作成しているとき (これは文字列リテラルと呼ばれます):

String cat = "cat";
String cat2 = "cat"; 

JVM はいわゆる文字列プールを使用します。その中に文字列を保持し、プールに既にあるリテラルがコード内で見つかるたびにそれらを再利用します。したがって、cat と cat2 の両方が文字列プールから同じオブジェクトを参照しています。

一方、あなたがしたい場合:

String cat = new String("cat");
String cat2 = new String("cat"); 

次に、 newは毎回新しい String オブジェクトを作成し、文字列プールからオブジェクトを再利用しないため、 cat と cat2 は異なるオブジェクトを参照します --> 結果は想定どおりになります。

于 2013-10-20T04:11:42.910 に答える
1

Java では、コンパイル時の文字列定数はインターンされいるため、同じオブジェクトです。つまり、同じ参照catを保持します。cat2

C++ とは異なり、java は演算子をオーバーロードしないため、クラスのメソッドの実装のように、==演算子は常に参照を比較します。equals()Object

于 2013-10-20T04:12:23.353 に答える
1

2 つの変数が同じ文字列リテラルを参照する場合、JVM は変数が同じ文字列リテラルを参照するように自動的に強制します。これは、文字列が不変であるため可能です。これにより、メモリも節約されます。

于 2013-10-20T04:13:46.317 に答える
0

ここには 2 つのエラーがあります:==は「デフォルト」ではなく.equals、常に参照比較を意味し、 を使用しているかどうかは問題ではありませ.equalsん: オブジェクトをキャストしても、オーバーライドされたバージョンのメソッドが使用されるかどうかに違いはありません。 .

于 2013-10-20T04:12:04.637 に答える