在Hashmap中,对于null键,索引为0,但对于Empty string,索引将为0。 我对其进行调试,发现它正在第0个索引处创建一个链表并将两个值存储在那里。
那么为什么空字符串值存储在第0位,并且如果它使用空字符串的哈希图计算索引,那么空字符串的哈希码又将是什么呢?
allow read: if true;
答案 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
方法,相同对象和与之相等的对象都是相同的。