0

代码。

Set<String> set = new HashSet<String>(3);
set.add("3 Lorem");
set.add("1 Lorem");
set.add("2 Lorem");
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
    String type = (String) iterator.next();
    System.out.println(type);
}

输出。

2 Lorem
3 Lorem
1 Lorem

这个顺序对我来说很奇怪。我添加3 Lorem, 1 Lorem,然后2 Lorem。为什么它们在输出中的顺序不同?

4

4 回答 4

9

散列集不应该被排序

从技术上讲,它们是按哈希码(或其哈希减少)排序的;并且在哈希冲突时,它们可能会溢出到其他存储桶中。

如果您想要有序集,请TreeSet改用。它通常会慢一些,但已排序。如果要保留插入顺序,请使用List诸如ArrayListLinkedList

还有一种混合,称为LinkedHashSet,它允许快速contains操作,但保持插入顺序。请注意,它不会有重复

于 2013-11-06T12:41:13.013 回答
5

JavaDocs

该类实现了由哈希表(实际上是 HashMap 实例)支持的 Set 接口。它不保证集合的迭代顺序;特别是,它不保证订单会随着时间的推移保持不变。此类允许空元素。

如果您打算更好地保持秩序,请使用TreeSet (但复杂性将是 log(n)

还要检查这篇文章 Hashset vs Treeset

正如@Petar 指出的那样编辑,以便更好地维护插入顺序,使用LinkedHashSet

这篇Dzone 文章通过很好的示例和性能展示了这三者之间的比较

于 2013-11-06T12:41:29.320 回答
3

使用 aLinkedHashSet来维护插入顺序。

于 2013-11-06T12:42:43.353 回答
1

如果要对元素进行排序,请使用TreeSet<String>();或。TreeSet<String>(String.CASE_INSENSITIVE_ORDER);如果您需要维护插入顺序,请使用 List 而不是 Set。

于 2013-11-06T12:41:40.730 回答