Set如何确定其值的顺序?

时间:2014-09-23 23:19:22

标签: java set

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

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&lt;&gt;确定值应该以什么顺序放入?

2 个答案:

答案 0 :(得分:3)

HashSet的迭代顺序是一个实现细节,可能会在发行版之间发生变化。你应该假设排序是神奇的,不可思议的,并且可能会发生变化。

(实际上,它受元素的哈希码影响,HashSet内部使用的拖尾函数,以及散列桶通常出现的顺序。)

答案 1 :(得分:3)

集合中元素的顺序由其Iterator中元素的顺序决定,并在Set.iterator()中指定

  

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

因此Set没有固有的顺序。

但是,Set只是interface。 <{1}}有各种各样的实现提供保证。

  • 有一个HashSet - 它没有 - 也就是说它会以可预测的顺序为代价来优化自己以实现Set
  • TreeSet - 维持对象的自然顺序 - 即“ab”&lt; “ac”和1&lt; 10或您使用Comparator定义的任何订单。
  • 有一个EnumSet - 按O(1)顺序排序 - 有点像enum
  • 有一个LinkedHashSet - 按订单添加的顺序排序。
  • 还有其他更为模糊的Set实现,它们也有自己的特色。