HashSet有如下特色:java
當向HashSet集合中存入一個元素時,HashSet會調用該對象的hashCode()方法來獲得該對象的hashCode值,而後根據hashCode值來決定該對象在HashSet中存儲位置。簡單的說,HashSet集合判斷兩個元素相等的標準是兩個對象經過equals方法比較相等,而且兩個對象的hashCode()方法返回值相等。算法
注意,若是要把一個對象放入HashSet中,重寫該對象對應類的equals方法,也應該重寫其hashCode()方法。其規則是若是兩個對象經過equals方法比較返回true時,其hashCode也應該相同。數組
天然排序根據排序元素的CompareTo(Object obj)方法來比較元素之間大小關係,而後將元素按照升序排列。
Java提供了一個Comparable接口,該接口裏定義了一個compareTo(Object obj)方法,該方法返回一個整數值,實現了該接口的對象就能夠比較大小。
obj1.compareTo(obj2)方法若是返回0,則說明被比較的兩個對象相等,若是返回一個正數,則代表obj1大於obj2,若是是負數,則代表obj1小於obj2。
若是咱們將兩個對象的equals方法老是返回true,則這兩個對象的compareTo方法返回應該返回0。若是要定製排序,應該使用Comparator接口,實現int compare(To1,To2)方法安全
HashSet性能要好於TreeSet(特別是最經常使用的添加、查詢元素等操做),由於TreeSet須要額外的紅黑樹算法維護集合元素的次序。多線程
EnumSet是全部Set實現類中性能最好的,但它只能保存同一個枚舉類的枚舉值做爲集合元素;併發
注意:Set的三個實現類HashSet、TreeSet和EnumSet都是線程不安全的。
若是有多個線程同事訪問一個Set集合,而且有超過一個線程修改了該Set集合,則必須手動保證該Set集合的同步。工具
SortedSet set = Collections.synchronizedSortedSet(new TreeSet());
Collections 工具類其餘同步方法:性能
synchronizedCollection(Collection<T> c)
synchronizedList(List<T>list)
synchronizedMap(Map<K,V> m)
synchronizedSet(Set<T> s)
synchronizedSortedMap(SortedMap<K,V> m)
synchronizedSortedSet(SortedSet<T> s)
synchronizedNavigableMap(NavigableMap<K,V> m)
(JDK1.8)synchronizedNavigableSet(NavigableSet<T> s)
(JDK1.8)什麼是集合迭代器快速失敗行爲?以ArrayList爲例,在多線程併發狀況下,若是有一個線程在修改ArrayList集合的結構(插入、移除...),而另外一個線程正在用迭代器遍歷讀取集合中的元素,此時將拋出ConcurrentModificationException異常當即中止迭代遍歷操做,而不須要等到遍歷結束後再檢查有沒有出現問題;線程