componentWillMount()
显然不会保留顺序
Set<String> stringSet = new HashSet<String>();
从上面的集合中读取元素时应该保留顺序,但在某些时候它不会?我观察错了,或者我错过了什么?
答案 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]
TreeSet
或ConcurrentSkipListSet
如果要按元素的内容排序,请使用NavigableSet
的实现(SortedSet
的后继)。
排序可以通过以下方式完成:
compareTo
接口的任何对象上定义的Comparable
。Comparator
实现。与Java捆绑在一起的两个类实现NavigableSet
(和SortedSet
):TreeSet
和ConcurrentSkipListSet
。
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():[星期六,星期天]