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的大小。