ArrayList,LinkedList,HashMap,LinkedHashMap,ConcurrentHashMap的底層實現原理


ArrayList:

  參考的優秀博客:https://www.cnblogs.com/ITtangtang/p/3948555.html

  重要的幾個點:Arrays.copyOf(elementData, size),這個函數調用的是System.arraycopy

         (elementData, 0, a, 0, size)這個native函數,進行的是淺復制(對對象引用的復制);

LinkedList:

  參考的優秀博客:https://www.cnblogs.com/ITtangtang/p/3948610.html

  重要的幾個點:LinkedList是個雙向列表,可以從頭遍歷到尾,也可從尾遍歷到頭;get()方法會先判斷index在前

         半部分,還是后半部分,然后采用哪種遍歷;

HashMap:

  參考的優秀博客:https://www.cnblogs.com/ITtangtang/p/3948406.html

  重要的幾個點:容量為什么必須是2的整數次冪,是因為為了保證hashcode取length模時散列均勻,取模運算為

         hashcode&(length-1),由此可知(length-1)轉化為二進制右邊位必須全為1,才能保證

         沒有空位被浪費掉;

         HashMap中相同位維護的是單項列表;

         key為null時,hashcode定義為0,所以會被放置在table[0];

         ConcurrentModificationException這個異常幾乎所有集合實現都有,是使用Iterator修改集合時,

         有別的線程也修改了,導致修改集合的操作數不一樣,就會拋出此錯;

         相同key的equels方法和hashcode都必須相等;

         要想提升HashMap的查找性能,可以調小loadFactor(加載因子),因為集合容量越大,hash

         沖突越小,查找就會越快;

ConcurrentHashMap:

  參考的優秀博客:https://www.cnblogs.com/ITtangtang/p/3948786.html

  重要的幾個點:運用了鎖分段技術,由多個哈希表組成,取key的hashcode進行一次再hash算法,確定其分配

         所在的Segment,然后在存在此Segment的hash表里面;

         調用size()方法時,ConcurrentHashMap的做法是先嘗試2次通過不鎖住Segment的方式來統計

         各個Segment大小,如果統計的過程中,容器的count發生了變化,則再采用加鎖的方式來統計

         所有Segment的大小。

         

 


免責聲明!

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



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