所以我所知道的是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]
现在他们不再排序了,对此有何解释?或者这只是一个随机的巧合?
答案 0 :(得分:4)
HashSet
实现Set
接口。这意味着无法保证元素的顺序。
此类实现Set接口,由哈希表支持 (实际上是一个HashMap实例)。它不能保证 集合的迭代顺序;特别是,它并不保证 订单将随着时间的推移保持不变。 Source
在您添加之后的几次,删除几次,您可以看到差异。
但是,“不保证订购”并不意味着“保证随机排序”。你的问题的确切答案是,
hashcode
类的String
- 方法也在这里发挥作用, 对于单个字符String
,hashcode
将只是int
char
中String
的价值。自char
int
以来 值按字母顺序排序,计算出的hashes
也是如此 单char
String
s。
答案 1 :(得分:0)
根据Java文档:https://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html
它不保证集合的迭代顺序;特别是,它不保证订单会随着时间的推移保持不变。
我认为您在这里遇到的是哈希函数分布异常。 hash-function在内部用于为字符串提供整数索引。对于1长的字符串,没有太多的复杂性。当你的字符串更长时,你的哈希函数可以使用更多。
这可以追溯到哈希函数的整个概念:获取一组可能的值,并将它们尽可能均匀地映射到一组较小的值。恰好,哈希函数就像那样映射了那些字符串。你可能会看到连续数字相同的东西。而且,一旦引入更多数据,您就会开始看到它们无序。