Set 如何确定其值的顺序?

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

我编写了一个简单的程序,它接受一个字符串数组,将其转换为列表,然后转换为集合,最后打印出来。 这是代码:

public static void main(String[] args) {
    String[] array = {"hello", "goodbye", "welcome", "thanks"};
    List<String> list = Arrays.asList(array);
    System.out.println(list);
    Set<String> set = new HashSet<String>(list);
    System.out.println(set);
}

套装回归 [你好,再见,欢迎,谢谢] [你好,谢谢,再见,欢迎]

无论我创建数组的顺序是什么,它都会以特定的顺序返回 Set。那么 Set<> 如何确定值应该按什么顺序放入呢?

java set
2个回答
4
投票

Set 中元素的顺序由其

Iterator
中元素的顺序决定,并且如 Set.iterator()

中所指定

返回的元素没有特定的顺序(除非该集合是某个提供保证的类的实例)。

因此

Set
没有固有的顺序。

然而,

Set
只是一个
interface
Set
有多种实现,do提供了保证。

  • 有一个 HashSet - 它没有 - 即它会优化自身以实现
    O(1)
    ,但代价是可预测的顺序。
  • 有一个 TreeSet - 它维护对象的自然顺序 - 即“ab”< "ac" and 1 < 10 or any order you define using a Comparator
  • 有一个 EnumSet - 按
    enum
    序数顺序排序 - 有点像
    TreeSet
  • 有一个 LinkedHashSet - 按照添加项目的顺序排列。
  • 还有其他更晦涩难懂的 Set 实现,它们也有自己的特点。

ConcurrentSkipListSet
TreeSet
类由
SortedSet
NavigableSet
接口表示。

在 Java 21+ 中,通过顺序集合

SequencedSet
接口涵盖三个类:
ConcurrentSkipListSet
LinkedHashSet
TreeSet


3
投票

HashSet
的迭代顺序是一个实现细节,可能会因版本而异。您应该假设该顺序是神奇的、难以理解的,并且可能会发生变化。

(实际上,它受到元素的哈希码、HashSet内部使用的涂抹函数以及哈希桶出现的顺序的影响。)

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