java 集合


一、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的哪個元素上;

       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM