键条目在HashMap中为空字符串或null

时间:2019-04-09 09:50:06

标签: java hashmap

在Hashmap中,对于null键,索引为0,但对于Empty string,索引将为0。 我对其进行调试,发现它正在第0个索引处创建一个链表并将两个值存储在那里。

那么为什么空字符串值存储在第0位,并且如果它使用空字符串的哈希图计算索引,那么空字符串的哈希码又将是什么呢?

allow read: if true;

3 个答案:

答案 0 :(得分:1)

至少在Oracle的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));

无论如何,null的哈希码将为0。使用hash方法查看上面的代码。

答案 1 :(得分:1)

因为空字符串的哈希码返回0,并且它与空对象的值相同。因此您遇到了哈希冲突,因此它会到达相同的单元格。

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

答案 2 :(得分:-1)

Java中的哈希码必须满足the following requirement

  
      
  • 只要在Java应用程序执行期间在同一个对象上多次调用它,hashCode方法就必须始终返回相同的整数,前提是不修改该对象的equals比较中使用的信息。从应用程序的一次执行到同一应用程序的另一次执行,此整数不必保持一致。
  •   

注意最后一句话。这样一来,在同一应用程序的不同运行之间就无法预测哈希码,从而防止了某种拒绝服务攻击。

因此,无法预测任何特定对象(无论是null还是实际对象)的哈希码。您只知道,根据equals方法,相同对象和与之相等的对象都是相同的。