/** HashMap.class **/
final int hash(Object k) {
int h = 0;
if (useAltHashing) {
if (k instanceof String) {
return sun.misc.Hashing.stringHash32((String) k);
}
h = hashSeed;
}
h ^= k.hashCode(); // 竟然执行了这里,你看哈,k.hashCode()不就已近和s1的相同了吗,为什么还要后面的算法呢?
// This function ensures that hashCodes that differ only by
// constant multiples at each bit position have a bounded
// number of collisions (approximately 8 at default load factor).
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}作者: 夏振博 时间: 2013-2-22 14:33
我是这么理解的,不知道对不对,作为参考
HashSet
它依赖元素类型hashCode()和equals()来保证唯一性,如果hashCode()相等,再使用equals()比较,如果hashCode()不相等,就不再使用equals()比较。
你存进去的是字符串,字符串重写了hashCode()和equals(), 就是说你的集合里只存进去了一个"zhangjinyu"
HashSet从类 java.util.AbstractSet 继承了hashCode(),它是每个元素hashCode()的叠加,正好你里面只有一个,如果再向集合添加不同元素 它们的hashCode()就不一样了
AbstractSet源码: