Java集合2

  • HashTable
    底層是數組+鏈表,初始容量是11,負載因子0.75,擴容2倍+1,頭插法,採用的Entry
int hash = key.hashCode();//object的hashcode方法
// 爲啥要把hash值和0x7FFFFFFF做一次按位與操作呢,
		// 主要是爲了保證得到的index的第一位爲0,也就是爲了得到一個正數。
		// 因爲有符號數第一位0代表正數,1代表負數
int index = (hash & 0x7FFFFFFF) % tab.length;
  • HashMap
    底層是數組+鏈表,初始容量16,負載因子0.75,擴容2倍,1.8開始採用尾插法,採用的Node
    static final int hash(Object key) {
        int h;
        //一般數組長度length都不會很大,如果不對hash值做處理,
        //直接用hash值&(length-1),index僅與hash值的低n位有關,
        //hash值的高位都被與操作置爲0,所以將hash值高16位與低16位異或來
        //減少這種影響。
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }

在這裏插入圖片描述

  • TreeMap
    底層是紅黑樹,採用的Entry
  • LinkedHashMap
    • 底層是基於HashMap的,在此基礎上Entry節點還保存了指向前後節點的指針before和after。
    • LinkedHashMap有head和tail屬性,指向雙向鏈表的頭和尾。
    • 擴容時:HashMap是遍歷table,LinkedHashMap是遍歷雙向鏈表。
    • 從遍歷的效率來說,遍歷雙向鏈表的效率要高於遍歷table,因爲遍歷雙向鏈表是N次(N爲元素個數);而遍歷table是N+table的空餘個數(N爲元素個數)。
    • 參考博客:https://www.jianshu.com/p/8f4f58b4b8ab
  • ArrayList 1.5倍擴容
  • CopyOnWriteArrayList 沒有1.5倍擴容
  • Vector 2倍擴容使用synchronized加鎖
  • HashSet,底層是HashMap
  • TreeSet,底層是TreeMap
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章