有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java hashCode()值在执行之间更改

在应用程序的一次执行过程中,对象的hashCode必须与该对象保持一致-- 对于任何对象o,o.hashCode()应返回相同的int

但是,这不一定是从一个运行时到另一个运行时:o.hashCode() 可以返回一些其他值,这完全可以通过specs实现

HashMap根据hashCode值计算右屈曲

我的问题是:这个值在一个会话到另一个会话之间的变化是如何处理的? 序列化是否具有处理此问题的功能

因此,假设我构建了一个散列并将其存储在磁盘上。两周后,我调用了应用程序 运行它。我正在散列中查找一个对象。通过这些,的hashCode 此对象现在/可能与以前不同 虽然它在散列中,但我无法找到它


共 (3) 个答案

  1. # 1 楼答案

    正如您所说,Object.hashCode()的通用合同确实指定了哈希代码可以在运行之间更改

    然而,如果您需要一个在运行之间不发生变化的哈希代码,那么您只需使用自己的实现来覆盖hashCode()即可保证这一点

    您的应用程序需求会施加额外的规则,但这些规则不会违反一般的Object.hashCode()合同。因此,您可以安全地实现自己的hashCode(),满足您的需求,而不会有破坏其他任何功能的风险。请注意hashCode()不需要在运行之间区分哈希代码,它只允许它

    顺便说一下,规范允许这样做的原因是,基本实现只返回对象的内存地址,这在不同的运行中可能有所不同。这有时适用于快速、一次性的使用,但通常不适用。您通常希望实现一个hashCode(),它基于业务值计算哈希代码,在运行之间是一致的,对于在业务级别相等的对象(即两个具有相同值的Integer实例)也是相同的

    正如Robin Green指出的,Java的HashMap实现了自定义序列化,该序列化独立于存储时对象的哈希值然而,如果要实现自己的哈希表,并且只存储对象的哈希值,则不能保证在反序列化哈希表后可以找到对象(当然,除非您只在其中存储具有一致hashCode()的对象)

  2. # 2 楼答案

    序列化哈希表时,序列化的是值,而不是哈希代码。序列化哈希代码是个坏主意

  3. # 3 楼答案

    这是因为哈希表没有序列化为哈希表。它们以自定义方式序列化。当使用新的哈希表代码进行反序列化时,会重新生成哈希表