【问题标题】:java HashMap - how to retrieve both elementsjava HashMap - 如何检索两个元素
【发布时间】:2015-07-04 06:11:41
【问题描述】:

考虑程序的一部分:-

HashMap<Object,Object> m1=new HashMap<Object,Object>();
Person p1=new Person("Raj","Sharma");
Person p2=new Person("Raj","Sharma");
m1.put(p1,"11");
m1.put(p2,"22");

Person 类也重写了 hashCode() 方法,但没有 equals() 方法

我所知道的是:由于两者具有相同的键(p1 和 p2 产生相同的哈希码),因此它们对应于相同的索引,因此在将 p1 存储在该索引中之后,当它尝试放入 p2 JVM 时,会看到两者具有相同的 hashCode ,因此再次在 p2 上进行散列并生成新索引,并将 22 存储在该索引上。

现在,如果我们尝试使用键 p1 或 p2 检索元素,

String temp=(String)m1.get(p1);     // 11

它只会返回 11,然后我们如何检索元素 22??

【问题讨论】:

  • P1 被 p2 替换。所以当你为此获得价值时。这将是放入地图中的最新值
  • person 类中没有 equals 方法,因此 p1 和 p2 键将获得不同的索引...

标签: java hash hashmap


【解决方案1】:

如果您的 Person 类同时覆盖了 hashCode 和 equals,因此 p1.equals(p2) 为真且 p1.hashCode()==p2.hashCode(),则您无法从 Map 中同时检索“11”和“22”,因为 HashMap 不允许重复键.

因此m1.put(p2,"22"); 会将“11”值替换为“22”。在这种情况下,m1.get(p1)m1.get(p2) 都将返回“22”。

Person 类也重写了 hashCode() 方法,但没有 equals() 方法

我错过了那句话。如果不覆盖equals,则p1 和p2 不是同一个键,即使它们具有相同的hashCode。 m1.get(p1) 将返回“11”,m1.get(p2) 将返回“22”。

【讨论】:

  • 我对你说的最后一行有疑问.. >>>m1.get(p2) 将返回“22”,但为什么呢? p1 和 p2 具有相同的 hashCode() 值,那么为什么这将返回 22 它应该返回 11 我认为
  • @Ronaldo7 如果两个键具有相同的 hashCode,它们将被放置在 Map 的同一个桶中。 HashMap 将使用equals 区分两者(因为您没有覆盖equals,所以p1 不等于p2)。
  • 一个有索引的桶能不能存储两个对象
  • @Ronaldo7 每个存储桶都有一个链接列表,其中包含映射到该存储桶的所有条目。
【解决方案2】:

你还需要重写 Person 的 equals 方法。当尝试检索值时,哈希码将用于计算要在哪个桶中搜索,但随后将使用 equals 方法检查传入的键是否与存储值的键完全匹配。

使用基于哈希的集合时,必须覆盖 Java 中的 equals 和 hashcode。请在此处参考 equals 覆盖合同。

http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java.lang.Object)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 2023-04-01
    • 2011-05-03
    • 2020-08-13
    相关资源
    最近更新 更多