日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java集合源码学习(五)几种常用集合类的比较

發布時間:2025/7/14 java 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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集合源码学习(五)几种常用集合类的比较的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。