public static void main(String[] args) {
HashSet<String> hs = new HashSet<>();
for (int i = 0; i < 16; i++) {
String s = "s" + (i + 1);
System.out.println(s + "=" + s.hashCode()%16);
hs.add(s);
}
System.out.println(hs);
}
s1=14
s2=15
s3=0
s4=1
s5=2
s6=3
s7=4
s8=5
s9=6
s10=2
s11=3
s12=4
s13=5
s14=6
s15=7
s16=8
[s3, s4, s5, s6, s7, s8, s9, s11, s10, s13, s12, s15, s14, s16, s1, s2]
为什么s10会在s11的后面,明明在数组位置中更小,如果是因为链表的原因的话,那么HashSet元素打印规则是什么?
首先你的hash算法和hashmap的不一样,其次应该是对32取余,因为hashmap做了一次rehash,你可以看看这段代码,hash方法是直接copy了hashmap的,再者说,因为你这个没有hash冲突,所以他是链表还是红黑树都没关系,反正你一个node上就一个元素
public static void main(String[] args) {
HashSet<String> hs = new HashSet<>();
for (int i = 0; i < 16; i++) {
String s = "s" + (i + 1);
System.out.println(s + "=" + (hash(s) % 32));
hs.add(s);
}
System.out.println(hs);
}
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
建议看一下HashMap的源码