JAVA容器

容器

1.Vector和ArrayList的異同

  • Vector能夠指定容器的容量增量,而ArrayList不能夠。html

  • 當二者採用無參構造的時候,Vertor在一初始化就開闢10長度的內存空間,而ArrayList沒有,ArrayList在添加加元素的時候會觸發初始化。數組

  • ArrayList每次擴充容量的一半,而Vector擴充一倍安全

  • 二者最主要的區別是:Vector是線程安全的,而ArrayList不是函數

2.HashMap

  • HashMap的設計主要考慮解決散列衝突,權衡空間和時間的成本,因此哈希函數擴容機制影響了HashMap的優劣線程

  • HashMap默認的容量是16,每次擴容爲原來的2倍,若是本身指定容量,也必定是2的n次方。這是由於哈希函數的設計是hash()&(table.length-1),設計爲素數能夠減小散列衝突。設計

  • 獲取元素的時候既須要使用key的hashCode也須要equals方法,因此在必要狀況下須要重寫這兩個方法3d

  • JDK1.8的HashMap除了鏈表中的元素大於8個須要轉爲紅黑樹以外,主要對擴容機制進行了升級,默認的負載因子是0.75f(建議不要改)。JDK1.7的resize()須要將原來的數組元素拷貝到新的數組當中,而且rehash()從新計算索引的位置,可是實際上rehash()後key的位置要麼在原來的位置或者在原來的位置上移動2次冪的位置(原索引+oldCap),所以,咱們在擴充HashMap的時候,不須要像JDK1.7的實現那樣從新計算hash,只須要看看原來的hash值新增的那個bit是1仍是0就行了,是0的話索引沒變,是1的話索引變成原索引+oldCapcode

3.LinkedLits和ArrayList的異同

  • LinkedLits底層是雙向鏈表,ArrayList底層是線性表(數組),兩個的區別請百度,其中比較被我忽視的是ArrayList支持快速隨機訪問。

4.LinkedHashMap

  • LinkedHashMap繼承自HashMap,底層實現依然是散列表,可是LinkedHashMap的Entry繼承了HashMap的Entry,並維護了一個前驅和後繼。也就是說,在原來的基礎上增長了一個雙向鏈表來保證元素的順序。
  • LinkedHashMap有兩種模式:插入順序訪問順序,能夠根據構造函數的accessOrder來設置。若是是訪問順序,那put和get操做已存在的Entry時,會先刪除原來的 Entry,再生成新得Entry插入到鏈表的尾部。

5.HashSet和HashMap

  • HashSet是基於HashMap實現的,add()方法實際就是調用HashMap的put方法,HashSet維護了一個全局的靜態變量,做爲value。
  • HashSet的元素能夠看做是HashMap的key,因此HashSet的去重特性,主要依賴於hashCode()方法equals()方法

6.TreeMap

  • TreeMap基於紅黑樹實現。該映射根據其鍵的天然順序進行排序,或者根據建立映射時提供的 Comparator 進行排序,具體取決於使用的構造方法。htm

  • TreeMap的putget方法的時間複雜度是log(n)。blog

  • 使用TreeMap自定義排序必須重寫hashCodeequals()方法。

  • Tree不容許存入nullkey。

7.PriorityQueue(優先級隊列)

  • 默認採用小頂堆實現,初始容量爲11
  • 使用帶有比較器的構造方法能夠實現大頂堆
  • 參考文章:www.cnblogs.com/CarpenterLe…

8.ConcurrentSkipListMap(跳躍表)

  • 鏈表不能支持隨機的快速訪問,因此若是說咱們直接向鏈表的頭節點或者尾節點(要看鏈表的實現方式)插入元素則時間複雜度爲O(1),可是若是是有序的鏈表則須要O(n)。跳躍表的思想是用空間換時間,經過索引的方式下降鏈表查詢和插入的時間複雜度。
  • 參考文章:mp.weixin.qq.com/s/COBdoHWDh…

9.ConcurrentHashMap

10.DelayQueue

相關文章
相關標籤/搜索