equals()方法个人理解

Posted on 2009-08-08 12:38 BBT_soft 阅读(1986) 评论(6)  编辑  收藏

《think in java》中有这么一段话:

如果想比较两个对象的实际内容是否相同,又该如何操作呢?此时,必须使用所有对象都使用的特殊方法equals()。但这个方法不适用于"基本类型",基本类型直接使用==和!=即可。如:

Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(ne.equals(n2));

正如我们预计的那样,此时得到的结果是true。但事实上并不总是这么简单!假设您创建了自己的类,像下面这样:
class Value{
int i;
}
public class Test{

      public static void main(String[] args){
             Value v1 = new Value();
            Value v2 = new Value();
             System.out.println(v1.equals(v2));
    }
}
此时的结果又变回了false!

这是由于equals()的默认行为是比较引用。所以除非在自己的新类中重载equals()方法,否则不可能表现出我们希望的行为。

大多数Java类库都实现了用来比较对象内容的equals()方法,而非比较对象引用的equals()方法。

个人理解:equals()默认行为是比较引用,只是现在绝大多数Java类库都实现了用来比较对象内容的equals()方法,而并没有实现比较对象引用的equals()方法。所以现在说equals()比较的是内容,如果自己的类实现比较对象引用的equals()方法,也可以说equals()比较对象的引用,只是实现问题。

Feedback

# re: equals()方法个人理解  回复  更多评论   

2009-08-09 10:19 by 戴尔笔记本
不错啊

# re: equals()方法个人理解  回复  更多评论   

2009-08-09 17:28 by 惜棋
远没有那么简单

Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(n1 ==n2);



Integer m1 = new Integer(247);
Integer m2 = new Integer(247);
System.out.println(m1==m2);

# re: equals()方法个人理解  回复  更多评论   

2009-08-09 22:18 by charleeHu
看看JDK源码不就清楚了么 ==!

# re: equals()方法个人理解  回复  更多评论   

2009-08-10 15:13 by HalZhang
不同的情况下还需要不同的比较方法,例如Hibernate的实体

# re: equals()方法个人理解[未登录]  回复  更多评论   

2009-08-10 19:42 by stanleyxu2005
It is clear that you should override the equals method for your own data type by default. BTW: Do not use "==" in general. If the object on the right side is null, an NullPointerException will be thrown.

# re: equals()方法个人理解  回复  更多评论   

2009-08-11 10:20 by 隔叶黄莺
楼主的理解恐怕把问题稍稍搞复杂了些,所谓比较内容只是 equals 方法的一个约定,如果高兴的话你可以认为两个对象只要某一个属性(如id)是相等的就是 equals 的。

所以说到底,你就看 equals() 方法的实现,看运行时具体调用了哪个 equals() 方法就行,就是面向对象的多态吗!

因为 Object 实现的 equals() 方法就是比较引用,所以如果你的类没有实现 equals() 方法,它可能调用的就是 Object 的 equals() 方法来比较引用,除非继承树中有 equals() 的其他实现。

像 String, Integer 等都自己实现了 equals() 方法,因此它们就比较了内容,说这么多看源码吧。

只有注册用户登录后才能发表评论。


网站导航: