集合
Collection
ArrayList
- 實現(xiàn)了List接口
- 底層數(shù)據(jù)結(jié)構(gòu)為數(shù)組
- 允許存儲null值
- 線程不安全
- 可以通過Collections.synchronizedList轉(zhuǎn)換為線程安全的list,就是為各個操作上鎖,通過構(gòu)造函數(shù)可以自定義加鎖對象
- 插入非尾部數(shù)據(jù)時,會移動對象,導(dǎo)致插入效率低
- 插入前會檢查數(shù)組大小,當數(shù)組大小不足時會進行擴容操作,擴容時創(chuàng)建一個新的數(shù)組,容量為舊數(shù)組的1.5倍左右
newCapacity = oldCapacity + (oldCapacity >> 1),擴容后舊數(shù)組數(shù)據(jù)被復(fù)制到新數(shù)組
LinkedList
- 實現(xiàn)了List和Deque接口
- 底層數(shù)據(jù)結(jié)構(gòu)為鏈表
- LinkedList既可以當做有序列表,也能當做隊列和棧使用
Queue && Strack
- Queue是一個接口,Strack是一個類
- Queue和Strack目前都推薦使用ArrayDeque, 次選LinkedList,Strack已經(jīng)不推薦使用了
- ArrayDeque基于循環(huán)數(shù)組實現(xiàn)
- ArrayDeque不能添加null元素
ProrityQueue
- ProrityQueue實現(xiàn)Queue接口
- 不允許存儲null
- 每次返回權(quán)重最小的節(jié)點
- 權(quán)重計算根據(jù)元素自然順序或構(gòu)造器傳入的比較器計算
- 底層實現(xiàn)為完全二叉樹(任意一個非葉子節(jié)點的權(quán)值都不大于其左右節(jié)點的權(quán)值)
- 數(shù)據(jù)存儲使用的數(shù)組,
leftNode = parent * 2 + 1,rightNode = parent * 2 + 2,parent = (child - 1) / 2
HashMap && HashSet
- HashSet僅是對HashMap的一層封裝,內(nèi)部實現(xiàn)基本一致
- HashMap數(shù)據(jù)結(jié)構(gòu)為Entry,每個Entry包含一個key,一個value
- HashMap有兩個構(gòu)造參數(shù),初始容量和負載因子,當存儲的數(shù)據(jù)個數(shù)達到兩者的乘積時觸發(fā)擴容,擴容大小為原來的2倍,擴容后會重新計算key的位置
- HashMap JDK7底層為數(shù)組+鏈表(沖突鏈表方式),JDK8為數(shù)組+鏈表+紅黑樹(鏈表長度大于等于8時會轉(zhuǎn)為紅黑樹)
- HashMap put元素時,如果有Hash沖突,采用頭插法添加新元素
- HashMap的內(nèi)存是在第一次put操作時分配的
LinkedHashSet && LinkedHashMap
- LinkedHashSet僅是對LinkedHashMap的一層封裝,內(nèi)部實現(xiàn)基本一致
- LinkedHashMap是HashMap的直接子類,只是采用雙向鏈表將node連接在了一起,遍歷的時候直接從頭開始
- LinkedHashMap可用于實現(xiàn)LRU緩存
/**
* 基于LinkedHashMap實現(xiàn)的LRU
* @author fan
*/
public class LinkedHashMapCache<K, V> extends LinkedHashMap<K, V> {
private static final float DEFAULT_LOAD_FACTOR = 0.75f;
private final int initialCapacity;
/**
* 初始化大小
* @param initialCapacity 初始值大小
*/
public LinkedHashMapCache(int initialCapacity) {
// 當參數(shù)accessOrder為true時,即會按照訪問順序排序,最近訪問的放在最前,最早訪問的放在后面
super(initialCapacity, DEFAULT_LOAD_FACTOR, true);
this.initialCapacity = initialCapacity;
}
/**
* 是否移除最舊的數(shù)據(jù)
* @param eldest 最舊的節(jié)點
* @return 是否移除最舊的節(jié)點
*/
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return this.size() > initialCapacity;
}
}
TreeSet && TreeMap
- TreeSet只是對TreeMap的一層封裝
- TreeMap實現(xiàn)了SortedMap接口,可以按照key的大小順序?qū)ζ渲械脑嘏判?/li>
- 排序默認按照key的自然順序,也可以在構(gòu)造器中傳入自定義的比較器
- TreeMap底層實現(xiàn)為紅黑樹
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。