《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开始的。
------解决方案--------------------------------------------------------
------解决方案--------------------------------------------------------
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文档!