键在哈希映射中以空字符串或空输入

在空键的哈希映射中,索引为0,但对于空字符串,索引是什么。我调试了它,发现它正在第0个索引处创建一个链接列表,并将两个值都存储在那里。

那么为什么空字符串值存储在第0个位置,如果它使用空字符串的哈希图计算索引,那么空字符串的哈希代码会是什么。

HashMap<String, String> hm= new HashMap<>();
hm.put("", "");
hm.put(null, null);
慕后森
浏览 70回答 3
3回答

倚天杖

空字符串的哈希代码将至少在甲骨文的Java 8实现中。0这是 Java 1.8 中用于计算哈希值的方法的“java.util.HashMap 类”源的摘录:static final int hash(Object key) {&nbsp; &nbsp; int h;&nbsp; &nbsp; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);}这是计算哈希值的相关方法。因此,从本质上讲,这就是它计算空字符串的哈希代码的方式:System.out.println(("".hashCode()) ^ ("".hashCode() >>> 16));无论如何都会的哈希代码。使用该方法查看上面的代码。null0hash

慕婉清6462132

因为空字符串的哈希代码返回 0,并且它与 null 对象的值相同。所以你有一个哈希的冲突,所以它去了同一个单元格。*至少对于类String中的当前实现 - 有一天可能会改变

回首忆惘然

Java 中的哈希代码必须满足以下要求:在执行 Java 应用程序期间,每当在同一对象上多次调用它时,hashCode 方法必须始终返回相同的整数,前提是未修改对象上的等于比较中使用的任何信息。此整数不必在应用程序的一次执行与同一应用程序的另一次执行之间保持一致。请注意最后一句。这允许在同一应用程序的不同运行之间不可预测的哈希代码,从而防止特定类别的拒绝服务攻击。因此,没有办法预测任何特定对象(无论是实际对象还是实际对象)的哈希代码是什么。您只知道,对于同一对象和根据方法与它相等的对象,它将是相同的。nullequals
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java