对于一些教程,他们说:
\n\n\n\n\nHashSet 不保持任何顺序,元素将以任何随机顺序返回。
\n
但我写了一个测试程序,结果总是一样的。
\n\nimport java.util.*;\n\npublic class HashSetDemo {\n\n public static void main(String[] args) {\n HashSet<String> hs1 = new HashSet<String>();\n hs1.add("a");\n hs1.add("b");\n hs1.add("c");\n hs1.add("d");\n hs1.add(null);\n hs1.add(null);\n System.out.println(hs1);\n System.out.println(hs1);\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n输出:
\n\n[null, a, b, c, d]\n[null, a, b, c, d]\nRun Code Online (Sandbox Code Playgroud)\n\n我尝试了很多次,但顺序总是一样的。为什么?希望有人能帮助我,提前致谢!
\n出现此行为的原因是 aHashSet由 a 支持HashMap,而 a 又由arrayofEntry对象支持。其中hash用来查找index的array。因此 a 中的元素总是有一个顺序HashSet( the 的顺序array),您只是无法保证这个顺序是什么。
据我从代码中可以看出, 的顺序由其元素的HashSet计算顺序决定(或至少影响)hashes。然后,使用相对简单的输入(例如单个字符串),人们可能会假设 存在严格的排序hashes,这将为您提供看似自然的排序。对于更复杂的对象,因此更复杂的hash计算,hashes将会更加分散,并且排序“更加随机”。
此外,正如已经指出的那样,“不保证排序”并不意味着“保证随机排序”。
hashcode该类的 - 方法也在String这里发挥作用,对于单个字符Strings ,它将hashcode只是. 由于的值是按字母顺序排列的,因此单个s 的计算结果也将按字母顺序排列。intcharStringcharinthasheschar String