Java中未排序的HashSet

问题描述 投票:0回答:4

码。

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 Lorem1 Lorem,然后2 Lorem。为什么它们在输出中的顺序不同?

java hashset
4个回答
4
投票

来自JavaDocs

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

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

还查看这篇文章Hashset vs Treeset

正如@Petar所指出的编辑为了更好地使用LinkedHashSet来维护插入顺序

而这个Dzone Article展示了三者之间的比较,以及不同的例子和表现


8
投票

散列集不应该排序。

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

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

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


2
投票

使用LinkedHashSet维护插入顺序。


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.