hashCode 必须与该对象保持一致 - 对于任何对象 o,o.hashCode()应返回相同的 int 值。
但是,这不一定是从一个运行时间到另一个运行时: o.hashCode() 可以返回一些其他值,这specs完全没问题。
HashMap 根据 hashCode 值计算右移位。
我的问题是:这个值在一个会话到另一个会话之间如何处理? 序列化是否具有处理此问题的功能?
所以,假设我构建了一个哈希并将其存储在磁盘上。 2周后,我调用了应用程序,我 运行它。我在哈希中查找一个对象。通过这些, hashCode 这个对象现在可以和以前不同了 虽然它在哈希中,但我无法找到它。
对序列化不太了解 - 但是。对不起,如果太天真。
答案 0 :(得分:7)
这是有效的,因为哈希表没有被序列化为哈希表。它们以自定义方式序列化。因此,在反序列化时,将使用新的哈希码重建哈希表。
答案 1 :(得分:2)
正如您所说,Object.hashCode()
的一般合同确实指定哈希码可以在运行之间更改。
但是,如果您需要在运行之间执行 not 更改的哈希代码,则您可以使用自己的实现来覆盖hashCode()
,以保证这一点。
您的申请要求会施加其他规则,但这些规则不会违反一般Object.hashCode()
合同。因此,您可以安全地实施符合您要求的hashCode()
,而不会有任何其他损失的风险。请注意,hashCode()
不会要求哈希码在运行之间有所不同,它只允许它。
顺便说一下,规范允许这样做的原因是因为基本实现只返回对象的内存地址,这在运行之间可能不同。这有时适合快速,一次性使用,但通常不适用。您通常希望实现一个基于业务值计算哈希码的hashCode()
,这在运行之间是一致的,对于在业务级别相同的对象(即两个Integer
实例)是相同的具有相同的价值)。
正如Robin Green所指出的,Java的HashMap
实现了自定义序列化,该序列化与存储时对象的哈希值无关。 然而,如果您要实现自己的哈希表,并且只是存储对象的哈希值,那么 not 可以保证在反序列化哈希表后找到对象(当然,除非您只使用一致的hashCode()
将对象存储在其中)。
答案 2 :(得分:1)
序列化哈希表时,序列化值,而不是哈希码。序列化哈希码是一个坏主意。