为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕后森 2022-09-28 16:21:31
在空键的哈希映射中,索引为0,但对于空字符串,索引是什么。我调试了它,发现它正在第0个索引处创建一个链接列表,并将两个值都存储在那里。那么为什么空字符串值存储在第0个位置,如果它使用空字符串的哈希图计算索引,那么空字符串的哈希代码会是什么。HashMap<String, String> hm= new HashMap<>(); hm.put("", ""); hm.put(null, null);
查看完整描述

3 回答

?
倚天杖

TA贡献1828条经验 获得超3个赞

空字符串的哈希代码将至少在甲骨文的Java 8实现中。0


这是 Java 1.8 中用于计算哈希值的方法的“java.util.HashMap 类”源的摘录:


static final int hash(Object key) {

    int h;

    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);

}

这是计算哈希值的相关方法。


因此,从本质上讲,这就是它计算空字符串的哈希代码的方式:


System.out.println(("".hashCode()) ^ ("".hashCode() >>> 16));

无论如何都会的哈希代码。使用该方法查看上面的代码。null0hash


查看完整回答
反对 回复 2022-09-28
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

因为空字符串的哈希代码返回 0,并且它与 null 对象的值相同。所以你有一个哈希的冲突,所以它去了同一个单元格。

*至少对于类String中的当前实现 - 有一天可能会改变


查看完整回答
反对 回复 2022-09-28
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

Java 中的哈希代码必须满足以下要求

  • 在执行 Java 应用程序期间,每当在同一对象上多次调用它时,hashCode 方法必须始终返回相同的整数,前提是未修改对象上的等于比较中使用的任何信息。此整数不必在应用程序的一次执行与同一应用程序的另一次执行之间保持一致。

请注意最后一句。这允许在同一应用程序的不同运行之间不可预测的哈希代码,从而防止特定类别的拒绝服务攻击。

因此,没有办法预测任何特定对象(无论是实际对象还是实际对象)的哈希代码是什么。您只知道,对于同一对象和根据方法与它相等的对象,它将是相同的。nullequals


查看完整回答
反对 回复 2022-09-28
  • 3 回答
  • 0 关注
  • 69 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信