Java之集合框架總結
一、 定義
Java中的集合類:是一種工具類,就像是容器,儲存任意數量的具有共同屬性的物件。
在java.util 包中
二、框架圖
三、總結
1、 集合框架主要分為兩個介面:Collection和Map
2、 Collection介面實Iterable介面,凡是實現了Iterable介面,都可以使用迭代器或增強for迴圈(for each)來進行遍歷
3、 List介面
List繼承了Collection,集合元素可以重複,有序,可以允許多個null
ArrayList 繼承了抽象類AbstractList,實現了List介面;不同步
資料結構:動態陣列
使用預設建構函式ArrayList() 時,會建立一個size為10的Object型別的空列表,當新增的容量超過陣列大小的時候,會產生一個新的陣列,新的陣列大小為原來陣列大小的1.5倍,把原陣列中的資料拷貝到新的陣列
常用方法:
- add(E e) 將指定的元素追加到此列表的末尾
- clear() 從列表中刪除所有元素
- contains(Object o) 如果此列表包含指定的元素,則返回 true 。
- indexOf(Object o) 返回此列表中指定元素的第一次出現的索引,如果此列表不包含元素,則返回-1
- remove(Object o) 從列表中刪除指定元素的第一個出現(如果存在)
- set(int index, E element) 用指定的元素替換此列表中指定位置的元素
- size()
- sort(Comparator 泛型E c) 使用提供的 Comparator對此列表進行排序以比較元素
- get(int index) 返回此列表中指定位置的元素
- isEmpty() 如果此列表不包含元素,則返回 true
LinkedList 繼承了AbstractSequentialList,實現了List介面;不同步
資料結構:雙向連結串列
每個節點是一個Node物件,Node物件中封裝的是你要新增的元素,還是next和pre的物件的引用
常用的方法:除了有ArrayList的基本操作方法,還有
- addFirst(E e) 在該列表開頭插入指定的元素
- addLast(E e) 將指定的元素追加到此列表的末尾
- getFirst() 返回此列表中的第一個元素
- getLast() 返回此列表中的最後一個元素
連結串列資料(LinkedList)結構的特點是 做插入 刪除的效率比較高,查詢的效率比較低
ArrayList 做查詢的時候效率比較高,因為可以通過下標直接找到元素,但是插入和刪除效率比較低,因為要做移位操作。
4、 Set介面 不重複,無序,只能有一個null
不包含重複元素的Collection,並且最多包含一個null
和list容器恰恰相反 Set容器不能保證元素的順序
HashSet(底層是一個HashMap)
使用雜湊表進行儲存(雜湊演算法)
hashSet操作的是HashMap的key
/**
* Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
* default initial capacity (16) and load factor (0.75).
*/
public HashSet() {
map = new HashMap<>();
}
hashSet的add方法:
public boolean add(E e) {
return map.put(e, PRESENT)==null; //PRESENT是一個final的Object
}
TreeSet
TreeSet的內部操作的是底層資料TreeMap,只是我們操作的是TreeMap的key(和HashSet類似)
5、 Map介面
key-value對映 無序 key是唯一的 並允許null的值和null鍵
HashMap
不是同步的 非執行緒安全
HashMap 預設底層的構造方法會產生一個底層長度為16的Entry陣列
hashMap 內部的資料結構是陣列連結串列結構
因為不同的key有可能算出來的下標相同,這時 如果key相同 ,則覆蓋value 如果不同 則把新的entry放入,把就的entry以連結串列的結構 連在新的entry下面
int hash = hash(key.hashCode());
首先呼叫key的hashCode方法來得到一個整數–雜湊碼
把雜湊碼作為引數傳到hash函式中來進行運算–雜湊函式 得到了一個int
把雜湊值和陣列的長度來進行計算 最終得到存放到陣列的位置(下標)
所以如果key是物件的話,一般都要重寫hasCode和equals方法
TreeMap
紅黑樹的資料結構 不同步
每一個key-value節點作為紅黑樹的一個節點。TreeMap儲存時會進行排序的,會根據key來對key-value鍵值對進行排序,其中排序方式也是分為兩種,一種是自然排序,一種是定製排序,具體取決於使用的構造方法。
自然排序:TreeMap中所有的key必須實現Comparable介面,並且所有的key都應該是同一個類的物件,否則會報ClassCastException異常。
@Override//重寫compareTo方法,自定義比較規則
public int compareTo(Person o) {
if(this.age-o.getAge()>0){
return 1;
}else if(this.age-o.getAge()<0){
return -1;
}
return this.name.compareTo(o.getName());
}
定製排序:定義TreeMap時,建立一個comparator物件,該物件對所有的treeMap中所有的key值進行排序,採用定製排序的時候不需要TreeMap中所有的key必須實現Comparable介面。
TreeMap<Person,String> map = new TreeMap<Person,String>(new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
//自定義排序
if(o1.getAge()-o2.getAge()>0){
return 1;
}else if(o1.getAge()-o2.getAge()<0){
return -1;
}else{
return o1.getName().compareTo(o2.getName());
}
}
});
四、 包裝類Collections
此類僅由靜態方法組合或返回集合
擴充套件了List、Set、Map的操作方法
比如說List Set Map都是不同步的 不安全的 可以使用包裝類來使得執行緒安全
還可以對List進行排序 等等 具體的方法可以插看java api文件