在Java 5中,如果我有一个Set,我将两个对象添加到Set。当我检索对象时,它会以我添加的顺序返回给我吗? 我无法找到答案。它取决于我使用的Set实现吗?
答案 0 :(得分:9)
是的,这取决于您使用的实施方式。例如,LinkedHashSet
将保留广告订单:
Set接口的哈希表和链表实现,具有可预测的迭代顺序。此实现与HashSet的不同之处在于它维护了一个贯穿其所有条目的双向链表。此链接列表定义迭代排序,即元素插入集合(插入顺序)的顺序。请注意,如果将元素重新插入到集合中,则不会影响插入顺序。 (如果s.contains(e)在调用之前立即返回true,则调用s.add(e)时,将元素e重新插入到集合中。)
...但HashSet
不会:
它不保证集合的迭代顺序;特别是,它不保证订单会随着时间的推移保持不变。该类允许null元素。
答案 1 :(得分:2)
直接来自the documentation:
元素以无特定顺序返回(除非此组是 一个提供保证的类的实例。
答案 2 :(得分:0)
取决于Set
实施。 LinkedHashSet
正是这样做的。
答案 3 :(得分:0)
是的,它取决于您选择的实施方式。 HashSet不保证订单,LinedHashSet也会。
答案 4 :(得分:0)
JavaDocs是你最好的朋友。它是特定于实现的。例如:
java.util.Set:
Iterator<E> iterator();
Returns an iterator over the elements in this set. The elements are returned in no particular order (unless this set is an instance of some class that provides a guarantee).
和
java.util.TreeSet:
public Iterator<E> iterator();
Returns an iterator over the elements in this set in ascending order.
答案 5 :(得分:0)
Set
接口本身用于无序容器实现。但是可能会有Set
的实现以特定的顺序返回元素。
另请参阅Set.iterator
的文档:
返回此set中元素的迭代器。元素以无特定顺序返回(除非此集合是某个提供保证的类的实例)