Java集合源码学习(五)几种常用集合类的比较
這篇筆記對幾個常用的集合實現,從效率,線程安全和應用場景進行綜合比較。
1.ArrayList、LinkedList與Vector的對比
(1)相同和不同
都實現了List接口,使用類似。
Vector和ArrayList的底層實現都是數組,這一點與LinkedList的雙向鏈表不同。
Vector和ArrayList在更多元素添加進來時會請求更大的空間。Vector每次請求其大小的雙倍空間,而ArrayList每次對size增長50%。
(2)線程安全
ArrayList、LinkedList都沒有進行同步,可以使用 Collections的同步方法進行包裝。
(3)性能比較
在ArrayList和Vector中,從一個指定的位置(通過索引)查找數據或是在集合的末尾增加、移除一個元素所花費的時間是一樣的,這個時間我們用O(1)表示。但是,如果在集合的其他位置增加或移除元素那么花費的時間會呈線形增長:O(n-i),其中n代表集合中元素的個數,i代表元素增加或移除元素的索引位置,即時間復雜度O(N)。為什么會這樣呢?因為數組在內存上是連續的,進行上述操作的時候集合中第i和第i個元素之后的所有元素都要執行位移的操作。
如果你只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用Vector或ArrayList都可以。如果是其他操作,你最好選擇其他的集合操作類。比如,LinkList集合類在增加或移除集合中任何位置的元素所花費的時間都是一樣的O(1),但它在索引一個元素的是有比較慢,O(i),其中i是索引的位置。
2.HashMap與HashTable比較
(1)是否允許空值
HashMap允許 null 值(key和value都可以),Hashtable不允許 null 值(key 和 value 都不可以),
這一點在之前學習源碼時也注意到了,看一下HashTable的源碼:
| 1 2 3 4 5 6 7 | public synchronized V put(K key, V value) { ???????// Make sure the value is not null ???????if (value == null) { ???????????throw new NullPointerException(); ???????} ???????...... ???} |
(2)哈希值的使用不同
Hashtable直接使用對象的hashCode,代碼是這樣的:
| 1 2 | int hash = key.hashCode(); int index = (hash & 0x7FFFFFFF) % tab.length; |
而HashMap重新計算hash值,這一點在之前的分析中也看到了:
| 1 2 | int hash = hash(k); int i = indexFor(hash, table.length); |
另外還有一些如內部鏈表數組使用方式不同等差異。
(3)線程安全
HashMap和HashTable在線程安全性上就如同ArrayList和Vector類似,
HashTable的操作都使用synchronized做了同步。需要注意這是一種性能較低的線程安全。
>>HashSet和HashMap的區別
HashSet 實現了 Set 接口,它不允許集合中有重復的值,在將對象存儲在 HashSet 之前,要先確保對象重寫 equals()和 hashCode()方法,這樣才能比較對象的值是否相等,以確保set中沒有儲存相等的對象。
HashMap 實現了 Map 接口,Map 接口對鍵值對進行映射。Map 中不允許重復的鍵。Map 接口有兩個基本的實現,HashMap 和 TreeMap。TreeMap 保存了對象的排列次序,而 HashMap 則不能。HashMap 允許鍵和值為 null。
(1)不同之處
HashMap實現了Map接口 HashSet實現了Set接口
HashMap儲存鍵值對 HashSet僅僅存儲對象
使用put()方法將元素放入map中 使用add()方法將元素放入set中
HashMap中使用鍵對象來計算hashcode值 HashSet使用成員對象來計算hashcode值,對于兩個對象來說hashcode可能相同,所以equals()方法用來判斷對象的相等性,如果兩個對象不同的話,那么返回false
HashMap比較快,因為是使用唯一的鍵來獲取對象 HashSet較HashMap來說比較慢
(2)線程安全
HashMap 是非 synchronized 的。
總結
以上是生活随笔為你收集整理的Java集合源码学习(五)几种常用集合类的比较的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Appium环境搭建简介
- 下一篇: 见闻整理