黑马程序员技术交流社区
标题:
关于equals和hashCode方法的问题
[打印本页]
作者:
张锐
时间:
2012-3-8 11:19
标题:
关于equals和hashCode方法的问题
equals和hashCode方法都是object定义的方法。
equals默认和==是一个效果即比较两个对象是不是完全相等而不是内容相等,所以很多子类都要重写equals方法实现自己的判断。api中对equals有这样一句话“
注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
”
我写了个例子没有重写hashCode也可以实现的要求,大家讨论下是怎么情况?
public class TestHashCode {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Dog d1 = new Dog("旺财", 5);
Dog d2 = new Dog(new String("旺财"), 5);
System.out.println(d1.equals(d2)) ;
System.out.println(d1.equals(new Integer(100))) ;
}
}
class Dog{
String name;
int age;
Dog(String name,int age){
this.name = name;
this.age = age;
}
public boolean equals(Object obj){
if(obj instanceof Dog){
Dog dog = (Dog)obj;
return this.name.equals(dog.name)&&(this.age==dog.age);
}
return super.equals(obj);
}
/*public int hashCode() {
return new String().hashCode();
}*/
}
复制代码
作者:
李会启
时间:
2012-3-8 12:30
本帖最后由 李会启 于 2012-3-8 12:32 编辑
hashcode是对象在key-value映射集合当中hash函数生成的hash码,可以通过hashcode反算出对象地址,非常适合快速查找。JAVA对象的hashcode是通过对象的地址算出来的整数,不会重复,hashcode方法就是返加这个hashcode的方法,而equals只是比较对象内容是否相等,比如比较对象中所有的属性是否相等。
作者:
马胜平
时间:
2012-3-8 13:05
d1和到d2的hashCode的值不一样,在默认的情况hanshCode方法继承于基类Object的hashCode,而基类的Object的hashCode是根据对象的地址来计算的。如果一个把一个对象put添加到HashMap集合时产生一个hashCode值而取出时是另一个hasnCode值,那么就无法重新取得该对象了。所以这时候必须根据自定义类的某些成员来重写hashCode方法且不能依赖于对象里易变的数据。
作者:
a504079589
时间:
2012-3-8 19:33
那两个的hashCode的哈希值不相同当存储自定义对象的时候,如果没有重写hashCode()方法,那么就会调用Object类的hashCode(),得到当前对象的地址,地址不同就不能去重复.
当存储对象的时候,先调用对象的hashCode()方法计算一个哈希值,然后在集合中查找是否有哈希值相同的对象,如果没有哈希值相同的对象,那么直接存入,如果有哈希值相同的对象,调用equals()方法比较,比较结果为true就不存,比较结果为fals则存入,如果希望将属性相同的对象去重复,那么属性相同的对象要返回相同的哈希值.
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2