黑马程序员技术交流社区
标题:
关于哈希值的一个问题
[打印本页]
作者:
祁焱
时间:
2011-10-31 22:48
标题:
关于哈希值的一个问题
两个对象值相同(x.equals(y) == true),但却可有不同的hashcode,这句话对不对? 为什么?
作者:
肖居上
时间:
2011-10-31 22:57
对象相等则hashCode一定相等; hashCode相等对象未必相等。
作者:
张邦庆
时间:
2011-10-31 23:02
当往哈希集合中放入元素时,首先检查哈希值,两个对象的哈希值一样,还不能确定两个对象就是一样的,还要用equals判定
作者:
孙运强
时间:
2011-10-31 23:28
如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。
上面一句话来自API java中Object类的hashcode方法;
作者:
李建雄
时间:
2011-11-1 00:25
本帖最后由 李建雄 于 2011-11-1 00:27 编辑
两个对象值相同(x.equals(y) == true),但却可有不同的hashcode,这句话对不对? 为什么?
我来做一下分析:
这句话是对的, 当new两个对象时给他们的值可以相同:这时hashcode值会相同
如:Integer x=new Integer(300);Integer y=new Integer(300);
但是我们可以重写hashcode()方法,让他们产生不同的hashcode值
作者:
骚灵小情歌
时间:
2011-11-1 00:28
LS+1 {:soso_e104:}{:soso_e176:}{:soso_e192:}
作者:
白倩
时间:
2011-11-1 06:21
往集合中存放元素时首先比较的是两个对象的hashcode值如果相等还要判断它们的equals是否相等,总的来说两个对象相等它们的hashcode值一定相等,但如果两个对象的hashcode相等则对象不一定就相等因为我们可以重写它们的hashcode方法使哈希值不同。
作者:
吉许
时间:
2011-11-1 09:13
这句话是对的,在两个对象的hashcode值相同的情况下才会equals比较他们
值相同使用equals方法来判断,equals方法重写后不一定是判断对象是否是同一个对象
所以hashcode不同是很正常的
就好比我定义个类,有名字和编号
我重写equals方法,让名字相同就返回相等
那么我虽然有hashcode不同的两个对象(他们的编号都可以不同,或者两个对象的所有属性值都一样)
但他们的hashcode当然不同
因为根本就不是一个对象嘛
作者:
fso918
时间:
2011-11-1 10:36
本帖最后由 fso918 于 2011-11-1 10:37 编辑
class Student{
private id ;
private age;
public Student(int id,int age){
this.id = id;
this.age = age;
}
@Override
public int hashCode(){
return id + age;
}
@Override
public boolean equals(Object obj){
if(obj instanceof Student)
return obj.id == this.id;
return false;
}
}
class Test{
public void main(String[] args){
Student s1 = new Student(10,11);
Student s2 = new Student(10,12);
System.out.println(s1.hashCode() == s2.hashCode());
System.out.println(s1.equals(s2);
}
}
作者:
黄健
时间:
2011-11-1 11:16
对:java是灵活的,对象是自己设计的,你想让它相同它就相同,你不想让它相同它就不同。
不对:jdk中hashCode 的常规协定是:如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。
最好还是按照java协定的来,不然你用到它的其他类时会郁闷(如set集合)。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2