《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()的默认行为是比较引用)
这不是有矛盾吗? 这是为什么?求大神指点一二~~
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()的默认行为是比较引用)
这不是有矛盾吗? 这是为什么?求大神指点一二~~
解决方案 »
- Values currencyLov = null; 表示的什么意思?
- List与String转化问题
- Java里还能这么用吗?
- jb连sql server时出现问题,帮我看下好吗
- 在java应用程序中,如果在屏幕任意处显示图片?
- JTree的奇怪问题
- 求一个思路,关于界面的问题
- 当ResultSet执行SQL成功后,我如何取得ResultSet的记录部条数
- 哥们! 知不知道有什么方法能获取数据库中的表名!
- 大家谁能帮助我解决下面这个java入门问题。我编译好再运行就这样子怎么回事?
- [20分高效结贴]关于Serializable序列化的疑惑
- JComboBox有没有,点击那个下拉三角时的触发事件啊?
Integer n2 = new Integer(47);
System.out.println(n1.equals(n2));
这句不也是没有重写equal方法么
基本类型不是类,没有equals()方法。所有类都继承自Object 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));
}
输出结果:
false
true结论:Object中的equals()是用来比较引用的。延伸:你自己建的类如果不重写equals的话就是比较引用的。
你常用的一些java基本类中是自己已经重写过equals方法的,所以比较的才是内用,不是引用
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开始的。
基本类型不是类,没有equals()方法。所有类都继承自ObjectJava 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)); }
输出结果:
false
true结论:Object中的equals()是用来比较引用的。延伸:你自己建的类如果不重写equals的话就是比较引用的。
你去看下Integer类的源码,他重写了的。
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
是基础类型包装类,也就是说现在的n1是对象不是int基础类型!把int包装成啦Integer对象类型!
还有就是Integer这个对象有自己的equals()方法,就是说有自己的怎么比较两个数相等的具体实现。你自己的类Value,也有equals()方法,不过是父类的Object的equals的方法。
也就是说你比较v1和v2时用的是Object的比较规则,当然不适用你自己的类啦!还有要说的是一般重写equals方法时,一般也要重写hashCode()方法!对楼主的唯一忠告就是多看API文档,,,,,,,,,,看看就知道为什么啦!!!!自己有什么不懂得方法,先查API文档!