国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Collection List Set和Map用法與區(qū)別
首先看一下他們之間的關(guān)系

Collection          接口的接口   對(duì)象的集合
├ List                   子接口      按進(jìn)入先后有序保存   可重復(fù)
│├ LinkedList                接口實(shí)現(xiàn)類   鏈表   插入刪除   沒(méi)有同步   線程不安全
│├ ArrayList                  接口實(shí)現(xiàn)類   數(shù)組   隨機(jī)訪問(wèn)   沒(méi)有同步   線程不安全
│└ Vector                      接口實(shí)現(xiàn)類   數(shù)組                  同步        線程安全
│   └ Stack
└ Set                   子接口       僅接收一次,并做內(nèi)部排序

├ HashSet

│   └ LinkedHashSet
└ TreeSet



對(duì)于 List ,關(guān)心的是順序, 它保證維護(hù)元素特定的順序(允許有相同元素),使用此接口能夠精確的控制每個(gè)元素插入的位置。用戶能夠使用索引(元素在 List 中的位置,類似于數(shù)組下標(biāo))來(lái)訪問(wèn) List 中的元素。

對(duì)于 Set ,只關(guān)心某元素是否屬于 Set (不 允許有相同元素 ),而不關(guān)心它的順序。



Map                接口      鍵值對(duì)的集合
├ Hashtable                  接口實(shí)現(xiàn)類                  同步           線程安全
├ HashMap                   接口實(shí)現(xiàn)類                  沒(méi)有同步    線程不安全

│├ LinkedHashMap

│└ WeakHashMap

├ TreeMap
└ IdentifyHashMap


對(duì)于 Map ,最大的特點(diǎn)是鍵值映射,且為一一映射,鍵不能重復(fù),值可以,所以是用鍵來(lái)索引值。 方法 put(Object key, Object value) 添加一個(gè)“值” ( 想要得東西 ) 和與“值”相關(guān)聯(lián)的“鍵” (key) ( 使用它來(lái)查找 ) 。方法 get(Object key) 返回與給定“鍵”相關(guān)聯(lián)的“值”。

Map 同樣對(duì)每個(gè)元素保存一份,但這是基于 " 鍵 " 的, Map 也有內(nèi)置的排序,因而不關(guān)心元素添加的順序。如果添加元素的順序?qū)δ愫苤匾?,?yīng)該使用 LinkedHashSet 或者 LinkedHashMap.

對(duì)于效率, Map 由于采用了哈希散列,查找元素時(shí)明顯比 ArrayList 快。





但我有一個(gè)自己的原則想法:復(fù)雜的問(wèn)題簡(jiǎn)單化。即把很多晦澀難懂的問(wèn)題用通俗直白的話,一下子就看明白了,而不是大段大段的寫。不得不指出的是現(xiàn)在部分所謂的“專家”往往把簡(jiǎn)單的問(wèn)題復(fù)雜化,讓人看了生畏,甚至望而卻步,以此來(lái)顯示他的高深莫測(cè),當(dāng)然也可能有別的用意,那我就不得而知了。



更為精煉的總結(jié):

Collection 是對(duì)象集合, Collection 有兩個(gè)子接口 List 和 Set

List 可以通過(guò)下標(biāo) (1,2..) 來(lái)取得值,值可以重復(fù)

而 Set 只能通過(guò)游標(biāo)來(lái)取值,并且值是不能重復(fù)的

ArrayList , Vector , LinkedList 是 List 的實(shí)現(xiàn)類

ArrayList 是線程不安全的, Vector 是線程安全的,這兩個(gè)類底層都是由數(shù)組實(shí)現(xiàn)的

LinkedList 是線程不安全的,底層是由鏈表實(shí)現(xiàn)的  


Map 是鍵值對(duì)集合

HashTable 和 HashMap 是 Map 的實(shí)現(xiàn)類  
HashTable 是線程安全的,不能存儲(chǔ) null 值  
HashMap 不是線程安全的,可以存儲(chǔ) null 值 





所以,如果你是想在一個(gè)很短的時(shí)間來(lái)弄明白這些問(wèn)題,比如 1~2 分鐘。沒(méi)有也不想花大量時(shí)間于此,那么建議你現(xiàn)在就可以收兵走人了。



如果你想對(duì)此做一個(gè)詳細(xì)的了解,請(qǐng)繼續(xù)看下去。



眾所周知, Java 來(lái)源于 C++ ,屏蔽了其底層實(shí)現(xiàn),簡(jiǎn)化了對(duì)底層實(shí)現(xiàn)的管理,使開發(fā)者專注于上層功能的實(shí)現(xiàn)。在 C/C++ 里關(guān)于數(shù)據(jù)的存儲(chǔ)需要程序員非常清楚,而 Java 程序員可以完全不管這些,那么, Java 是怎么管理的呢?其實(shí) Java 還是需要面臨這些問(wèn)題,只不過(guò)經(jīng)過(guò)封裝后,變得面目全非。所以對(duì)于像我這種從 C/C++ 轉(zhuǎn)向 Java 的人還需要一段時(shí)間適應(yīng), Collection 、 List 、 Set 、 Map 等概念還需要一個(gè)接受的過(guò)程。其實(shí)到后來(lái)發(fā)現(xiàn),不管是什么語(yǔ)言,其底層存儲(chǔ)不外乎數(shù)組、線性表、棧、隊(duì)列、串、樹和圖等數(shù)據(jù)結(jié)構(gòu)。想明白了這些,一切都敞亮了。




一、容器( Collection ) 接口
   容器( Collection )是最基本的集合接口,一個(gè)容器( Collection )保存一組對(duì)象( Object ),即對(duì)象是容器的元素( Elements )。一些 Collection 允許相同的元素而另一些不行。一些能排序而另一些不行。 Java SDK 不提供直接繼承自 Collection 的類, Java SDK 提供的類都是繼承自 Collection 的 “ 子接口 ” 如 List 和 Set 。
  所有實(shí)現(xiàn) Collection 接口的類都必須提供兩個(gè)標(biāo)準(zhǔn)的構(gòu)造函數(shù):無(wú)參數(shù)的構(gòu)造函數(shù)用于創(chuàng)建一個(gè)空的 Collection ,有一個(gè) Collection 參數(shù)的構(gòu)造函數(shù)用于創(chuàng)建一個(gè)新的 Collection ,這個(gè)新的 Collection 與傳入的 Collection 有相同的元素。后一個(gè)構(gòu)造函數(shù)允許用戶復(fù)制一個(gè) Collection 。
  如何遍歷 Collection 中的每一個(gè)元素?不論 Collection 的實(shí)際類型如何,它都支持一個(gè) iterator() 的方法,該方法返回一個(gè)迭代子,使用該迭代子即可逐一訪問(wèn) Collection 中每一個(gè)元素。典型的用法如下:
     Iterator it = collection.iterator(); // 獲得一個(gè)迭代子
     while(it.hasNext()) {
       Object obj = it.next(); // 得到下一個(gè)元素
     }





由 Collection 接口派生的兩個(gè)接口是 List 和 Set 。 List 按對(duì)象進(jìn)入的順序保存對(duì)象,不做排序或編輯操作。 Set 對(duì)每個(gè)對(duì)象只接受一次,并使用自己內(nèi)部的排序方法 ( 通常,你只關(guān)心某個(gè)元素是否屬于 Set, 而不關(guān)心它的順序 -- 否則應(yīng)該使用 List) 。



1 , List 接口
   List 是有序的 Collection ,次序是 List 最重要的特點(diǎn):它保證維護(hù)元素特定的順序。使用此接口能夠精確的控制每個(gè)元素插入的位置。用戶能夠使用索引(元素在 List 中的位置,類似于數(shù)組下標(biāo))來(lái)訪問(wèn) List 中的元素,這類似于 Java 的數(shù)組。和下面要提到的 Set 不同, List 允許有相同的元素。
   除了具有 Collection 接口必備的 iterator() 方法外, List 還提供一個(gè) listIterator() 方法,返回一個(gè) ListIterator 接口,和標(biāo)準(zhǔn)的 Iterator 接口相比, ListIterator 多了一些 add() 之類的方法,允許添加,刪除,設(shè)定元素, 還能向前或向后遍歷。
  實(shí)現(xiàn) List 接口的常用類有 LinkedList , ArrayList , Vector 和 Stack 。其中,最常用的是 LinkedList 和 ArrayList 兩個(gè)。

LinkedList 類
    LinkedList 實(shí)現(xiàn)了 List 接口,允許 null 元素。此外 LinkedList 提供額外的 addFirst(), addLast(), getFirst(), getLast(), removeFirst(), removeLast(), insertFirst(), insertLast() 方法在 LinkedList 的首部或尾部,這些方法(沒(méi)有在任何接口或基類中定義過(guò))使 LinkedList 可被用作堆棧( stack ),隊(duì)列( queue )或雙向隊(duì)列( deque )。

注意 LinkedList 沒(méi)有同步方法。如果多個(gè)線程同時(shí)訪問(wèn)一個(gè) List ,則必須自己實(shí)現(xiàn)訪問(wèn)同步。一種解決方法是在創(chuàng)建 List 時(shí)構(gòu)造一個(gè)同步的 List :
     List list = Collections.synchronizedList(new LinkedList(...));

特點(diǎn):對(duì)順序訪問(wèn)進(jìn)行了優(yōu)化,向 List 中間插入與刪除的開銷并不大。隨機(jī)訪問(wèn)則相對(duì)較慢。 ( 使用 ArrayList 代替。 )

ArrayList 類
   ArrayList 是由數(shù)組實(shí)現(xiàn)的 List ,并且實(shí)現(xiàn)了可變大小的數(shù)組。它允許所有元素,包括 null 。 ArrayList 沒(méi)有同步。 size , isEmpty , get , set 方法運(yùn)行時(shí)間為常數(shù)。但是 add 方法開銷為分?jǐn)偟某?shù),添加 n 個(gè)元素需要 O(n) 的時(shí)間。其他的方法運(yùn)行時(shí)間為線性。
   每個(gè) ArrayList 實(shí)例都有一個(gè)容量( Capacity ),即用于存儲(chǔ)元素的數(shù)組的大小。這個(gè)容量可隨著不斷添加新元素而自動(dòng)增加,但是增長(zhǎng)算法并沒(méi)有定義。當(dāng)需要插入大量元素時(shí),在插入前可以調(diào)用 ensureCapacity 方法來(lái)增加 ArrayList 的容量以提高插入效率。
  和 LinkedList 一樣, ArrayList 也是非同步的( unsynchronized )。



特點(diǎn):允許對(duì)元素進(jìn)行快速隨機(jī)訪問(wèn),但是向 List 中間插入與移除元素的速度很慢。 ListIterator 只應(yīng)該用來(lái)由后向前遍歷 ArrayList, 而不是用來(lái)插入和移除元素。因?yàn)槟潜?LinkedList 開銷要大很多。



Vector 類
    Vector 非常類似 ArrayList ,但是 Vector 是同步的。由 Vector 創(chuàng)建的 Iterator ,雖然和 ArrayList 創(chuàng)建的 Iterator 是同一接口,但是,因?yàn)?Vector 是同步的,當(dāng)一個(gè) Iterator 被創(chuàng)建而且正在被使用,另一個(gè)線程改變了 Vector 的狀態(tài)(例如,添加或刪除了一些元素),這時(shí)調(diào)用 Iterator 的方法時(shí)將拋出 ConcurrentModificationException ,因此必須捕獲該異常。

     Stack 類: Stack 繼承自 Vector ,實(shí)現(xiàn)一個(gè)后進(jìn)先出的堆棧。 Stack 提供 5 個(gè)額外的方法使得 Vector 得以被當(dāng)作堆棧使用。基本的 push 和 pop 方法,還有 peek 方法得到棧頂?shù)脑兀?empty 方法測(cè)試堆棧是否為空, search 方法檢測(cè)一個(gè)元素在堆棧中的位置。 Stack 剛創(chuàng)建后是空棧。

2 , Set 接口
   Set 具有與 Collection 完全一樣的接口,因此沒(méi)有任何額外的功能,不像前面有幾個(gè)不同的 List 。實(shí)際上 Set 就是 Collection ,只是行為不同。(這是繼承與多態(tài)思想的典型應(yīng)用:表現(xiàn)不同的行為)。其次, Set 是一種不包含重復(fù)的元素的 Collection ,加入 Set 的元素必須定義 equals() 方法以確保對(duì)象的唯一性 ( 即任意的兩個(gè)元素 e1 和 e2 都有 e1.equals(e2)=false ),與 List 不同的是, Set 接口不保證維護(hù)元素的次序。最后, Set 最多有一個(gè) null 元素。
  很明顯, Set 的構(gòu)造函數(shù)有一個(gè)約束條件,傳入的 Collection 參數(shù)不能包含重復(fù)的元素。
  請(qǐng)注意:必須小心操作可變對(duì)象( Mutable Object )。如果一個(gè) Set 中的可變?cè)馗淖兞俗陨頎顟B(tài)導(dǎo)致 Object.equals(Object)=true 將導(dǎo)致一些問(wèn)題。


HashSet 類

為快速查找設(shè)計(jì)的 Set 。存入 HashSet 的對(duì)象必須定義 hashCode() 。



LinkedHashSet 類:具有 HashSet 的查詢速度,且內(nèi)部使用鏈表維護(hù)元素的順序 ( 插入的次序 ) 。于是在使用迭代器遍歷 Set 時(shí),結(jié)果會(huì)按元素插入的次序顯示。



TreeSet 類

保存次序的 Set, 底層為樹結(jié)構(gòu)。使用它可以從 Set 中提取有序的序列。





二、 Map 接口
   請(qǐng)注意, Map 沒(méi)有繼承 Collection 接口, Map 提供 key 到 value 的映射,你可以通過(guò)“鍵”查找“值”。一個(gè) Map 中不能包含相同的 key ,每個(gè) key 只能映射一個(gè) value 。 Map 接口提供 3 種集合的視圖, Map 的內(nèi)容可以被當(dāng)作一組 key 集合,一組 value 集合,或者一組 key-value 映射。

方法 put(Object key, Object value) 添加一個(gè)“值” ( 想要得東西 ) 和與“值”相關(guān)聯(lián)的“鍵” (key) ( 使用它來(lái)查找 ) 。方法 get(Object key) 返回與給定“鍵”相關(guān)聯(lián)的“值”。可以用 containsKey() 和 containsValue() 測(cè)試 Map 中是否包含某個(gè)“鍵”或“值”。 標(biāo)準(zhǔn)的 Java 類庫(kù)中包含了幾種不同的 Map : HashMap, TreeMap, LinkedHashMap, WeakHashMap, IdentityHashMap 。它們都有同樣的基本接口 Map ,但是行為、效率、排序策略、保存對(duì)象的生命周期和判定“鍵”等價(jià)的策略等各不相同。

Map 同樣對(duì)每個(gè)元素保存一份,但這是基于 " 鍵 " 的, Map 也有內(nèi)置的排序,因而不關(guān)心元素添加的順序。如果添加元素的順序?qū)δ愫苤匾瑧?yīng)該使用 LinkedHashSet 或者 LinkedHashMap.

執(zhí)行效率是 Map 的一個(gè)大問(wèn)題??纯?get() 要做哪些事,就會(huì)明白為什么在 ArrayList 中搜索“鍵”是相當(dāng)慢的。而這正是 HashMap 提高速度的地方。 HashMap 使用了特殊的值,稱為“散列碼” (hash code) ,來(lái)取代對(duì)鍵的緩慢搜索。“散列碼”是“相對(duì)唯一”用以代表對(duì)象的 int 值,它是通過(guò)將該對(duì)象的某些信息進(jìn)行轉(zhuǎn)換而生成的(在下面總結(jié)二:需要的注意的地方有更進(jìn)一步探討)。所有 Java 對(duì)象都能產(chǎn)生散列碼,因?yàn)?hashCode() 是定義在基類 Object 中的方法 。 HashMap 就是使用對(duì)象的 hashCode() 進(jìn)行快速查詢的。此方法能夠顯著提高性能。


Hashtable 類
   Hashtable 繼承 Map 接口,實(shí)現(xiàn)一個(gè) key-value 映射的哈希表。任何非空( non-null )的對(duì)象都可作為 key 或者 value 。
  添加數(shù)據(jù)使用 put(key, value) ,取出數(shù)據(jù)使用 get(key) ,這兩個(gè)基本操作的時(shí)間開銷為常數(shù)。
    Hashtable 通過(guò)初始化容量 (initial capacity) 和負(fù)載因子 (load factor) 兩個(gè)參數(shù)調(diào)整性能。通常缺省的 load factor 0.75 較好地實(shí)現(xiàn)了時(shí)間和空間的均衡。增大 load factor 可以節(jié)省空間但相應(yīng)的查找時(shí)間將增大,這會(huì)影響像 get 和 put 這樣的操作。
    使用 Hashtable 的簡(jiǎn)單示例如下,將 1 , 2 , 3 放到 Hashtable 中,他們的 key 分別是 ”one” , ”two” , ”three” :
     Hashtable numbers = new Hashtable();
     numbers.put(“one”, new Integer(1));
     numbers.put(“two”, new Integer(2));
     numbers.put(“three”, new Integer(3));
  要取出一個(gè)數(shù),比如 2 ,用相應(yīng)的 key :
     Integer n = (Integer)numbers.get(“two”);
     System.out.println(“two = ” + n);
   由于作為 key 的對(duì)象將通過(guò)計(jì)算其散列函數(shù)來(lái)確定與之對(duì)應(yīng)的 value 的位置,因此任何作為 key 的對(duì)象都必須實(shí)現(xiàn) hashCode 方法和 equals 方法。 hashCode 方法和 equals 方法繼承自根類 Object ,如果你用自定義的類當(dāng)作 key 的話,要相當(dāng)小心,按照散列函數(shù)的定義,如果兩個(gè)對(duì)象相同,即 obj1.equals(obj2)=true ,則它們的 hashCode 必須相同,但如果兩個(gè)對(duì)象不同,則它們的 hashCode 不一定不同,如果兩個(gè)不同對(duì)象的 hashCode 相同,這種現(xiàn)象稱為沖突,沖突會(huì)導(dǎo)致操作哈希表的時(shí)間開銷增大,所以盡量定義好的 hashCode() 方法,能加快哈希表的操作。
  如果相同的對(duì)象有不同的 hashCode ,對(duì)哈希表的操作會(huì)出現(xiàn)意想不到的結(jié)果(期待的 get 方法返回 null ),要避免這種問(wèn)題,只需要牢記一條:要同時(shí)復(fù)寫 equals 方法和 hashCode 方法,而不要只寫其中一個(gè)。
   Hashtable 是同步的。

HashMap 類
    HashMap 和 Hashtable 類似,也是基于散列表的實(shí)現(xiàn)。不同之處在于 HashMap 是非同步的,并且允許 null ,即 null value 和 null key 。將 HashMap 視為 Collection 時(shí)( values() 方法可返回 Collection ),插入和查詢“鍵值對(duì)”的開銷是固定的,但其迭代子操作時(shí)間開銷和 HashMap 的容量成比例。因此,如果迭代操作的性能相當(dāng)重要的話,不要將 HashMap 的初始化容量 (initial capacity) 設(shè)得過(guò)高,或者負(fù)載因子 (load factor) 過(guò)低。


   LinkedHashMap 類:類似于 HashMap ,但是迭代遍歷它時(shí),取得“鍵值對(duì)”的順序是其插入次序,或者是最近最少使用 (LRU) 的次序。只比 HashMap 慢一點(diǎn)。而在迭代訪問(wèn)時(shí)發(fā)而更快,因?yàn)樗褂面湵砭S護(hù)內(nèi)部次序。



WeakHashMap 類:弱鍵( weak key ) Map 是一種改進(jìn)的 HashMap ,它是為解決特殊問(wèn)題設(shè)計(jì)的,對(duì) key 實(shí)行 “ 弱引用 ” ,如果一個(gè) key 不再被外部所引用(沒(méi)有 map 之外的引用),那么該 key 可以被垃圾收集器 (GC) 回收。



TreeMap 類

基于紅黑樹數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)。查看“鍵”或“鍵值對(duì)”時(shí),它們會(huì)被排序 ( 次序由 Comparabel 或 Comparator 決定 ) 。 TreeMap 的特點(diǎn)在于,你得到的結(jié)果是經(jīng)過(guò)排序的。 TreeMap 是唯一的帶有 subMap() 方法的 Map ,它可以返回一個(gè)子樹。


IdentifyHashMap 類

使用 == 代替 equals() 對(duì)“鍵”作比較的 hash map 。專為解決特殊問(wèn)題而設(shè)計(jì)。





總結(jié)一:比較

1 ,數(shù)組 (Array) ,數(shù)組類 (Arrays)

Java 所有“存儲(chǔ)及隨機(jī)訪問(wèn)一連串對(duì)象”的做法, array 是最有效率的一種。但缺點(diǎn)是容量固定且無(wú)法動(dòng)態(tài)改變。 array 還有一個(gè)缺點(diǎn)是,無(wú)法判斷其中實(shí)際存有多少元素, length 只是告訴我們 array 的容量。



Java 中有一個(gè)數(shù)組類 (Arrays) ,專門用來(lái)操作 array 。數(shù)組類 (arrays) 中擁有一組 static 函數(shù)。

equals() :比較兩個(gè) array 是否相等。 array 擁有相同元素個(gè)數(shù),且所有對(duì)應(yīng)元素兩兩相等。

fill() :將值填入 array 中。

sort() :用來(lái)對(duì) array 進(jìn)行排序。

binarySearch() :在排好序的 array 中尋找元素。

System.arraycopy() : array 的復(fù)制。



若編寫程序時(shí)不知道究竟需要多少對(duì)象,需要在空間不足時(shí)自動(dòng)擴(kuò)增容量,則需要使用容器類庫(kù), array 不適用。



2 ,容器類與數(shù)組的區(qū)別

容器類僅能持有對(duì)象引用(指向?qū)ο蟮闹羔槪?,而不是將?duì)象信息 copy 一份至數(shù)列某位置。一旦將對(duì)象置入容器內(nèi),便損失了該對(duì)象的型別信息。



3 ,容器 (Collection) 與 Map 的聯(lián)系與區(qū)別

Collection 類型,每個(gè)位置只有一個(gè)元素。

Map 類型,持有 key-value 對(duì) (pair) ,像個(gè)小型數(shù)據(jù)庫(kù)。



Collections 是針對(duì)集合類的一個(gè)幫助類。提供了一系列靜態(tài)方法實(shí)現(xiàn)對(duì)各種集合的搜索、排序、線程完全化等操作。相當(dāng)于對(duì) Array 進(jìn)行類似操作的類—— Arrays 。

如, Collections.max(Collection coll); 取 coll 中最大的元素。

    Collections.sort(List list); 對(duì) list 中元素排序



List , Set , Map 將持有對(duì)象一律視為 Object 型別。

Collection 、 List 、 Set 、 Map 都是接口,不能實(shí)例化。繼承自它們的 ArrayList, Vector, HashTable, HashMap 是具象 class ,這些才可被實(shí)例化。

vector 容器確切知道它所持有的對(duì)象隸屬什么型別。 vector 不進(jìn)行邊界檢查。





總結(jié)二:需要注意的地方

1 、 Collection 只能通過(guò) iterator() 遍歷元素,沒(méi)有 get() 方法來(lái)取得某個(gè)元素。

2 、 Set 和 Collection 擁有一模一樣的接口。但排除掉傳入的 Collection 參數(shù)重復(fù)的元素。

3 、 List ,可以通過(guò) get() 方法來(lái)一次取出一個(gè)元素。使用數(shù)字來(lái)選擇一堆對(duì)象中的一個(gè), get(0)... 。 (add/get)

4 、 Map 用 put(k,v) / get(k) ,還可以使用 containsKey()/containsValue() 來(lái)檢查其中是否含有某個(gè) key/value 。

HashMap 會(huì)利用對(duì)象的 hashCode 來(lái)快速找到 key 。

哈希碼 (hashing) 就是將對(duì)象的信息經(jīng)過(guò)一些轉(zhuǎn)變形成一個(gè)獨(dú)一無(wú)二的 int 值,這個(gè)值存儲(chǔ)在一個(gè) array 中。我們都知道所有存儲(chǔ)結(jié)構(gòu)中, array 查找速度是最快的。所以,可以加速查找。發(fā)生碰撞時(shí),讓 array 指向多個(gè) values 。即,數(shù)組每個(gè)位置上又生成一個(gè)梿表。

5 、 Map 中元素,可以將 key 序列、 value 序列單獨(dú)抽取出來(lái)。

使用 keySet() 抽取 key 序列,將 map 中的所有 keys 生成一個(gè) Set 。

使用 values() 抽取 value 序列,將 map 中的所有 values 生成一個(gè) Collection 。

為什么一個(gè)生成 Set ,一個(gè)生成 Collection ?那是因?yàn)椋?key 總是獨(dú)一無(wú)二的, value 允許重復(fù)。




總結(jié)三:如何選擇
從效率角度:

在各種 Lists ,對(duì)于需要快速插入,刪除元素,應(yīng)該使用 LinkedList (可用 LinkedList 構(gòu)造堆棧 stack 、隊(duì)列 queue ),如果需要快速隨機(jī)訪問(wèn)元素,應(yīng)該使用 ArrayList 。最好的做法是以 ArrayList 作為缺省選擇。 Vector 總是比 ArrayList 慢,所以要盡量避免使用。

在各種 Sets 中, HashSet 通常優(yōu)于 HashTree (插入、查找)。只有當(dāng)需要產(chǎn)生一個(gè)經(jīng)過(guò)排序的序列,才用 TreeSet 。 HashTree 存在的唯一理由:能夠維護(hù)其內(nèi)元素的排序狀態(tài)。



在各種 Maps 中 HashMap 用于快速查找。

最后,當(dāng)元素個(gè)數(shù)固定,用 Array ,因?yàn)?Array 效率是最高的。

所以結(jié)論:最常用的是 ArrayList , HashSet , HashMap , Array 。



更近一步分析:

如果程序在單線程環(huán)境中,或者訪問(wèn)僅僅在一個(gè)線程中進(jìn)行,考慮非同步的類,其效率較高,如果多個(gè)線程可能同時(shí)操作一個(gè)類,應(yīng)該使用同步的類。
要特別注意對(duì)哈希表的操作,作為 key 的對(duì)象要同時(shí)正確復(fù)寫 equals 方法和 hashCode 方法。
盡量返回接口而非實(shí)際的類型,如返回 List 而非 ArrayList ,這樣如果以后需要將 ArrayList 換成 LinkedList 時(shí),客戶端代碼不用改變。這就是針對(duì)抽象編程。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
map
Vector、 ArrayList 、List、 Set、 Map
Java基本概念:集合類 List/Set/Map 的區(qū)別和聯(lián)系
JAVA集合類(介紹)
java 容器類使用 Collection,Map,HashMap,hashTable,TreeMap,List,Vector,ArrayList的區(qū)別
Java容器類List、ArrayList、Vector及map、HashMap
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服