首页 新闻 会员 周边

HashSet中链表或红黑树中的元素打印规则是什么?

0
悬赏园豆:50 [待解决问题]

例:

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元素打印规则是什么?

WensZz的主页 WensZz | 初学一级 | 园豆:152
提问于:2021-11-05 09:13
< >
分享
所有回答(2)
1

首先你的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);
}
yytxdy | 园豆:1680 (小虾三级) | 2021-11-05 09:41
0

建议看一下HashMap的源码

寻觅beyond | 园豆:923 (小虾三级) | 2021-11-09 00:09
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册