通常,有充分的理由要能够测试两个对象引用是否指向同一对象。我写了很多次
Address oldAddress;
Address newAddress;
... populate values ...
if (oldAddress==newAddress)
... etc ...
在这种情况下,我可能具有等于函数,也可能没有。如果我这样做,则equals函数可能会比较两个对象的全部内容。通常,它只是比较一些标识符。当然,“ A和B是对相同对象的引用”和“ A和B是具有相同内容的两个不同对象”是两个截然不同的想法。
对于不可变的对象(例如字符串),这确实是一个小问题。对于不可变的对象,我们倾向于认为对象和值是同一件事。好吧,当我说“我们”时,至少是“我”。
Integer three=new Integer(3);
Integer triangle=new Integer(3);
if (three==triangle) ...
当然返回的是false,但是我可以看到有人认为它应该是真实的。
但是一旦您说==通常比较对象的引用句柄而不是内容,对Strings进行特殊处理可能会造成混淆。正如这里的其他人所说,如果要比较两个String对象的句柄怎么办?会有一些特殊的功能仅对字符串吗?
那...
Object x=new String("foo");
Object y=new String("foo");
if (x==y) ...
是因为它们是两个不同的对象,所以是错误的;还是因为它们是内容相等的String,所以是true?
所以,是的,我了解程序员如何对此感到困惑。我自己做了,我的意思是当myString ==“ foo”时写myString.equals(“ foo”)。但是除了重新设计所有对象的==运算符的含义之外,我看不到如何解决它。
==
对象相等和eq
引用相等(ofps.oreilly.com/titles/9780596155957/…)。