我正在准备 UIL 计算机竞赛,其中一个练习题涉及一组,逐字逐句如下:
HashSet<String> set = new HashSet<String>();
set.add("000");
set.add("212");
set.add("211");
set.add("555");
set.add("343");
System.out.println(set);
现在,我知道 HashSet 是未排序的数据结构,但显示了 2 个未排序的选项和 1 个已排序的答案选项:
A) [000, 211, 343, 212, 555]
B) [000, 211, 212, 343, 555]
c) [000, 211, 555, 343, 212]
我天真地选择了B)排序后的答案,而正确答案是A,但我仍然不明白为什么。我找到了每个字符串的哈希函数生成的哈希码:
“000”- 47664
“212”- 49619
“211”- 49618
“555”- 52629
“343”- 50674
据我所知,哈希集利用哈希表作为其后端。在这种情况下,根据哈希码,我不明白为什么答案不正确。我将代码插入 java,它会生成正确答案选择的结果。这是怎么回事,HashSet 究竟是如何向自身添加项的?
最佳答案
由于后备数组可能小于哈希码,因此顺序不仅仅由 hashcode()
确定,而是由 hashcode() % arr.length;
确定。支持数组的默认大小为 16
,因此如果您计算列出的哈希码的模,您将获得正确的顺序。
对于具有相同哈希码的元素,最先插入的元素也是第一个被打印的元素。这是因为存储桶保存了同一存储桶中所有对象的列表(并使用 equals()
来确定它们是否是相同对象,或者它们只是碰巧获得相同的桶)。
关于java - String HashSet 生成的输出与 String Hash 函数不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48469172/