Vector能夠指定容器的容量增量,而ArrayList不能夠。html
當二者採用無參構造的時候,Vertor在一初始化就開闢10長度的內存空間,而ArrayList沒有,ArrayList在添加加元素的時候會觸發初始化。數組
ArrayList每次擴充容量的一半,而Vector擴充一倍安全
二者最主要的區別是:Vector是線程安全的,而ArrayList不是函數
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的話索引變成原索引+oldCap
code
Entry
繼承了HashMap的Entry
,並維護了一個前驅和後繼。也就是說,在原來的基礎上增長了一個雙向鏈表來保證元素的順序。插入順序
和訪問順序
,能夠根據構造函數的accessOrder
來設置。若是是訪問順序
,那put和get操做已存在的Entry時,會先刪除原來的 Entry,再生成新得Entry插入到鏈表的尾部。add()
方法實際就是調用HashMap的put方法,HashSet維護了一個全局的靜態變量,做爲value。hashCode()方法
和equals()
方法TreeMap基於紅黑樹
實現。該映射根據其鍵的天然順序進行排序,或者根據建立映射時提供的 Comparator 進行排序,具體取決於使用的構造方法。htm
TreeMap的put
、get
方法的時間複雜度是log(n)。blog
使用TreeMap自定義排序必須重寫hashCode
和equals()
方法。
Tree不容許存入null
key。
用空間換時間
,經過索引的方式下降鏈表查詢和插入的時間複雜度。