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文档!