【发布时间】:2017-04-07 10:08:16
【问题描述】:
有没有办法将 HashMap 存储在特定的内存位置或特定的内存区域中(假设内存地址从 0 到 100)。
据我了解,可以通过修改 hashCode() 函数来实现。任何人都可以分享相同的代码吗?
【问题讨论】:
-
如果内存是指堆,答案是否定的
-
你为什么要这样做?
标签: java hashmap heap-memory
有没有办法将 HashMap 存储在特定的内存位置或特定的内存区域中(假设内存地址从 0 到 100)。
据我了解,可以通过修改 hashCode() 函数来实现。任何人都可以分享相同的代码吗?
【问题讨论】:
标签: java hashmap heap-memory
hashCode() 的目的只是成为运行代码的 VM 中 distinct java 对象的唯一 ID。它确实不影响对象在 VM 使用的虚拟内存中的位置。 反之亦然,至少在 Object 的方法实现中,hashCode() 会为您提供一个整数,描述该对象在此虚拟内存中的地址。
如果您要更改它,您应该遵循这些准则。我认为来自 Java 文档的 this 解释可以让事情变得清晰:
hashCode的一般合约是:
每当在同一对象上多次调用它时 执行 Java 应用程序时,hashCode 方法必须一致 返回相同的整数,只要不使用 equals 中的信息 对象上的比较被修改。这个整数不需要保留 从应用程序的一次执行到另一次执行一致 相同的应用程序。
如果两个对象根据 equals(Object) 方法,然后在每个对象上调用 hashCode 方法 两个对象必须产生相同的整数结果。 .
如果两个对象不相等,则不需要根据 equals(java.lang.Object) 方法,然后调用 hashCode 方法 这两个对象中的每一个都必须产生不同的整数结果。 然而,程序员应该意识到产生不同的 不相等对象的整数结果可以提高 哈希表。
Object 类定义的 hashCode 方法确实为不同的对象返回不同的整数。
下面是实现部分:
(这通常通过将对象的内部地址转换为整数来实现,但JavaTM编程语言不需要这种实现技术。)
编辑:
在 HashMap 的情况下,hashCode() 方法继承自 AbstractMap,并按照 Java documentation 中的描述工作:
返回此地图的哈希码值。地图的哈希码是 定义为地图中每个条目的哈希码之和 entrySet() 视图。这确保了 m1.equals(m2) 意味着 m1.hashCode()==m2.hashCode() 对于任意两个映射m1和m2,根据需要 由 Object.hashCode() 的通用合约。
如您所见,它遵循上面指定的合同
希望对你有帮助
【讨论】: