【问题标题】:storing hashmap in specific memory in java在java中的特定内存中存储hashmap
【发布时间】:2017-04-07 10:08:16
【问题描述】:

有没有办法将 HashMap 存储在特定的内存位置或特定的内存区域中(假设内存地址从 0 到 100)。

据我了解,可以通过修改 hashCode() 函数来实现。任何人都可以分享相同的代码吗?

【问题讨论】:

  • 如果内存是指堆,答案是否定的
  • 你为什么要这样做?

标签: java hashmap heap-memory


【解决方案1】:

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() 的通用合约

如您所见,它遵循上面指定的合同

希望对你有帮助

【讨论】:

  • @Aniket 你明白解释了吗?
猜你喜欢
  • 2019-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-25
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多