《瘋狂的JAVA講義》筆記-第8章集合
-
Iterator
、ListIterator
接口Iterator
迭代時是將元素的值返回,並不是將元素本身返回,所以迭代時無法更改元素的值。但是可以刪除ListIterator
則擁有增刪改查以及向前迭代的功能
-
HashSet
HashMap
類- 通過Hash算法來確保key 或者元素不能重複的類,一般不要進行更改。因爲更改了內容可能會導致錯誤,如
equals()
返回相等以及hashCode()
相同, 取出或刪除的時候無法定位。 - 如果兩個元素
hashCode()
相等但是equals()
返回false
則需要在一個“桶”裏裝多個元素,會導致性能的下降。聽說JDK8通過紅黑樹解決了這個麻煩
- 通過Hash算法來確保key 或者元素不能重複的類,一般不要進行更改。因爲更改了內容可能會導致錯誤,如
-
LinkedHashSet
、TreeSet
LinkedHashSet
在使用hasCode()
定位元素的同時,使用鏈表來維護集合順序(以插入順序爲序),所以迭代遍歷很快,插入稍慢,可滿足要求有一定順序的集合需求TreeSet
也是有序的,但是是按元素的實際值大小進行排序。
-
EnumSet
- 佔用內存小 ,性能好
- 要求同一個
EnumSet
裏都是統一的枚舉類。
-
ArrayList
- 變長的數組,自動擴容
- 最好在添加大量數據前,使用
ensureCapacity(int minCapacity)
方法來避免多次重分配內存。initCapacity = 10
-
Map
性能- 儘量不要用
TreeMap
,如果要用,可通過使用LinkedHashMap
並確保插入key-value對時有序即可 - 一般情況下,使用
HashMap
,小範圍內可以使用EnumMap
,要嚴格使用==
的可以使用IdentityHashMap
,內存吃緊的時候可以使用WeakHashMap
如何保證
HashMap
不因擴容而浪費性能,可參照如何保證HashMap不重建Hash表 - 儘量不要用
-
Collecitons
工具類- 返回不可變類的三個方法
emptyXxx()
: 返回一個空的Xxx對象SingletonXxx(Xxx)
: 返回只有一個對象的不可變對象unmodifiable(xxx)
: 返回對象的不可變對象
- 返回不可變類的三個方法
-
綜合
- 線程不安全的集合,可以通過
Xxx x = Collections.synchronizedXxx(new Xxx())
如List l = Collections.synchronizedList(new ArrayList())
來獲取線程安全的集合,當然性能會降低。 - 如果要使用集合,則推薦使用
HashSet
,除非需要根據 元素實際值進行排序才使用TreeSet
- 線程不安全的集合,可以通過
-
各種集合的性能對比
- 底層使用數組爲實現的,隨機訪問性能最好。底層使用鏈表爲實現的,插入刪除性能最佳。
- 迭代則使用鏈表更快
- 應用場景
- 當遍歷時,
LinkedList
使用迭代器,其他使用隨機訪問的方式 - 如果經常需要插入刪除,則使用
LinkedList
;如果
- 當遍歷時,