一、java集合:
1.collection接口的子接口:set接口跟list接口
2.map接口的實現類:hashMap、hashTable、concurrentHashMap、hashTable、treemap;
3.set接口的實現類:hashSet、LinkedHashSet、treeSet;
4.List接口的實現類:ArrayList、LinkedList、vector等;
二、java集合詳細說明:
1.List:
ArrayList: 有序、非線程安全、值可以為null、值可以重復,底層實現Object數組,它實現了Serializable接口,因此它支持序列化;
優點:查詢快,插入、刪除慢;
ArrayList的動態擴容:
linkedList:有序、非線程安全、底層實現是鏈表,插入、刪除快,查詢效率不高;
vector:跟ArrayList結構相似,死線程安全的,加了synchronized;
2.Map:
HashMap:
底層實現原理:jdk1.8之前,hasMap是數組+鏈表;jdk1.8之后,數組+鏈表+紅黑樹,當鏈表超過8的時候,鏈表就會轉化為紅黑樹,利用紅黑樹快速增、刪、改、查的特點提高HashMap的性能;
entry數組包含 key、val、hash值、next對象;
加載因子loadFactory:默認為0.75,初始化容量initialCapacity:默認為16,加載因子存在的原因:為了減少哈希沖突,如果初始桶為16,等到滿16個元素才擴容,某些桶里可能就不止一個元素了,所以加載因子默認為0.75,也就是說大小為16的HashMap, 到了第13個元素就會擴容成32;
閥值threshold:一般為capacity*loadFactory;擴容的時候會用到閥值;
當發生哈希沖突,並且元素數量大於閥值的時候,就會擴容,擴容時需要創建一個為之前數組長度2倍的新的數組,然后將當前的Entry數組中的元素全部傳輸過去;
舊的數組的大小如果已經最大(2^30)了,那么將不再擴容,將閥值設定為int的最大值;如果沒有,那就初始化一個原來數組長度兩倍的新的數組,將數據轉移到新的數組;
concurrentHashMap:
concurrentHashMap的數據結構:
在jdk1.7之前是segment數組+hashEntry數組,segment實際繼承自可重入鎖(ReentrantLock),在concurrentHashMap中扮演鎖的角色,hashEntry則用於存儲鍵值對數據,一個concurrentHashMap包含一個segment數組,一個segment包含一個hashEntry數組,稱為table,每個HashEntry是一個鏈表結構的元素;
在get和put操作中,是如何快速定位元素放在哪個位置的?
對於某個元素而言,一定是存放在某個segment下的某個table元素中:
定位segment:取得key的hashcode值,進行一次再散列,拿到散列值后,以再散列值的高位進行取模,得到當前元素在哪個segment上;
定位table:取得key的再散列值,用再散列值的全部和table的長度進行取模,得到當前元素在table的哪個元素上;