一般に、2つのオブジェクト参照が同じオブジェクトを指しているかどうかをテストできるようにするには、非常に正当な理由があります。私が書いたことがたくさんありました
Address oldAddress;
Address newAddress;
... populate values ...
if (oldAddress==newAddress)
... etc ...
そのような場合、私はequals関数を持つ場合と持たない場合があります。そうすると、equals関数は両方のオブジェクトの内容全体を比較する可能性があります。多くの場合、単にいくつかの識別子を比較します。「AとBは同じオブジェクトへの参照」であり、「AとBは同じコンテンツを持つ2つの異なるオブジェクト」は、もちろん2つのまったく異なるアイデアです。
おそらく、文字列のような不変オブジェクトの場合、これはそれほど問題ではありません。不変オブジェクトでは、オブジェクトと値は同じものと考える傾向があります。まあ、「私たち」と言うとき、少なくとも「私」を意味します。
Integer three=new Integer(3);
Integer triangle=new Integer(3);
if (three==triangle) ...
もちろんそれはfalseを返しますが、私は誰かがそれが本当だと思っているのを見ることができます。
ただし、==がオブジェクト一般のコンテンツではなく参照ハンドルを比較すると言うと、文字列の特別なケースを作成すると混乱する可能性があります。ここで他の誰かが言ったように、2つのStringオブジェクトのハンドルを比較したい場合はどうでしょうか?文字列に対してのみ行う特別な機能はありますか?
そして何について ...
Object x=new String("foo");
Object y=new String("foo");
if (x==y) ...
それらは2つの異なるオブジェクトであるために偽ですか、それとも内容が等しい文字列であるために真ですか?
そう、私はプログラマーがこれに戸惑うことを理解しています。私はそれを自分でやりました。つまり、myString.equals( "foo")の場合はmyString == "foo"の場合に書き込みます。しかし、すべてのオブジェクトの==演算子の意味を再設計する以外には、その対処方法がわかりません。
==
は、オブジェクトの等価性とeq
参照の等価性です(ofps.oreilly.com/titles/9780596155957/…)。