java - String HashSet 生成的输出与 String Hash 函数不匹配

标签 java hashset

我正在准备 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/

相关文章:

java - Maven 和引用库

java - 如何解决SQL中锁等待超时异常?

java - 如何通过构造初始化HashSet值?

Java HashSet 包含对象

java - 从 HashMap<String, HashSet<Integer>> 获取随机值

java - 在SQL查询语句中分配变量

java - 如何禁用控制台回显

java - 可靠地写入 Java SocketChannel

java - HashSet.contains 返回 false 而它不应该返回

memory - 字典使用 Trie 还是 SortedSet?