码。
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
。为什么它们在输出中的顺序不同?
来自JavaDocs:
此类实现Set接口,由哈希表(实际上是HashMap实例)支持。它不能保证集合的迭代顺序;特别是,它不保证订单会随着时间的推移保持不变。该类允许null元素。
如果你打算保持秩序更好地使用TreeSet(但复杂性将是log(n)
还查看这篇文章Hashset vs Treeset
正如@Petar所指出的编辑为了更好地使用LinkedHashSet来维护插入顺序
而这个Dzone Article展示了三者之间的比较,以及不同的例子和表现
散列集不应该排序。
从技术上讲,它们是按照哈希码(或其哈希减少)进行排序的;在哈希冲突中,它们可能会溢出到其他桶中。
如果您想要一个有序集,请改用TreeSet
。它通常有点慢,但排序。如果要保留插入顺序,请使用List
,例如ArrayList
或LinkedList
。
还有一种混合物,称为LinkedHashSet
,它允许快速的contains
操作,但保持插入顺序。请注意,它不会有重复。
使用LinkedHashSet
维护插入顺序。
如果要对元素进行排序,请使用TreeSet<String>();
或TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
。使用列表而不是设置如果需要维护插入顺序。