Java容器類總結
最近看了一下java容器類的一些基礎知識,算是對以前不重視的基礎部分進行強化,一下對一些容器類進行一些基本的總結。
公共部分:
每次容器發生改變(擴容、增加資料、刪除資料等),會使modecount加1,這個引數的用處在於記錄當前容器的變動次數,使得在用迭代器遍歷的過程中能夠檢測到。
List:
1.ArrayList:底層採用的陣列來實現的,但是可以動態增加,當新增資料到陣列中時,發現數組已經滿了,會建立新的陣列,新陣列的長度為當前長度的1.5倍,需要連續的儲存空間,對於已經排序的陣列查詢很快,移動刪除耗時較多。
2.LinkedList:底層是使用連結串列實現,是一個雙向連結串列,無需連續儲存空間,查詢費時,頭尾增加刪除效率高。
Map:
1.HashMap:底層採用資料+單鏈表的方式實現,預設閾值是0.75,也就是說長度為16的陣列當有12個元素的時候就會擴容(擴容到目前長度的兩倍),數組裡面裝的都是連結串列,通過hash雜湊演算法決定對映到陣列哪個位置,當發生碰撞,會將當前資料放入連結串列頭的位置,對資料進行查詢的時候,需要呼叫hashcode()和equals()方法,在內部做比較時,先判斷hash是否相等再呼叫equals(),因為hash值是int型別,比較起來比equals()快,允許key為空,儲存資料和獲取資料效率都很高,但是資料是無序的。
2.TreeMap:底層資料結構為紅黑樹,是一個平衡二叉樹,之所以能做到有序,是因為會使用Compareable介面的compareto()方法對立面的資料進行排序,因為是平衡二叉樹,所以儲存、刪除、查詢效率都不錯,但是相對HashMap效率還是差一些,如果不需要資料有序,HashMap是更好的選擇。
Set:
1.HashSet:底層使用HashMap實現,HashSet相當於只有Key值,其Value是一個固定的全域性Object,呼叫put方法的時候就是將key和這個固定的value放進HashMap,如果HashMap返回的是null則代表之前不包含這個值,如果返回的不為null則表示之前包含了這個值,因為底層是HashMap,所以它的儲存、刪除、查詢效率都高,並且無重複值。
2.TreeSet:跟HashMap類似,底層由TreeMap實現,基本的操作方法都是直接在呼叫TreeMap的方法,TreeMap特性都有,外加一個無重複值。