java中对象的一致哈希码

时间:2010-11-12 07:24:47

标签: java hashcode

在java中当我们多次运行应用程序时,是否可以为对象获取一致的哈希码

6 个答案:

答案 0 :(得分:5)

不确定。例如,如果它是一个String,那么String.hashCode()每次运行应用程序时都会给出一致的哈希码。

如果哈希码包含除了对象组件字段的值之外的其他内容,则只会遇到麻烦;例如身份哈希码。当然,这意味着对象类需要在某些时候覆盖Object.hashcode(),因为该方法为您提供了一个标识哈希码。

关注

从对其他答案的评论来看,OP似乎仍在追求独特哈希函数的虚幻目标;即一些函数,它将(例如)任何String映射到对所有可能的字符串都唯一的哈希码。

不幸的是,在一般情况下这是不可能的,在这种情况下。此外,构建证明是一件简单的事情,生成唯一String值的intint哈希函数在数学上是不可能的。 (我不会厌烦你的细节......但证据的基础是String值比int值更多。)

实际上,这种散列函数可能的唯一情况是输入类型的所有可能值的集合的大小不大于整数类型的可能值的数量。哈希函数会将bytecharshortint映射到唯一的int,但是哈希函数会映射{{1}值为唯一long值是不可能的。

答案 1 :(得分:1)

这取决于对象

hashCode()方法的实现

它也可以是

public int hashCode() {

    return 1;

  }

答案 2 :(得分:0)

不,不是一般的对象。具有自己的哈希码方法的对象可能在运行中保持一致。

答案 3 :(得分:0)

实现/覆盖所有对象的public int hashCode()方法?

答案 4 :(得分:0)

您必须决定使对象相同的原因。通常它基于一个或多个字段的内容。在这种情况下,您应该根据这些字段创建hashCode。 (等于())

但是,我建议您不要依赖于应用程序运行之间的hashCode相同。当您更改代码时很可能会破坏,而在修改代码时很难修复。例如如果您添加/删除属于hashCode的字段或更改hashCode的计算方式或者任何ti依赖的方式,hashCode将会更改。

你想做什么?这听起来像一个问题,其中一个不同的解决方案会更好。

答案 5 :(得分:0)

查看contract of hashCode

  
      
  • 每当在同一个对象上多次调用它时   执行Java应用程序,   hashCode方法必须一致   返回相同的整数,提供否   用于等比较的信息   对象被修改。 :此   整数不需要保持一致   从一个应用程序的执行   到另一个执行相同的   应用
  •   
  • 如果两个对象根据equals(Object)方法相等,那么   在每个上调用hashCode方法   两个对象必须产生相同的   整数结果。
  •   
  • 如果两个物体不相等,则不需要   等于(java.lang.Object)方法,然后   在每个上调用hashCode方法   两个对象必须产生不同的   整数结果。然而   程序员应该意识到这一点   产生不同的整数结果   不平等的物体可能会改善   哈希表的表现。
  •   

因此无法保证hashCode在调用之间是euqal。实际上,有一些hashCode实现在调用中返回相同的值:String并且用于装箱的所有类型(如Integer)具有hashCode的一致返回值。仅组合成员hashCodes的对象,其中每个成员具有一致的返回值也具有此一致性。因此,在实践中,使用一个与调用一致的hashCode返回值应该是相当普遍的。