list
ArrayList
線性表,最常用的是ArrayList,其底層是數組。這個再我一篇集合框架的文章裏有詳解,可以自己去看看。
CopyOnWriteList
相當於加了讀寫鎖的ArrayList,適用於讀多寫少的場景。寫鎖被佔用的時候,大量的讀線程就會被阻塞,會很大的影響效率。當去寫數組的時候會Arrays.copy,就會使array數組的引用指向新的數組,因爲加了鎖,所以是不會出現髒數據的:
就像上圖中就是擴容的情形,寫鎖保證了數據的原子性。當然上述代碼也有很大的問題,就是如果短時間寫操作太多,創建了太多數組,在GC執行不到位的情況下很有可能就會內存溢出。
Set
Set就是不重複的集合。幾個重要的實現有:
HashSet
HashSet其實就是HashMap的key,它的空構造函數就是:
private tranasient HashMap<E,Object> map;
......
public HashSet() {
map = new HashMap<>{};
}
其實去put的時候就是map 去執行了一次map.put(key,PRESENT),PRESENT是上面定義的一個new Object();僅做填充用途。
CopyOnWriteArraySet
CopyOnWriteArraySet主要靠CopyOnWriteArrayList來實現,所以它是線程安全的。
Queue
隊列是很基本的數據結構,下面是它常用的API。