Java入門學習-深入理解集合
集合框架主要包括兩種型別的容器,
一種是集合(Collection),儲存一個元素集合,
另一種是圖(Map),儲存鍵/值對對映。
Collection介面又有3種子型別,List、Set和Queue,再下面是一些抽象類,最後是具體實現類,常用的有ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap等等。
1、List:
允許重複的有序集合,List介面主要是增加了面向位置的操作
//如果記憶體不夠,開闢新記憶體:
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);//>>右移一位,相當於除以2
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
所以當記憶體不夠時,會開闢原有記憶體的1.5倍。
ArrayList適合尾部改動的情況
LinkList適合中間改動的情況
2、set:
不包含重複的元素
Set介面有三個具體實現類,分別是雜湊集HashSet、鏈式雜湊集LinkedHashSet和樹形集TreeSet。
在HashSet中,記憶體不夠怎麼辦:假設10的初始容量,0.7的載入因子,當記憶體達到7時,記憶體就會變為20。(預設初始容量為16和載入因子0.75)
這幾種set的區別是底層實現不同,導致效能特性不同:HashSet是陣列(HashMap實現),LinkedHashSet是連結串列,TreeSet是樹。
然後陣列的特性就是記憶體固定,每次快用完了需新開闢空間,再把舊的複製過去。再是中途插入刪除,後面所有的元素都要移動,所以很影響效率。但是有索引,所以讀取查詢效率較高
連結串列的特性是插入刪除很方便。
樹則是在排序上有優勢
3、Queue
佇列是一種先進先出的資料結構,元素在佇列末尾新增,在佇列頭部刪除。Queue介面擴充套件自Collection,並提供插入、提取、檢驗等操作。
介面Deque,是一個擴充套件自Queue的雙端佇列,它支援在兩端插入和刪除元素,因為LinkedList類實現了Deque介面,所以通常我們可以使用LinkedList來建立一個佇列。PriorityQueue類實現了一個優先佇列,優先佇列中元素被賦予優先順序,擁有高優先順序的先被刪除。
4、HashMap
採用陣列+連結串列實現,即使用連結串列處理衝突,同一hash值的連結串列都儲存在一個連結串列裡。
JDK1.8中,HashMap採用陣列+連結串列+紅黑樹實現,當連結串列長度超過閾值(8)時,將連結串列轉換為紅黑樹,這樣大大減少了查詢時間。(百度了一下紅黑樹:類似二叉平衡樹,因為平衡特性使得最壞的情況都有較高效率。之後還要好好細學紅黑樹)
5、LinkedHashMap
繼承HashMap,但是因為是連結串列實現,所以可以記錄順序
6、TreeMap
基於紅黑樹資料結構(所以待我學完基礎,第一件事就是要學紅黑樹)。適合索引排序
如果更新圖時不需要保持圖中元素的順序,就使用HashMap,如果需要保持圖中元素的插入順序或者訪問順序,就使用LinkedHashMap,如果需要使圖按照鍵值排序,就使用TreeMap。
7、Vector
與ArrayList基本一致,Vector使用了關鍵字synchronized將訪問和修改向量的方法都變成同步,支援多執行緒,但是在查詢、插入、刪除都很慢
8、Stack
棧類,特徵是先進後出。只在棧頂操作,記錄棧頂位置。
9、HashTable
儲存鍵值對,繼承Dictionary,執行緒安全,key和value都不可以為null。
Vector、Stack和HashTable效率都較其他低,但是均執行緒安全
10、ConcurrentHashMap
Jdk1.5之後出現,比HashMap執行緒安全、比HashTable效率高近16倍。Hashtable相當於是給整個table加了鎖,而ConcurrentHashMap則優化了鎖的粒度,我粗略看了下別人貼的原始碼,使用Segment各層級來細化鎖。這個也要在之後好好看看原始碼分析
11、CopyOnWriteArrayList
CopyOnWriteArrayList即寫時複製的容器。通俗的理解是當我們往一個容器新增元素的時候,不直接往當前容器新增,而是先將當前容器進行Copy,複製出一個新的容器,然後新的容器裡新增元素,新增完元素之後,再將原容器的引用指向新的容器。是一個執行緒安全的List介面的實現,它使用了ReentrantLock鎖在新增的時候是需要加,否則多執行緒寫的時候會Copy出N個副本出來
但是有兩個問題:1、寫操作時記憶體佔用過高 2、資料不實時一致
總結一下:
1、紅黑樹不懂,引申到HashMap、TreeMap的底層和原始碼都不懂
2、Hash碰撞沒有深究
3、ConcurrentHashMap是如何加鎖的,也不搞明白
入門了再回頭仔細分析
相關文章
- java集合入門和深入學習,看這篇就差不多了Java
- Java集合——深入理解HashMapJavaHashMap
- 深入理解Java SPI之入門篇Java
- 深入學習Spring框架(一)- 入門Spring框架
- 【Java】Java容器篇(二),深入理解List集合類Java
- Java 集合類入門篇Java
- Egg入門學習(二)---理解service作用
- Java學習路線·入門Java
- 學習Java怎麼入門?Java
- Java集合框架學習Java框架
- 學習java怎麼入門?怎樣學Java?Java
- 深入學習和理解 ReduxRedux
- 深入理解深度學習深度學習
- 深入理解JVM(③)學習Java的記憶體模型JVMJava記憶體模型
- 【java】三大框架學習入門Java框架
- 成都Java學習入門建議Java
- Java語言入門:該如何學習JavaJava
- 深入學習Netty(4)——Netty程式設計入門Netty程式設計
- Java 學習資料集合Java
- JAVA學習知識集合Java
- Java集合學習總結Java
- Java 集合學習筆記Java筆記
- Java集合詳解(一):全面理解Java集合Java
- Egg入門學習(三)---理解中介軟體作用
- Java工程師學習指南 入門篇Java工程師
- java入門基礎學習----泛型Java泛型
- Java工程師學習指南(入門篇)Java工程師
- Java新手入門學習路線圖Java
- java學習筆記1(入門級)Java筆記
- Java入門教程十二(集合與泛型)Java泛型
- Java學習福利,入門到精通學習路線分享Java
- Java學習從入門到精通的學習建議Java
- java學習(七) —— API集合類JavaAPI
- Java集合類學習總結Java
- Java集合學習記錄——IteratorJava
- 【Java學習筆記】Collections集合Java筆記
- linux shell陣列深入學習理解Linux陣列
- 深度學習入門必須理解這25個概念深度學習
- 機器學習入門筆記——如何理解梯度下降機器學習筆記梯度