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

时间:2018-06-11 14:49:35

标签: 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);
}

我得到以下输出:     输出:[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);
}

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

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

2 个答案:

答案 0 :(得分:4)

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

  

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

在您添加之后的几次,删除几次,您可以看到差异。

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

  

hashcode类的String - 方法也在这里发挥作用,   对于单个字符Stringhashcode将只是int   charString的价值。自char int以来   值按字母顺序排序,计算出的hashes也是如此   单char String s。

答案 1 :(得分:0)

根据Java文档:https://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html

  

它不保证集合的迭代顺序;特别是,它不保证订单会随着时间的推移保持不变。

我认为您在这里遇到的是哈希函数分布异常。 hash-function在内部用于为字符串提供整数索引。对于1长的字符串,没有太多的复杂性。当你的字符串更长时,你的哈希函数可以使用更多。

这可以追溯到哈希函数的整个概念:获取一组可能的值,并将它们尽可能均匀地映射到一组较小的值。恰好,哈希函数就像那样映射了那些字符串。你可能会看到连续数字相同的东西。而且,一旦引入更多数据,您就会开始看到它们无序。