表格:算法
類型數組 |
默認容量安全 |
加載因子[1]數據結構 |
擴容增量異步 |
底層實現性能 |
是否安全及同步方式spa |
Vector線程 |
10指針 |
1對象 |
2倍 |
Object數組 |
安全,synchronized |
ArrayList |
10 |
1 |
1.5倍(>>1) |
Object數組 |
線程不安全 |
LinkedList |
無 |
1 |
無(1個1個加) |
鏈表 |
線程不安全 |
HashSet |
16 |
0.75 |
2倍 |
HashMap<E,Object> |
線程不安全 |
HashMap |
16 |
0.75 |
1倍 |
存放鏈表的數組[2] Map.Entry |
線程不安全 |
HashTable |
11 |
0.75 |
2倍+1 |
存放鏈表的數組[2] HashTable.Entry |
線程安全,synchronized |
【1】:加載因子:擴容因子=已存容量/現有容量。0.75表示當使用容量達到3/4時擴容。
【2】HashMap中,都是是以鏈表實現的。在HashMap中,先對key值求hash,而後根據hash肯定存放位置(內存中佔用的地址),通常狀況下hash值不會相同。但當數據量大是,hash值(內存存放地址)就會相同,這時會以鏈表的形式存放新的數據。
List(列表)
List的特徵是其元素以線性方式存儲,集合中能夠存放重複對象。
List接口主要實現類包括:
ArrayList() :數組。內存空間連續。默認初始容量是10,每次增長一半(右移),線程不安全。便於查詢而不便於增刪
LinkedList():鏈表(節點)。內存空間不連續。線程不安全。便於增刪不便於查詢。
對於List的隨機訪問來講,就是隻隨機來檢索位於特定位置的元素。 List 的 get(int index) 方法放回集合中由參數index指定的索引位置的對象,下標從「0」 開始。
兩種列表的區別:1.ArrayList是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構。
2.對於隨機訪問get和set,ArrayList以爲優於LinkedList,由於LinkedList要移動指針。
3.對於新增和刪除操做add和remove,LinedList比較佔優點,由於ArrayList要移動數據。
總結:ArrayList和LinkedList在性能上各有優缺點,都有各自所適用的地方,總的說來能夠描述以下:
1.對ArrayList和LinkedList而言,在列表末尾增長一個元素所花的開銷都是固定的。對ArrayList而言,主要是在內部數組中增長一項,指向所添加的元素,偶爾可能會致使對數組從新進行分配;而對LinkedList而言,這個開銷是統一的,分配一個內部Entry對象。
2.在ArrayList的中間插入或刪除一個元素意味着這個列表中剩餘的元素都會被移動;而在LinkedList的中間插入或刪除一個元素的開銷是固定的。
3.LinkedList不支持高效的隨機元素訪問。
4.ArrayList的空間浪費主要體如今在list列表的結尾預留必定的容量空間,而LinkedList的空間花費則體如今它的每個元素都須要消耗至關的空間
能夠這樣說:當操做是在一列數據的後面添加數據而不是在前面或中間,而且須要隨機地訪問其中的元素時,使用ArrayList會提供比較好的性能;當你的操做是在一列數據的前面或中間添加或刪除數據,而且按照順序訪問其中的元素時,就應該使用LinkedList了。
HashSet和HashMap的區別
這裏涉及到HashSet的本質:(1)HashSet是set的一個實現類,hashMap是Map的一個實現類,同時hashMap是hashTable的替代品
(2)HashSet以對象做爲元素,而HashMap以(key-value)的一組對象做爲元素,且HashSet拒絕接受重複的對象.HashMap能夠看做三個視圖:key的Set,value的Collection,Entry的Set。 這裏HashSet就是其實就是HashMap的一個視圖。
HashSet內部就是使用Hashmap實現的,和Hashmap不一樣的是它不須要Key和Value兩個值。
往hashset中插入對象其實只不過是內部作了
HashMap和HashTable的區別
HashMap容許鍵或者值爲null。默認初始容量是16,加載因子是0.75f,默認增長一倍。是一個異步式線程不安全的映射,HaseTable不容許鍵或者值爲null。默認初始容量是11,加載因子是0.75f。是一個同步式線程安全的映射---僅僅在筆試中出現.
都屬於Map接口的類,實現了將唯一鍵映射到特定的值上。
HashMap容許將null做爲一個entry的key或者value,而Hashtable不容許 .
HashMap 類沒有分類或者排序。它容許一個 null 鍵和多個 null 值。
Hashtable 相似於 HashMap,可是不容許 null 鍵和 null 值。它也比 HashMap 慢,由於它是同步的。 Hashtable繼承自Dictionary類,而HashMap是Java1.2引進的Map interface的一個實現
還有就是,HashMap把Hashtable的contains方法去掉了,改爲containsvalue和containsKey。由於contains方法容易讓人引發誤解。
最大的不一樣是,Hashtable的方法是Synchronize的,而HashMap不是,
多個線程訪問Hashtable時,不須要本身爲它的方法實現同步,而HashMap 就必須爲之提供外同步。 Hashtable和HashMap採用的hash/rehash算法都大概同樣,因此性能不會有很大的差別。
注意!
在jdk1.8以後,HashMap的儲存機制發生改變:數組table中的鏈表長度大於8時,自動轉換爲紅黑樹!