Java Set是否保持顺序?一个方法向我返回了一个Set,并且据说数据是有序的,但是在遍历Set时,数据是无序的。是否有更好的方法来管理这个问题?该方法需要更改以返回除Set以外的其他内容吗?
Set
接口不保证元素的顺序。
它的子接口SortedSet
表示一个根据某些标准排序的集合。在Java 6中,有两个标准容器实现了 SortedSet
。它们是TreeSet
和ConcurrentSkipListSet
。
除了SortedSet
接口外,还有LinkedHashSet
类。它会记住插入元素的顺序,并以此顺序返回其元素。
LinkedHashSet是您所需的东西。
许多成员建议使用LinkedHashSet来保留集合的顺序。你可以使用这个实现来包装你的set。
SortedSet 实现可用于排序,但是为了你的目的,请使用LinkedHashSet。
同时从文档中得知:
"该实现使其客户端免受 HashSet 提供的未指定、通常混乱的排序,而不会产生 TreeSet 所关联的增加的开销。它可用于生成一个与原始集合具有相同顺序的集合副本,而不管原始集合的实现情况:"
来源: http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html
Set只是一个接口。为了保留顺序,你需要使用该接口的特定实现以及子接口SortedSet,例如TreeSet或LinkedHashSet。你可以这样包装你的Set:
Set myOrderedSet = new LinkedHashSet(mySet);
List
或 LinkedHashSet
。LinkedHashSet
,而不是 Map
。 - Marko TopolnikLinkedHashSet是HashSet的有序版本,它通过所有元素维护一个双向链表。当您关心迭代顺序时,请使用此类代替HashSet。
Set
实现的订单特征的快速摘要:
LinkedHashSet
或TreeSet
)。或者更高效地,你可以将未排序的数据添加到TreeSet
中,它会自动为你进行排序。Set.iterator()
的javadoc中可以看出:TreeSet
是Set
的一个实现,它有一个保证顺序的特性:通常情况下,集合不会保留元素的顺序,例如 HashSet 为了快速查找元素。但是你可以尝试使用 LinkedHashSet,它会按照你添加的顺序来保持元素的顺序。
这里有两个不同的事情。