集合分為兩大類:
Collection集合: 單個存儲
Map集合: 按<鍵,值>對的形式存儲, <員工姓名,工資>
Collection類關系圖
Collection常見方法
|
|
|
addAll |
|
clear |
|
|
|
isEmpty |
iterator |
|
|
|
|
removeAll |
|
size |
Object |
toArray |
|
toArray |
-------------------------------------------------------------
List接口繼承了Collection接口. Collection的所有操作List都可以繼承到
List存儲特點:
有序,可重復
List集合為每個元素指定一個索引值,增加了針對索引值的操作
add(index, o) remove(index) get(index) set(index, o)
sort( Comparator )
》》》》》》》》》》》》》》
ArrayList與Vector
1) 底層是數組, 訪問快,添加刪除慢
2) ArrayList不是線程安全的,Vector是線程安全的
3) ArrayList初始化容量: 10 , Vector初始化容量: 10
4) 擴容ArrayList按1.5倍, Vector按2倍大小擴容
---------------------------------------------------------------------------
Set集合
無序, 存儲順序可能與添加順序不一樣
不能存儲重復的數據
---------------------------------------------------------------
單向鏈表
由若干個節點組成,每個節點除了數據域之外還保存一個指向下個節點的指針域。
優點:
插入/刪除元素時,不需要像數組一樣還得擴容、復制/移動元素,只需要修改一下next指針域即可。
缺點:
訪問時,總是從第一個結點依次向后訪問,只能向后訪問,不能向前訪問。
雙向鏈表
LinkedList底層采用雙向鏈表
使用LinkedList模擬棧結構。棧結構特點:后進先出。
Push()
Pop()
使用LinkedList,模擬隊列。隊列:先進先出。
Offer()
Poll();
單項鏈表示例圖:
雙向鏈表示例圖:
--------------------------------------------------------------
HashSet
* 1)底層是HashMap
* 2)向HashSet添加元素就是把該元素作為鍵添加到底層的HashMap中
* 3) HasetSet就是HashMap鍵的集合
* 4) 存儲在HashSet中的元素, 需要重寫equals()/hashCode()方法
2 TreeSet
TreeSet實現了SortedSet接口,可以對集合中的元素自然排序, 要求元素必須是可比較的
1) 在TreeSet構造方法中指定Comparator比較器
2) 如果沒有Comparator比較器,元素的類實現Comparable接口
* TreeSet
* 1)TreeSet集合可以對元素排序, 要求元素必須是可比較的
* (1)在構造方法中指定Comparator比較器
* (2)如果沒有Comparator,元素的類需要實現Comparable接口
* TreeSet是先選擇Comparator, 在沒有Comparator的情況下,再找Comaprable
* 2)TreeSet底層是TreeMap
* 3)向TreeSet添加元素就是把元素作為鍵添加到底層的TreeMap中
* 4)TreeSet就是TreeMap鍵的集合
TreeSet
可以對元素排序,要求元素必須是可以比較的。
TreeSet是先選擇Comparator,沒有Comparator再選擇
Comparable。
TreeSet的底層是TreeMap
TreeSet如果比較兩個元素相同,只能存在一個。
要非常注意,比較方法。TreeSet集合根據Comparator/Comparable的比較結果是否為0,來判斷元素是否為同一個元素的。
==================================
3.5 Collection小結
Collection單個存儲
基本操作:
add(o), remove(o), contains(o), size(),
iterator() hasNext(), next(), remove()
----List
特點:
有序,存儲順序與添加順序一樣
可重復,可以存儲重復的數據
為每個元素指定一個索引值
新增的操作:
add(inex, o ), remove(index), get(index), set(index, newValue)
sort(Comparator)
--------ArrayList
底層是數組, 訪問快,添加刪除慢
初始化容量:10
擴容: 1.5 倍
--------Vector
底層是數組, 它是線程安全的, ArrayList不是線程安全的
初始化容量: 10
擴容: 2倍
--------LinkedList
底層是雙向鏈表, 添加/刪除效率高,訪問慢
新增的操作:
addFirst(o) / addLast(o)removeFirst()/removeLast()
getFirst()/getLast()
push(o)/pop()
offer(o)/poll()
*******應用場景***************************************************
存儲可以重復的數據選擇List集合
如果以查詢訪問為主,選擇ArrayList
如果頻繁的進行添加/刪除操作,選LinkedList
如果開發多線程程序,選擇juc包中的CopyOnWriterArrayList
-------注意------------------------------------------------------------------------------------------------
List集合,在contains(o), remove(o)操作時,需要比較元素,調用equals()方法
如果在List存儲自定義類型數據,需要重寫equals()/hashCode()
----Set
特點:
無序:存儲順序與添加順序可能不一樣
不可重復,存儲的數據不允許重復
--------HashSet
底層是HashMap
向HashSet添加元素就是把該元素作為鍵添加到底層的HashMap中
HashSet就是HashMap鍵的集合
--------TreeSet
TreeSet實現了SortedSet接口,可以對元素自然排序,要求元素必須 是可比較的
(1)在構造方法中指定Comaparator比較器
(2)沒有Comaprator,需要讓元素的類實現Comaparable接口
TreeSet是先選擇Comparator,在沒有Comparator的情況下,再選擇Comparable
TreeSet底層是TreeMap
向TreeSet添加元素就是把該元素作為鍵添加到底層的TreeMap中
TreeSet就是TreeMap鍵的集合
******應用場景*******************************************************
如果存儲不重復的元素使用Set集合
如果不需要排序就使用HashSet
如果需要排序就選擇TreeSet
-----注意--------------------------------------------------------------------------------------------------
HashSet中的元素需要重寫equals()/hashCode()方法
TreeSet集合中判斷是否相同的元素, 根據Comparator/Comparable比較結果是否為0來判斷
===========================================
Map是以鍵值對存儲數據
如<員工姓名,工資>, <學生姓名,成績>…
-----------------------------------------------------
|
clear |
|
containsKey |
|
containsValue |
entrySet |
|
|
|
|
forEach |
|
isEmpty |
keySet |
|
|
putAll |
|
|
|
|
|
size |
values |
HashMap工作原理圖:
獲取元素圖:
HashMap
* 1)底層是哈希表,哈希表是一個數組,數組的每個元素是一個單向鏈表,數組元素實際存儲的是單向鏈表第一個結點的引用
* 2)默認初始化容量: 16
* 3)默認加載因子: 0.75, 當鍵值對的數量大於 容量 * 加載因子時, 數組擴容
* 4)擴容:2倍
* 5)HashMap的鍵與值都可以為null
* 6)在定義Hashmap時,可以指定初始化容量,系統會自動調整為2的冪次方,即把17~31之間的數調整為32, 把33~63之間的數調整為64
* 為了能夠快速計算數組的下標
-------------------------------
HashTable
* 1)底層是哈希表, 哈希表就是一個數組,數組的元素是一個單向鏈表,數組元素實際存儲的是單向鏈表第一個結點的引用
* 2)默認初始化容量: 11
* 3)加載因子: 0.75
* 4)擴容:2倍 + 1
* 5)HashTable的鍵與值都不能為null
* 6)在定義時可以指定初始化容量, 不會調整大小
* 7) HashTable是線程安全的, HashMap不是線程安全的
--------------------------------------------------------------
Properties
Properties繼承了HashTable
鍵與值都是String字符串
經常用於設置/讀取系統屬性值
常用 方法:
setProperty(屬性名, 屬性值)
getProperty(屬性名)
-----------------------------------------------------
TreeMap
* TreeMap實現了SortedMap接口,可以根據鍵自然排序, 要求鍵必須是可比較的
* 1)在構造方法中指定Comparator比較器
* 2)沒有Comparator時,鍵要實現Comparable接口
* 對於TreeMap來說,先判斷是否有Comparator,有的話就按Comparator比較; 如果沒有Comaparator,系統要查看鍵是否實現了Comparable接口
* 對於程序員來說,一般情況下通過Comparable定義一個默認的比較規則(絕大多數使用的排序規則), 通過Comparator可以定義很多不同的排序規則
TreeMap是根據二叉樹原理實現排序的
二叉樹原理圖示例:
-----------------------------------------------------------------------------------------
Map小結
Map是按<鍵,值>對的形式存儲數據
基本操作:
put(k,v) remove(k) remove(k,v)
containsKey(k) containsValue(v) get(k) size()
keySet() values() entrySet()
replace( k , v)
---- HashMap
底層是哈希表(散列表), 哈希表是一個數組,數組的每個元素是一個單向鏈表,數組元素其實存儲的是單向鏈表的第一個結點的引用
初始化容量: 16
擴容: 2倍
鍵與值可以為null
指定初始化容量,系統會調整為2的冪次方
----HashTable
底層是哈希表(散列表), 它是線程安全的,HashMap不是線程安全的
初始化容量: 11
擴容: 2倍+1
鍵與值 不 可以為null
指定初始化容量,系統不調整
-------- Properties
繼承了HashTable,
鍵與值都是String字符串
經常用來設置/讀取系統屬性
一般把屬性保存在配置文件中, 可以通過Properties讀取
----TreeMap
實現了SortedMap接口,可以根據鍵自然排序, 要求鍵必須是可比較的
1) 在構造方法中指定Comparator比較器
2) 沒有Comparator時, 鍵要實現Comparable接口
對於 TreeMap來說,先選擇Comparator,
對於 開發人員來說,一般讓鍵實現Comparable接口定義一個默認的比較規則,通過Comparator可以定義其他不同的比較規則
TreeMap的鍵是根據紅黑樹排序的,紅黑樹是一種自平衡二叉樹
*****應用場景**********************************************************
如果不需要根據鍵排序選擇HashMap
如果需要鍵排序,選擇TreeMap
開發多線程程序,一般不使用HashTable, 使用juc包中的ConcurrentHashMap,如果要根據鍵排序就使用juc包中的ConcurrentSkipListMap. ConcurrentHashMap采用分段鎖協議,默認分為16段鎖,並發效率高.
--------注意------------------------------------------------------------------------------------
HashMap,HashTable的鍵需要重寫equals()/hashCode()
TreeMap的鍵是根據Comparator/Comparable的比較結果是否為0來判斷是否相同的鍵