【问题标题】:Java HashMap and Object keysJava HashMap 和对象键
【发布时间】:2016-04-12 18:05:46
【问题描述】:

示例

LinkedHashMap<Long, String> myHashMap = new LinkedHashMap<>();
myHashMap.put(new Long(1), "A Value");

问题

  1. 密钥是参考还是副本?
  2. 如果我写String aValue = myHashMap.get(new Long(1));,我会得到"A Value"吗?还是我只是查询了一个不同的对象(参考),因此我会得到一个错误?

【问题讨论】:

  • 你尝试的时候发生了什么? HashMap 的 javadoc 是怎么说的?
  • javadoc 的第 5 段(“如果有很多映射...”)说了一些关于 hashCode() 的内容,但我无法完全得到我需要的答案。可以指出我需要阅读/关注的部分吗?
  • @sargas 你的问题没有提到hashCodehashCode 用于确定存储条目的数组的索引。如果过多的条目具有相同的hashCode,则会降低性能。
  • @PaulBoddington 正确。我刚刚在Map Interface documentation 中找到了我想要的东西。谢谢。

标签: java collections hashmap


【解决方案1】:
  1. 映射存储对作为参数传递的对象的引用的副本。不复制对象。
  2. 是的,您将得到“A Value”,如文档所述。 Map 将其键与 equals() 进行比较,而不是 ==(IdentityHashMap 除外)。顺便说一句,你可以很容易地测试它。

【讨论】:

  • 地图不存储对象的“hashCode()”吗?然后将哈希与 == 进行比较?如果你实现 equals() 你总是应该因为这个特定原因实现 hashCode
  • 是的,确实如此。但是相等的 hashCodes 并不意味着对象是相等的。最后,将键与 equals() 进行比较。我的观点是它不会测试键是否为==,而是测试键是否相等。
【解决方案2】:
  1. 键是对同一实例的引用。
  2. 你会得到"A Value",因为Long已经被覆盖了

    • equals() (return value == obj.longValue()),
    • hashCode() (return Long.hashCode(value))。

【讨论】:

  • 你的回答对我来说很有见地。我最终不得不阅读Map Interface's documentation 来查找此信息(而不是 HashMap 或 LinkedHashMap 的)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多