为什么 HashSet 对单个字母字符进行排序?

Sim*_*ols 5 java set hashset

所以我知道 HashSet 没有像 SortedSet 这样的真正的排序功能,但是我偶然发现了这一点:

当我运行以下代码时:

 public static void main(String[] args) {
    Set<String> collection = new HashSet<String>(2000);
    String[] data = {"a", "c", "g", "f", "b", "f", "b", "d","q","r","d","m"};
    for(String input: data)
    {
        collection.add(input);
    }
    System.out.println("Output: " + collection);
}
Run Code Online (Sandbox Code Playgroud)

我得到以下输出: 输出:[a, b, c, d, f, g, m, q, r]

这是按字母顺序排序的。这是为什么?由于 HashSet 不是有序集。

所以我尝试使用一串字符而不是单个字符:

public static void main(String[] args) {
    Set<String> collection = new HashSet<String>(2000);
    String[] data = {"atjre", "crj", "gertj", "fertj", "berj"};
    for(String input: data)
    {
        collection.add(input);
    }
    System.out.println("Output: " + collection);
}
Run Code Online (Sandbox Code Playgroud)

我得到以下输出: 输出:[crj, atjre, fertj, gertj, berj]

现在他们不再排序了,对此有什么解释吗?或者这只是一个随机巧合?

snr*_*snr 4

HashSet实现Set接口。这意味着无法保证元素的顺序。

此类实现 Set 接口,由哈希表(实际上是 HashMap 实例)支持。它不保证集合的迭代顺序;特别是,它不保证顺序随着时间的推移保持不变。来源

添加、删除几次后,随着时间的推移,您可以看到差异。

然而,“不保证排序”并不意味着“保证随机排序”。你的问题的确切答案是,

hashcode该类的 - 方法也在String这里发挥作用,对于单个字符Strings , 它将hashcode只是. 由于的 值是按字母顺序排列的,因此单个s 的计算结果也将按字母顺序排列。intcharStringcharinthasheschar String