2014-09-23 23 views
0

我写了一个简单的程序,该程序需要将一列字符串转换为一个列表,然后将其转换为最终打印的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 <>如何确定值应以什么顺序放入?

+0

其实你可以检查java源代码的内部。请记住检查数据是如何输入的以及如何在toString()方法中读取数据。请参阅http://stackoverflow.com/questions/6288377/view-java-source-code – Leo 2014-09-23 23:22:16

回答

3

在一个组中的元素的顺序是由下式确定在其Iterator的元素的顺序,并如Set.iterator()

元素指定在没有特定的顺序返回(除非该组是一些类,提供了保证的一个实例)。

所以没有固有的订单Set

但是,Set只是一个interface。有Set的各种执行,提供保证。

  • 有一个HashSet - 这不 - 即它优化自身在可预知的顺序为代价来实现O(1)
  • 有一个TreeSet - 它保持对象的自然顺序 - 即“ab”<“ac”和1 < 10或您使用Comparator定义的任何顺序。
  • 有一个EnumSet - 哪个订单按enum次序 - 有点像TreeSet
  • 有一个LinkedHashSet - 哪个订单按订单添加物品。
  • 还有其他更为晦涩的Set实现也有其自己的字符。
+0

如果没有固有的顺序,为什么这样呢,怎么会有这样的随意性,甚至创建一个随机类只是伪随机的,并且使用系统时间。那么它怎么会没有秩序呢? – PsyCode 2014-09-23 23:31:28

+0

@PsyCode - 总是有一个订单 - 关键的一点是订单只是定义了**集合的具体实现,在其他情况下,您不能假定具体的订单。这完全是一种折衷 - 通过允许'HashSet'以任何它可以实现'O(1)'插入的顺序迭代。 – OldCurmudgeon 2014-09-23 23:35:29

+0

非常感谢,非常具有描述性,它直接回答并解释我的问题!再次感谢! – PsyCode 2014-09-23 23:38:13

3

HashSet的迭代顺序是一个实现细节,可能会从发布到发布。你应该假定这个顺序是神奇的,不可思议的,并且可以改变。

(在实践中,它的影响的元件的散列码,涂抹功能HashSet的内部使用,并顺序散列桶通常显示。)