当我开始添加价值时,Set<Integer>
我得到了排序元素。请参考这个例子:
Set<Integer> generated = new HashSet<Integer>();
generated.add(2);
generated.add(1);
generated.add(0);
在这里我得到排序Set
[0, 1, 2]
。我想在添加到generated
对象时获得价值。
当我开始添加价值时,Set<Integer>
我得到了排序元素。请参考这个例子:
Set<Integer> generated = new HashSet<Integer>();
generated.add(2);
generated.add(1);
generated.add(0);
在这里我得到排序Set
[0, 1, 2]
。我想在添加到generated
对象时获得价值。
AHashSet
没有可预测的元素顺序。使用 aLinkedHashSet
保留集合中元素的插入顺序:
Set 接口的哈希表和链表实现,具有可预测的迭代顺序。
Set<Integer> generated = new LinkedHashSet<Integer>();
generated.add(2);
generated.add(1);
generated.add(0);
首先,您第一次获得排序值只是一个巧合。如果您多次运行该代码,您将看到随机顺序的输出。那是因为 aHashSet
不会对您添加的元素强制执行任何排序。
现在要按照您插入的顺序获取元素,您可以使用LinkedHashSet
, 来维护插入顺序。
首先,关于你的问题的标题,Set<Integer>
只是声明类型,它不负责任何排序/取消排序行为,使用接口的主要原因Set
是关心唯一性 - 它不允许重复,来自Javadocs 的附加信息:
Set 是一个不能包含重复元素的集合。
其次,您获得了排序集纯属巧合,HashSet
当您在迭代时不关心顺序时使用,来自javadocs的更多信息:
它不保证集合的迭代顺序;特别是,它不保证订单会随着时间的推移保持不变。此类允许空元素。
第三,关于你在找什么:
我想在添加到生成的对象时获得价值。
那么你需要使用LinkedHashSet
which 来处理插入元素的顺序,同样来自javadocs:
该链表定义了迭代顺序,即元素插入集合的顺序(插入顺序)。请注意,如果将元素重新插入集合中,则插入顺序不受影响
您可以像这样简单地使用它:
Set<Integer> generated = new LinkedHashSet<Integer>();
第四和最后,作为附加信息,您需要注意的另一个重要集合是TreeSet
保证元素将按照自然顺序升序排序的javadocs:
元素使用其自然顺序或在集合创建时提供的 Comparator 进行排序,具体取决于使用的构造函数