日期:2014-05-20  浏览次数:20739 次

java 关于equal方法的疑问
《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()方法


原文中对equal方法做出了这两种说明:
(比较两个对象的实际内容是否相同)( 这是由于equals()的默认行为是比较引用)
这不是有矛盾吗? 这是为什么?求大神指点一二~~


------解决方案--------------------
没有感觉说的很矛盾啊,你自己的类不为true,是因为你没有重写equals()方法啊
------解决方案--------------------
首先,Integer 是引用类型int是基本类型。
基本类型不是类,没有equals()方法。

所有类都继承自Object

Java code
            public static void main(String[] args) {
        // TODO Auto-generated method stub
        Object object = new Object();
        Object object2 = new Object();
        System.out.println(object.equals(object2));
        object = object2;
        System.out.println(object.equals(object2));
    }

------解决方案--------------------
//这个例子你试试
public class test2{
int a=0;
public test2(int b){
this.a=b;
}

public boolean equals(Object obj) {
test2 bb=(test2)obj;
if(this.a==bb.a){
return true;
}else{
return false;
}
}

public static void main(String args[]){
test2 a=new test2(0);
test2 b=new test2(0);
if(a==b){System.out.println("等于");}else{System.out.println("不等于");}
if(a.equals(b)){System.out.println("等于");}else{System.out.println("不等于");}

}
}
//上面的结果是 不等于和等于
//把上面我重写的public boolean equals(Object obj)方法删除
//删除后结果是 不等于不等于
//为什么?
//因为他去调用了系统默认equals,也就是Object类的equals
//他默认是下面这样比对的,那当然就不等于了
public boolean equals(Object obj) {
return (this == obj);
}
//所以自己的类需要自己重写equals,当然深入点对比是hashcode开始的。
------解决方案--------------------
探讨

引用:

没有感觉说的很矛盾啊,你自己的类不为true,是因为你没有重写equals()方法啊

Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(n1.equals(n2));
这句不也是没有重写equal方法么

------解决方案--------------------
Integer是重写了的他的equals就不是简单的this==object了,封装好了的都有重写。
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
------解决方案--------------------
Integer n1 = Integer(47);
是基础类型包装类,也就是说现在的n1是对象不是int基础类型!

把int包装成啦Integer对象类型!


还有就是Integer这个对象有自己的equals()方法,就是说有自己的怎么比较两个数相等的具体实现。

你自己的类Value,也有equals()方法,不过是父类的Object的equals的方法。


也就是说你比较v1和v2时用的是Object的比较规则,当然不适用你自己的类啦!

还有要说的是一般重写equals方法时,一般也要重写hashCode()方法!

对楼主的唯一忠告就是多看API文档,,,,,,,,,,看看就知道为什么啦!!!!

自己有什么不懂得方法,先查API文档!