经常听人说equlas和==的区别是
equals是比较俩个对象的值.
而==是比较俩个对象的内存地址.
今天我在jdk1.6的源代码中看到java.lang.Object的equals()方法是这样实现的
public boolean equals(Object obj) {
return (this == obj);
}这实际上说明equals也是在比较内存地址,因为==本身就是在比较内存地址.
但是经过我的测试
equals确实是在比较值.而==是否在比较内存地址,我就迷茫了,请看例子:
Integer i = new Integer(1);
Integer i1 = new Integer(1);
System.out.println(i.equals(i1));//打印true
System.out.println(i.hashCode() + " " + i1.hashCode());//打印1 1
if(i == i1) {
System.out.println("success");//什么都没打印
}
我迷茫的前提是,我认为hashCode就是代表内存地址,所以我不确定==是否是在比较内存地址.
换成String结果也是一样.
希望高手能做解答
注:我自己用的jdk1.5 但是看的源代码是1.6的 所以不知道2个版本之间是否有改动.
申明一下这个不是无聊乱研究,我只是没事瞎逛突然一下看到源代码是实现才有所反思的.
equals是比较俩个对象的值.
而==是比较俩个对象的内存地址.
今天我在jdk1.6的源代码中看到java.lang.Object的equals()方法是这样实现的
public boolean equals(Object obj) {
return (this == obj);
}这实际上说明equals也是在比较内存地址,因为==本身就是在比较内存地址.
但是经过我的测试
equals确实是在比较值.而==是否在比较内存地址,我就迷茫了,请看例子:
Integer i = new Integer(1);
Integer i1 = new Integer(1);
System.out.println(i.equals(i1));//打印true
System.out.println(i.hashCode() + " " + i1.hashCode());//打印1 1
if(i == i1) {
System.out.println("success");//什么都没打印
}
我迷茫的前提是,我认为hashCode就是代表内存地址,所以我不确定==是否是在比较内存地址.
换成String结果也是一样.
希望高手能做解答
注:我自己用的jdk1.5 但是看的源代码是1.6的 所以不知道2个版本之间是否有改动.
申明一下这个不是无聊乱研究,我只是没事瞎逛突然一下看到源代码是实现才有所反思的.
因为equals是个方法,是可以被子类重载的
所以,Object的equals比较地址是可以理解的,它就是为了让你自己在设计类的时候重写equals方法来达到比较值的效果
你的例子中比较的是integer,所以你要查的不是object方法的equals的内容,而是integer的
查查看吧,会明白的
而equals(Object o)是个方法,在别的类里面必要的时候会重写这个方法(当然,重写equals的同时要重写hashcode) 因为每个类都是Object类的直接子类或者间接子类, 而你上面说的Integer和String类, 你有没有看看这两个类里面的equals是怎么实现的呢? 我以前看到过String类equals的方法,代码记得不太清, 实现过程是两个String逐个字符比较. 因为char是可以用==判断值相等的..
有想法是好事..大家一起探讨下吧
return (this == obj);
}
this == obj 实际上应该是这样的 this.toString() == obj.toString()
而==是比较俩个对象的内存地址.
Object类的equal方法,判断的是两个引用所指向的对象是否相同,如果相同返回TRUE
其他类都默认继承这个类,要想正确比较,必须重写这个方法,举个例子
class Test{
private int id;
private String name;
....
public boolean equals(Object obj){
if(this==obj){ //首先判断两个引用指向的对象是不是相同,如果相同,肯定相等了,返回TRUE
return true;
}
if(obj instanceof Test){ //判断obj是不是TEST,如果说不是,比较的时候可能出现异常
Test t = (Test) obj; // 转型
if(this.id==t.id ....){ //根据不同类的要求,选取比较条件,
可以直接根据id是否相等判断this.id==t.id ,也可以根据this.name.equals(t.name)判断,
当然也可以根据两个条件一起判断this.id==t.id && this.name.equals(t.name)
return true;
}
}
}
}
private String name;
private String sex; //getter and setter...
}
现在新建两个实例:Customer c1 = new Customer();
Customer c2 = new Customer();
c1.equals(c2); //始终是返回false.这就是因为它继承了Object的equals(Object obj)方法;而String类:String a = new String("abc");
String b = new String("abc");
a.equals(b); //返回true,因为String类重写了equals(Object obj)方法
你可以打印他们的hashcode看看是否一样
有些类重写了equal 所以他们不一样
你可以用String和Stringbuffer分别试一试他们的打印效果就不同
因为String重写了equal方法二后者没有
同4楼所说的你查的是object的方法而非integer的equal方法jdk:
boolean equals(Object anObject)
比较此字符串与指定的对象。
上面是string的jdk中的equal
因为除了object外的所有类都继承object
所以既然string中有此方法就说明 他 已经重写了这个方法具体为:
equals
public boolean equals(Object anObject)比较此字符串与指定的对象。当且仅当该参数不为 null,并且是表示与此对象相同的字符序列的 String 对象时,结果才为 true。 覆盖:
类 Object 中的 equals
参数:
anObject - 与此 String 进行比较的对象。
返回:
如果 String 相等,则返回 true;否则返回 false。
另请参见:
compareTo(java.lang.String), equalsIgnoreCase(java.lang.String)