3

これは Java と C# に関する質問です。Object Identity(==) は、2 つのオブジェクトが同じ場所を参照しているかどうかをテストし、Obejct Equality(Equals メソッド) は、2 つの異なる (同一ではない) オブジェクトが同じ値を持っているかどうかをテストします。しかし、文字列オブジェクトの場合、Object Identity とオブジェクトの等価性は同じです。たとえば、以下の if ステートメントの 2 つのブール式が true を返す場合

string a="123";
string b="123";
if(a==b)
if(a.Equals(b))

なんでそうなの??この設計上の決定の背後にある合理的な理由は何ですか?

4

4 に答える 4

4

Java と C# はどちらも、文字列インターニングと呼ばれるメモリ節約手法を使用します。これらの言語では文字列は不変であるため、頻繁に使用される文字列 (例のようにハードコードされた文字列リテラルを含む) をプールし、メモリ内のその 1 つの文字列への複数の参照を使用してスペースを節約できます。

于 2009-12-01T07:30:20.130 に答える
3

私の知る限り、.netでは、文字列の==演算子はEquals()、オブジェクトIDの代わりに使用するようにオーバーロードされています。詳細については、次の説明を参照してください:http: //www.dotnetperls.com/string-equals

それが本当に同じオブジェクトであるかどうかを知る必要がある場合は、次を使用します。

Object.ReferenceEquals(string1, string2)
于 2011-07-21T11:21:35.987 に答える
2

実際、少なくとも Java では、文字列に対するキャッシング メカニズムがあります。落とし穴は、恒等演算子を適用すると、等しい 2 つの文字列が常に true を返すとは限らない場合があることです。次のコードは false を出力します。

String a="123";
String b="12";
b=b+"3";
System.out.println(a==b);
于 2009-12-01T07:34:41.400 に答える
0

a.equals(b) == true本当に確認したい場合は(a==b) == false、2 つの String a と b に対して false と評価される場合は、完全に過小評価されている (^^) String コンストラクタを使用できます。

String a = new String("abc");
String b = new String("abc");
if (a.equals(b)) {
   doTheyAreEqual();
   if (a != b) {
     doButNotTheSame();
   }
}
于 2009-12-01T09:26:28.943 に答える