【问题标题】:Hashcode value for Map Entry地图条目的哈希码值
【发布时间】:2021-04-12 06:11:19
【问题描述】:

根据 javadocs,map.entry 的哈希码定义为:

int hashCode()
  Returns the hash code value for this map entry. The hash code of a map entry e is defined to be:
    (e.getKey()==null   ? 0 : e.getKey().hashCode()) ^
    (e.getValue()==null ? 0 : e.getValue().hashCode())

请确认,是否使用按位异或运算符来计算映射条目的哈希码值?

【问题讨论】:

    标签: java hashmap hashcode hash-code-uniqueness


    【解决方案1】:

    是的,^ 表示“异或”。 Here is a list of all operators.

    这似乎是一个网络搜索会比提出一个 SO 问题更快地找到的东西。

    【讨论】:

      【解决方案2】:

      这里是从Map.Entry 中提取的实际代码,在HashMap 实现中定义。 ^ 运算符是 Java 的异或运算符。

      public final int hashCode() {
             return Objects.hashCode(key) ^ Objects.hashCode(value);
      }
      

      但是,只要满足hashCode的合同,计算方法或具体结果对用户应该没有任何影响。

      【讨论】:

      • 相反,这将是对核心 Java API 的重大更改(并且必须用任意的东西替换)。 Map.Entry 在几十个库中实现;它不会改变。
      • IDK 从那里获得实际代码。但这里是链接docs.oracle.com/javase/8/docs/api/java/util/…
      • @chrylis-cautiouslyoptimistic- 我更关注用户的角度,而不是 API 开发人员的角度。但我根据您的评论修改了我的声明。谢谢!
      • @AbhishekRaj 源位于src.zip 目录中的jdk-<version>\lib。至少在从 Oracle 或其镜像之一下载时。如果您使用 IDE(我使用 Eclipse),应该有一种方法可以将其链接到您的 IDE,以便您可以调出 API 中任何类的源代码(至少是大多数类)。
      【解决方案3】:

      是的,Map.Entry 的 hashCode() 返回键和值的 hashCode 的按位异或。

      解释不正确 - 留作上下文,因此下面的 cmets 有意义

      这确保了具有相同 hashCode() 值的 Map.Entry 对象的两个实例保证具有相同的 Key 和 Value 属性。 (假设 hashCode() 方法在用作 Key 和 Value 的类型中都被正确覆盖)

      【讨论】:

      • 当然,这完全是废话。甚至在数学上是可证明的:只有 2^32 = 40 亿个不同的哈希码(因为 hashCode() 方法返回一个 int,并且以这种方式受到限制)。还有比这更多的字符串(将 0 到 80 亿之间的每个数字变成一个字符串,就可以了)。字符串是对象,可以放在哈希图中。应用鸽子洞原理。 QED。
      • 对于两个对象的任何hashCode(),相同的哈希码绝不意味着相同的对象。但是equals() 定义的相等对象必须具有相同的哈希码。并且两个不相等的对象也可能具有相同的哈希码,但不能保证(第一句话的说法不同)。
      • @rzwitserloot 和 WJS,感谢您的更正。我可能在那里有点得意忘形了!可能应该让我的回答简单的“是”
      【解决方案4】:

      是的,它确实是一个按位异或运算符。我尝试使用 ^ 运算符对 hashcode() 方法 & 得到相同的结果。

      import java.util.*;
      class TreeMapExample {
      public static void main(String args[]) {
       // Creating TreeMap object
       TreeMap<String, Integer> tm = new TreeMap<String, Integer>();
       // Adding elements to the Map
       tm.put("Chaitanya", 27);
       tm.put("Raghu", 35);
       tm.put("Rajeev", 37);
       tm.put("Syed", 28);
       tm.put("Hugo", 32);
      
       // Getting a set of the entries
       Set set = tm.entrySet();
       // Get an iterator
       Iterator it = set.iterator();
       // Display elements
       int hash;
       while(it.hasNext()) {
          Map.Entry me = (Map.Entry)it.next();
          System.out.println("Key: "+me.getKey() + " & Value: "+me.getValue());
          System.out.println("hashcode value by method : "+me.hashCode());
          hash = me.getKey().hashCode() ^ me.getValue().hashCode();
          System.out.println("hashcode value by operator : "+me.hashCode()+"\n");
       }
      }
      }
      

      【讨论】:

        猜你喜欢
        • 2013-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-06
        • 2021-06-01
        • 1970-01-01
        • 2017-12-01
        相关资源
        最近更新 更多