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

歡迎訪問 生活随笔!

生活随笔

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

java

Java中Map, List, Set和Queue的区别和使用场景

發布時間:2023/12/10 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java中Map, List, Set和Queue的区别和使用场景 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉:https://blog.csdn.net/kingcat666/article/details/75579632

1. Java集合類基本概念

在編程中,常常需要集中存放多個數據。從傳統意義上講,數組是我們的一個很好的選擇,前提是我們事先已經明確知道我們將要保存的對象的數量。一旦在數組初始化時指定了這個數組長度,這個數組長度就是不可變的,如果我們需要保存一個可以動態增長的數據(在編譯時無法確定具體的數量),java的集合類就是一個很好的設計方案了。

集合類主要負責保存、盛裝其他數據,因此集合類也被稱為容器類。所以的集合類都位于java.util包下,后來為了處理多線程環境下的并發安全問題,java5還在java.util.concurrent包下提供了一些多線程支持的集合類。

Java容器類類庫的用途是"保存對象",并將其劃分為兩個不同的概念:

1) Collection
一組"對立"的元素,通常這些元素都服從某種規則
?  1.1) List必須保持元素特定的順序
?  1.2) Set不能有重復元素
?  1.3) Queue保持一個隊列(先進先出)的順序
2) Map

一組成對的"鍵值對"對象

Collection和Map的區別在于容器中每個位置保存的元素個數:

1) Collection 每個位置只能保存一個元素(對象)

?

2) Map保存的是"鍵值對",就像一個小型數據庫。我們可以通過"鍵"找到該鍵對應的"值"

2. Java集合類架構層次關系

1. Interface Iterable

迭代器接口,這是Collection類的父接口。實現這個Iterable接口的對象允許使用foreach進行遍歷,也就是說,所有的Collection集合對象都具有"foreach可遍歷性"。這個Iterable接口只
有一個方法:?iterator()。它返回一個代表當前集合對象的泛型<T>迭代器,用于之后的遍歷操作

1.1 Collection

Collection是最基本的集合接口,一個Collection代表一組Object的集合,這些Object被稱作Collection的元素。Collection是一個接口,用以提供規范定義,不能被實例化使用

? ? 1) Set

? ? Set集合類似于一個罐子,"丟進"Set集合里的多個對象之間沒有明顯的順序。Set繼承自Collection接口,不能包含有重復元素(記住,這是整個Set類層次的共有屬性)。
? ? Set判斷兩個對象相同不是使用"=="運算符,而是根據equals方法。也就是說,我們在加入一個新元素的時候,如果這個新元素對象和Set中已有對象進行注意equals比較都返回false,則Set就會接受這個新元素對象,否則拒絕。
? ? 因為Set的這個制約,在使用Set集合的時候,應該注意兩點:

1) 為Set集合里的元素的實現類實現一個有效的equals(Object)方法、

2) 對Set的構造函數,傳入的Collection參數不能包含重復的元素

? ? ? ? 1.1) HashSet

? ? ? ? HashSet是Set接口的典型實現,HashSet使用HASH算法來存儲集合中的元素,因此具有良好的存取和查找性能。當向HashSet集合中存入一個元素時,HashSet會調用該對象的hashCode()方法來得到該對象的hashCode值,然后根據該HashCode值決定該對象在HashSet中的存儲位置。
? ? ? ? 值得注意的是,HashSet集合判斷兩個元素相等的標準是兩個對象通過equals()方法比較相等,并且兩個對象的hashCode()方法的返回值相等

? ? ? ? ? ? 1.1.1) LinkedHashSet

? ? ? ? ? ? LinkedHashSet集合也是根據元素的hashCode值來決定元素的存儲位置,但和HashSet不同的是,它同時使用鏈表維護元素的次序,這樣使得元素看起來是以插入的順序保存的。
    當遍歷LinkedHashSet集合里的元素時,LinkedHashSet將會按元素的添加順序來訪問集合里的元素。LinkedHashSet需要維護元素的插入順序,因此性能略低于HashSet的性能,但在迭代訪問Set里的全部元素時(遍歷)將有很好的性能(鏈表很適合進行遍歷)

? ? ? ? 1.2) SortedSet ? ?

? ? ? ? 此接口主要用于排序操作,即實現此接口的子類都屬于排序的子類

? ? ? ? ? ? 1.2.1) TreeSet

? ? ? ? ? ? TreeSet是SortedSet接口的實現類,TreeSet可以確保集合元素處于排序狀態

? ? ? ? 1.3) EnumSet

? ? ? ? EnumSet是一個專門為枚舉類設計的集合類,EnumSet中所有元素都必須是指定枚舉類型的枚舉值,該枚舉類型在創建EnumSet時顯式、或隱式地指定。EnumSet的集合元素也是有序的,
   它們以枚舉值在Enum類內的定義順序來決定集合元素的順序

? ??2) List

? ? List集合代表一個元素有序、可重復的集合,集合中每個元素都有其對應的順序索引。List集合允許加入重復元素,因為它可以通過索引來訪問指定位置的集合元素。List集合默認按元素的添加順序設置元素的索引

? ? ? ? 2.1) ArrayList

? ? ? ? ArrayList是基于數組實現的List類,它封裝了一個動態的增長的、允許再分配的Object[]數組。

? ? ? ? 2.2) Vector

? ? ? ? Vector和ArrayList在用法上幾乎完全相同,但由于Vector是一個古老的集合,所以Vector提供了一些方法名很長的方法,但隨著JDK1.2以后,java提供了系統的集合框架,就將Vector改為實現List接口,統一歸入集合框架體系中

? ? ? ? ? ? 2.2.1) Stack

? ? ? ? ? ? Stack是Vector提供的一個子類,用于模擬""這種數據結構(LIFO后進先出)

? ? ? ? 2.3) LinkedList

? ? ? ? implements List<E>, Deque<E>。實現List接口,能對它進行隊列操作,即可以根據索引來隨機訪問集合中的元素。同時它還實現Deque接口,即能將LinkedList當作雙端隊列使用。自然也可以被當作"棧來使用"

? ??3) Queue

? ? Queue用于模擬"隊列"這種數據結構(先進先出 FIFO)。隊列的頭部保存著隊列中存放時間最長的元素,隊列的尾部保存著隊列中存放時間最短的元素。新元素插入(offer)到隊列的尾部,訪問元素(poll)操作會返回隊列頭部的元素,隊列不允許隨機訪問隊列中的元素。結合生活中常見的排隊就會很好理解這個概念

? ? ? ? 3.1) PriorityQueue

? ? ? ? PriorityQueue并不是一個比較標準的隊列實現,PriorityQueue保存隊列元素的順序并不是按照加入隊列的順序,而是按照隊列元素的大小進行重新排序,這點從它的類名也可以看出來

? ? ? ? 3.2) Deque

? ? ? ? Deque接口代表一個"雙端隊列",雙端隊列可以同時從兩端來添加、刪除元素,因此Deque的實現類既可以當成隊列使用、也可以當成棧使用

? ? ? ? ? ? 3.2.1) ArrayDeque

? ? ? ? ? ? 是一個基于數組的雙端隊列,和ArrayList類似,它們的底層都采用一個動態的、可重分配的Object[]數組來存儲集合元素,當集合元素超出該數組的容量時,系統會在底層重新分配一個Object[]數組來存儲集合元素

? ? ? ? ? ? 3.2.2) LinkedList

1.2 Map

? ? Map用于保存具有"映射關系"的數據,因此Map集合里保存著兩組值,一組值用于保存Map里的key,另外一組值用于保存Map里的value。key和value都可以是任何引用類型的數據。Map的key不允許重復,即同一個Map對象的任何兩個key通過equals方法比較結果總是返回false。
? ? 關于Map,我們要從代碼復用的角度去理解,java是先實現了Map,然后通過包裝了一個所有value都為null的Map就實現了Set集合。Map的這些實現類和子接口中key集的存儲形式和Set集合完全相同(即key不能重復)
? ? Map的這些實現類和子接口中value集的存儲形式和List非常類似(即value可以重復、根據索引來查找)

? ??1) HashMap

? ? 和HashSet集合不能保證元素的順序一樣,HashMap也不能保證key-value對的順序。并且類似于HashSet判斷兩個key是否相等的標準也是: 兩個key通過equals()方法比較返回true、同時兩個key的hashCode值也必須相等

? ? ? ? 1.1) LinkedHashMap

? ? ? ? LinkedHashMap也使用雙向鏈表來維護key-value對的次序,該鏈表負責維護Map的迭代順序,與key-value對的插入順序一致(注意和TreeMap對所有的key-value進行排序進行區分)

? ??2) Hashtable

? ? 是一個古老的Map實現類

? ? ? ? 2.1) Properties?

? ? ? ? Properties對象在處理屬性文件時特別方便(windows平臺上的.ini文件),Properties類可以把Map對象和屬性文件關聯起來,從而可以把Map對象中的key-value對寫入到屬性文件中,也可以把屬性文件中的"屬性名-屬性值"加載到Map對象中

? ??3) SortedMap

? ? 正如Set接口派生出SortedSet子接口,SortedSet接口有一個TreeSet實現類一樣,Map接口也派生出一個SortedMap子接口,SortedMap接口也有一個TreeMap實現類

? ? ? ? 3.1) TreeMap

? ? ? ? TreeMap就是一個紅黑樹數據結構,每個key-value對即作為紅黑樹的一個節點。TreeMap存儲key-value對(節點)時,需要根據key對節點進行排序。TreeMap可以保證所有的key-value對處于有序狀態。同樣,TreeMap也有兩種排序方式: 自然排序、定制排序

? ??4) WeakHashMap

? ? WeakHashMap與HashMap的用法基本相似。區別在于,HashMap的key保留了對實際對象的"強引用",這意味著只要該HashMap對象不被銷毀,該HashMap所引用的對象就不會被垃圾回收。
  但WeakHashMap的key只保留了對實際對象的弱引用,這意味著如果WeakHashMap對象的key所引用的對象沒有被其他強引用變量所引用,則這些key所引用的對象可能被垃圾回收,當垃圾回收了該key所對應的實際對象之后,WeakHashMap也可能自動刪除這些key所對應的key-value對

? ??5) IdentityHashMap

? ? IdentityHashMap的實現機制與HashMap基本相似,在IdentityHashMap中,當且僅當兩個key嚴格相等(key1 == key2)時,IdentityHashMap才認為兩個key相等

? ??6) EnumMap

? ? EnumMap是一個與枚舉類一起使用的Map實現,EnumMap中的所有key都必須是單個枚舉類的枚舉值。創建EnumMap時必須顯式或隱式指定它對應的枚舉類。EnumMap根據key的自然順序


3. Java集合類使用場景規則

Set集合:

1) HashSet的性能總是比TreeSet好(特別是最常用的添加、查詢元素等操作),因為TreeSet需要額外的紅黑樹算法來維護集合元素的次序。只有當需要一個保持排序的Set時,才應該使用TreeSet,否則都應該使用HashSet 2) 對于普通的插入、刪除操作,LinkedHashSet比HashSet要略慢一點,這是由維護鏈表所帶來的開銷造成的。不過,因為有了鏈表的存在,遍歷LinkedHashSet會更快 3) EnumSet是所有Set實現類中性能最好的,但它只能保存同一個枚舉類的枚舉值作為集合元素 4) HashSet、TreeSet、EnumSet都是"線程不安全"的,通常可以通過Collections工具類的synchronizedSortedSet方法來"包裝"該Set集合。 SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...));

?

List集合:

1. java提供的List就是一個"線性表接口",ArrayList(基于數組的線性表)、LinkedList(基于鏈的線性表)是線性表的兩種典型實現 2. Queue代表了隊列,Deque代表了雙端隊列(既可以作為隊列使用、也可以作為棧使用) 3. 因為數組以一塊連續內存來保存所有的數組元素,所以數組在隨機訪問時性能最好。所以的內部以數組作為底層實現的集合在隨機訪問時性能最好。 4. 內部以鏈表作為底層實現的集合在執行插入、刪除操作時有很好的性能 5. 進行迭代操作時,以鏈表作為底層實現的集合比以數組作為底層實現的集合性能好


Map集合:

1) HashMap和Hashtable的效率大致相同,因為它們的實現機制幾乎完全一樣。但HashMap通常比Hashtable要快一點,因為Hashtable需要額外的線程同步控制 2) TreeMap通常比HashMap、Hashtable要慢(尤其是在插入、刪除key-value對時更慢),因為TreeMap底層采用紅黑樹來管理key-value對 3) 使用TreeMap的一個好處就是: TreeMap中的key-value對總是處于有序狀態,無須專門進行排序操作

總結

以上是生活随笔為你收集整理的Java中Map, List, Set和Queue的区别和使用场景的全部內容,希望文章能夠幫你解決所遇到的問題。

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