我明白为什么为两个相同的对象(通过equals
)提供相同的散列码很重要。但反之亦然,如果两个对象具有相同的哈希码,它们必须相等吗?合同是否仍然成立?我找不到可能发生这种情况的示例,因为如果所有参与equals方法的属性都被用于重写hashcode方法,那么我们始终会使用相同的对象的相同hashcode。请给出意见。具有相同哈希码的两个Java对象不一定相等吗?
回答
如果两个对象具有相同的哈希码,则它们不一定相等。否则,你会发现完美的散列函数。但情况正好相反 - 如果对象相同,则它们必须具有相同的哈希码。
+1这与散列对象一般也不相关,不仅仅是java对象。 – MByD 2011-03-26 15:08:19
考虑这个[示例](http://docs.oracle.com/javase/tutorial/java/IandI/objectclass.html)在这里'firstBook'和'secondBook'有不同的hashcode。所以你的陈述是真实的'如果对象相同,那么他们有相同的哈希码' – Fresher 2014-05-21 13:10:03
多么愚蠢的答案......他似乎没有回答为什么? – anshulkatta 2014-06-02 19:42:20
根据在Javadoc:http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#hashCode%28%29
不需要它,如果两个对象根据equals不相等(java.lang.Object)方法,则调用每个两者的hashCode方法对象必须产生不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同的整数结果可能会提高哈希表的性能。
编辑:在现实世界中,两个字符串可能具有相同的哈希码。例如,如果要存储长度为10的所有包含小写英文字母的字符串组合(如“aaaaaaaaaa”,“aaaaaaaaab”等),则不能为每个141.167.095.653分配一个唯一的哈希码。 376个组合,因为Java中的int是32位,因此最多可以有4.294.967.296个不同的值。
事实上
public int hashCode(){
return 1;
}
的问题是一个有效的哈希码实现......但可怕之一。将使所有的哈希表缓慢。 但是,您可以拥有两个具有相同哈希码的不同对象。但是这不应该是一般情况,真正的实现应该在大多数情况下为不同的值提供不同的哈希码。
奇怪的是,NumberFormat的是这违反,该建议一个Java基础类的一个示例:
多达是合理可行,通过 类对象定义的hashCode方法并返回不同的整数为不同的对象。
下面是一些代码,至少在Java的版本下我目前在Mac OS X 10.6下运行。
Numberformat nf = NumberFormat.getNumberInstance();
NumberFormat nf2 = NumberFormat.getNumberInstance();
assert nf != nf2; // passes -- they are different objects
assert !nf.equals(nf2); // passes -- they are not equal
assert nf.hashCode() != nf2.hashCode(); // fails -- same hash code
hashCode
值取决于实施。例如String
类根据值实现hashCode()
函数。这意味着
String a=new String("b");
String b=new String("b");
将有相同hashcode
但是,这是两个不同的对象。 a==b
将返回false
。
hashCode
函数的作用是允许对象快速分割成已知不同于其自身集外的所有项目的集合。假设一个人拥有1,000个项目,并将其分成十个大致相等大小的集合。拨打hashCode
的一个电话可以快速识别该物品不等于900个物品,而不必在这些物品上使用equals
。即使必须使用equals
将该项目与其他100个项目进行比较,这仍然只是将其与所有1000个项目进行比较的成本的1/10。实际上,即使在大量收集中,hashCode
通常也会消除99.9%或更多的不相等项目,最多只有少数人被检查。
哈希码方法返回整数。如果整数范围结束,那么两个不同的对象也将具有相同的散列码。所以不需要两个不同的对象具有相同的哈希码。
为了证明,如果两个对象具有相同的 的hashCode并不意味着他们是平等的
说你有两个用户定义的类
class Object1{
private final int hashCode = 21;
public int hashCode(){
return hashCode;
}
public boolean equals(Object obj) {
return (this == obj);
}
}
class Object2{
private final int hashCode = 21;
public int hashCode(){
return hashCode;
}
public boolean equals(Object obj) {
return (this == obj);
}
}
Object1 object1 = new Object1();
Object2 object2 = new Object2();
Object1 object3 = new Object1();
if(object1.hashCode() == object2.hashCode()){
// return true, because the hashcodes are same
}
but
if(object1.equals(object3)){
// will fail, because two different objects
}
- 1. 具有相同哈希码的两个不同对象的确定性排序
- 2. 两个不相等的对象具有相同的散列码
- 3. Equal对象必须具有相同的哈希码?
- 4. 同一类的两个类具有相同的哈希码,它们是否相等?
- 5. 两个相等的对象必须具有相同的toString输出吗?
- 6. 不能两个ListItem对象具有相同的值属性吗?
- 7. 哈希码值相同
- 8. rails/ruby合并两个具有相同键的哈希,不同的值
- 9. 具有相同哈希值的python哈希函数
- 10. 我可以假设两个具有相同System.identityHashCode的对象是相同的吗?
- 11. 具有相同的hashCode相等的对象不映射到相同值的HashMap
- 12. cakephp不哈希密码相同
- 13. 哈希表相同的密钥具有不同的值....?
- 14. 将哈希码给我相同的结果为具有相同属性
- 15. 检查两个哈希是否具有相同的一组密钥
- 16. HashPasswordForStoringInConfigFile - 对于相同密码的不同哈希
- 17. 将两个不相等的数组组合成哈希值
- 18. 如何检查两个哈希密码是相同的?
- 19. 的Java:用相同的哈希
- 20. 具有相同字段的自定义对象集不计算为“相等”
- 21. 确定两个对象是否相等
- 22. 两个对象有相同的引用是绝对相同的?
- 23. 两个键是相同的哈希映射在写“现有的?
- 24. Java对象相等
- 25. .NET Hashtable - “相同”键,不同的哈希
- 26. 不确定Oracle通过在对象相同的情况下拥有不同的哈希码是什么意思?
- 27. 拼合哈希有两个相同的键名(阵列)
- 28. 可以2个不同的字符串在C#中具有相同的哈希码吗?
- 29. 相同的哈希函数
- 30. 包含相同元素的两个数组不能相等吗?
见http://stackoverflow.com/questions/ 4360035/why-hashcode-can-return-the-same-value-for-different-objects-in-java – esaj 2011-03-26 15:05:42