hashCode()值在执行之间发生变化

时间:2013-12-02 22:13:56

标签: java serialization hashcode

在一次执行应用程序时,对象的

hashCode 必须与该对象保持一致 - 对于任何对象 o,o.hashCode()应返回相同的 int 值。

但是,这不一定是从一个运行时间到另一个运行时: o.hashCode() 可以返回一些其他值,这specs完全没问题。

HashMap 根据 hashCode 值计算右移位。

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

所以,假设我构建了一个哈希并将其存储在磁盘上。 2周后,我调用了应用程序,我 运行它。我在哈希中查找一个对象。通过这些, hashCode 这个对象现在可以和以前不同了 虽然它在哈希中,但我无法找到它。

对序列化不太了解 - 但是。对不起,如果太天真。

3 个答案:

答案 0 :(得分:7)

这是有效的,因为哈希表没有被序列化为哈希表。它们以自定义方式序列化。因此,在反序列化时,将使用新的哈希码重建哈希表。

答案 1 :(得分:2)

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

但是,如果您需要在运行之间执行 not 更改的哈希代码,则您可以使用自己的实现来覆盖hashCode(),以保证这一点。

您的申请要求会施加其他规则,但这些规则不会违反一般Object.hashCode()合同。因此,您可以安全地实施符合您要求的hashCode(),而不会有任何其他损失的风险。请注意,hashCode()不会要求哈希码在运行之间有所不同,它只允许它。

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

正如Robin Green所指出的,Java的HashMap实现了自定义序列化,该序列化与存储时对象的哈希值无关。 然而,如果您要实现自己的哈希表,并且只是存储对象的哈希值,那么 not 可以保证在反序列化哈希表后找到对象(当然,除非您只使用一致的hashCode()将对象存储在其中)。

答案 2 :(得分:1)

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