java集合保留顺序,应该是唯一的

时间:2016-02-25 13:08:46

标签: java collections hashset linkedhashset

componentWillMount()

显然不会保留顺序

Set<String> stringSet = new HashSet<String>();

从上面的集合中读取元素时应该保留顺序,但在某些时候它不会?我观察错了,或者我错过了什么?

3 个答案:

答案 0 :(得分:3)

只有LinkedHashSet保证可预测的顺序

来自jdoc:

  

使用Set接口的哈希表和链表实现   可预测的迭代顺序

答案 1 :(得分:1)

Javadoc for LinkedHashSet相当清楚:

  

迭代排序...是元素插入集合(插入顺序)

的顺序

答案 2 :(得分:0)

并且应该唯一

Set实现不包含重复的元素,如Javadoc中更详细的解释。

java集合可保留顺序

“订单”是什么意思?

插入顺序:LinkedHashSet

如果要跟踪对象最初添加到集合中的顺序,请使用LinkedHashSet

Set< String > colors = new LinkedHashSet<> () ;
String peachPuff = "PeachPuff" ;
colors.add( "CornflowerBlue" ) ;
colors.add( peachPuff ) ;
colors.add( "DarkSlateGray" ) ;
colors.add( peachPuff ) ; // Adding again. Original insertion order maintained.

运行code live at IdeOne.com。请注意,尽管peachPuff对象已第二次添加到集合中,但如何保持其原始#2位置。

System.out.println( "colors.toString(): " + colors ) ;

colors.toString():[CornflowerBlue,PeachPuff,DarkSlateGray]

排序顺序:TreeSetConcurrentSkipListSet

如果要按元素的内容排序,请使用NavigableSet的实现(SortedSet的后继)。

排序可以通过以下方式完成:

与Java捆绑在一起的两个类实现NavigableSet(和SortedSet):TreeSetConcurrentSkipListSet

TreeSet

如果您在单个线程中操纵集合,或者仅将集合用于跨线程的只读操作,请使用TreeSet

示例:

Set< String > names = new TreeSet<> () ;
names.add( "Carol" ) ;
names.add( "Alice" ) ;
names.add( "Bob" ) ;

这将按字母顺序报告。请参见此code run live at IdeOne.com

names.toString():[爱丽丝,鲍勃,卡罗尔]

ConcurrentSkipListSet

如果要跨线程操作集合,则concurrency是一个问题。使用ConcurrentSkipListSet类。

您可能想了解skip list算法。

枚举定义顺序:EnumSet

如果要按照在枚举上定义的顺序来跟踪集合枚举对象(请参见Tutorial),请使用EnumSet。此类针对枚举进行了高度优化,执行速度非常快,并且使用的内存很少。

示例:从DayOfWeek枚举跟踪周末。

Set< DayOfWeek > weekend = EnumSet.of( DayOfWeek.SUNDAY , DayOfWeek.SATURDAY ) ;

尽管我们以错误的顺序定义了集合,但是EnumSet会按照DayOfWeek枚举上定义的顺序来迭代项目。该顺序为周一至周日,因此我们的EnumSet将在周日之前重复周六的报告。

请参阅此code run live at IdeOne.com

weekend.toString():[星期六,星期天]