Java中未排序的HashSet

Mak*_*iev 0 java hashset

码.

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);
}
Run Code Online (Sandbox Code Playgroud)

输出.

2 Lorem
3 Lorem
1 Lorem
Run Code Online (Sandbox Code Playgroud)

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

Ano*_*sse 8

散列集不应该排序.

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

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

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

  • 他应该使用`LinkedHashSet`来维护插入顺序. (3认同)

exe*_*ian 5

JavaDocs

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

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

还要检查这篇文章 Hashset vs Treeset

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

这篇Dzone 文章展示了这三者之间的比较,并提供了很好的示例和性能