詳解Java集合框架,讓你全面掌握!-創(chuàng)新互聯(lián)

一、Java集合框架概述

集合可以看作是一種容器,用來存儲對象信息。所有集合類都位于java.util包下,但支持多線程的集合類位于java.util.concurrent包下。

創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、成都網(wǎng)站制作、網(wǎng)站營銷推廣、網(wǎng)站開發(fā)設(shè)計,對服務(wù)活動板房等多個行業(yè)擁有豐富的網(wǎng)站建設(shè)及推廣經(jīng)驗。創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司成立于2013年,提供專業(yè)網(wǎng)站制作報價服務(wù),我們深知市場的競爭激烈,認(rèn)真對待每位客戶,為客戶提供賞心悅目的作品。 與客戶共同發(fā)展進步,是我們永遠的責(zé)任!

數(shù)組與集合的區(qū)別如下

1)數(shù)組長度不可變化而且無法保存具有映射關(guān)系的數(shù)據(jù);集合類用于保存數(shù)量不確定的數(shù)據(jù),以及保存具有映射關(guān)系的數(shù)據(jù)。

2)數(shù)組元素既可以是基本類型的值,也可以是對象;集合只能保存對象。

Java集合類主要由兩個根接口CollectionMap派生出來的,Collection派生出了三個子接口:List、Set、Queue(Java5新增的隊列),因此Java集合大致也可分成List、Set、Queue、Map四種接口體系,(注意:Map不是Collection的子接口)。

Java集合框架圖如下:

詳解Java集合框架,讓你全面掌握!

詳解Java集合框架,讓你全面掌握!

其中List代表了有序可重復(fù)集合,可直接根據(jù)元素的索引來訪問;Set代表無序不可重復(fù)集合,只能根據(jù)元素本身來訪問;Queue是隊列集合;Map代表的是存儲key-value對的集合,可根據(jù)元素的key來訪問value。

上圖中淡綠色背景覆蓋的是集合體系中常用的實現(xiàn)類,分別是ArrayList、LinkedList、ArrayQueue、HashSet、TreeSet、HashMap、TreeMap等實現(xiàn)類。

二、Java集合常見接口及實現(xiàn)類

1. Collection接口常見方法(來源于Java API)

詳解Java集合框架,讓你全面掌握!

2. Set集合

Set集合與Collection的方法相同,由于Set集合不允許存儲相同的元素,所以如果把兩個相同元素添加到同一個Set集合,則添加操作失敗,新元素不會被加入,add()方法返回false。為了幫助理解,請看下面代碼示例:

public static void main(String[] args) {
   Set<String> set=new HashSet();
   set.add("hello world");
   set.add("hello 冰湖一角");
   set.add("hello 冰湖一角");
   System.out.println("集合中元素個數(shù):"
        +set.size());
   System.out.println("集合中元素為:"
       +set.toString());
  }
}</pre>

運行結(jié)果如下:

集合中元素個數(shù):2
集合中元素為:[hello world, hello 冰湖一角]

分析:由于String類中重寫了hashCode()和equals()方法,用來比較指向的字符串對象所存儲的字符串是否相等。所以這里的第二個"hello 冰湖一角"是加不進去的。

下面著重介紹Set集合幾個常用實現(xiàn)類:

1)HashSet類

HashSet是Set集合最常用實現(xiàn)類,是其經(jīng)典實現(xiàn)。HashSet是按照hash算法來存儲元素的,因此具有很好的存取和查找性能。

HashSet具有如下特點:

? 不能保證元素的順序。

? HashSet不是線程同步的,如果多線程操作HashSet集合,則應(yīng)通過代碼來保證其同步。

? 集合元素值可以是null。

HashSet存儲原理如下:

當(dāng)向HashSet集合存儲一個元素時,HashSet會調(diào)用該對象的hashCode()方法得到其hashCode值,然后根據(jù)hashCode值決定該對象的存儲位置。HashSet集合判斷兩個元素相等的標(biāo)準(zhǔn)是(1)兩個對象通過equals()方法比較返回true;(2)兩個對象的hashCode()方法返回值相等。因此,如果(1)和(2)有一個不滿足條件,則認(rèn)為這兩個對象不相等,可以添加成功。如果兩個對象的hashCode()方法返回值相等,但是兩個對象通過equals()方法比較返回false,HashSet會以鏈?zhǔn)浇Y(jié)構(gòu)將兩個對象保存在同一位置,這將導(dǎo)致性能下降,因此在編碼時應(yīng)避免出現(xiàn)這種情況。

HashSet查找原理如下:

基于HashSet以上的存儲原理,在查找元素時,HashSet先計算元素的HashCode值(也就是調(diào)用對象的hashCode方法的返回值),然后直接到hashCode值對應(yīng)的位置去取出元素即可,這就是HashSet速度很快的原因。

重寫hashCode()方法的基本原則如下:

? 在程序運行過程中,同一個對象的hashCode()方法返回值應(yīng)相同。

? 當(dāng)兩個對象通過equals()方法比較返回true時,這兩個對象的hashCode()方法返回值應(yīng)該相等。

? 對象中用作equals()方法比較標(biāo)準(zhǔn)的實例變量,都應(yīng)該用于計算hashCode值。

2)LinkedHashSet類

LinkedHashSet是HashSet的一個子類,具有HashSet的特性,也是根據(jù)元素的hashCode值來決定元素的存儲位置。但它使用鏈表維護元素的次序,元素的順序與添加順序一致。由于LinkedHashSet需要維護元素的插入順序,因此性能略低于HashSet,但在迭代訪問Set里的全部元素時由很好的性能。

3)TreeSet類

TreeSet時SortedSet接口的實現(xiàn)類,TreeSet可以保證元素處于排序狀態(tài),它采用紅黑樹的數(shù)據(jù)結(jié)構(gòu)來存儲集合元素。TreeSet支持兩種排序方法:自然排序和定制排序,默認(rèn)采用自然排序。

? 自然排序

TreeSet會調(diào)用集合元素的compareTo(Object obj)方法來比較元素的大小關(guān)系,然后將元素按照升序排列,這就是自然排序。如果試圖將一個對象添加到TreeSet集合中,則該對象必須實現(xiàn)Comparable接口,否則會拋出異常。當(dāng)一個對象調(diào)用方法與另一個對象比較時,例如obj1.compareTo(obj2),如果該方法返回0,則兩個對象相等;如果返回一個正數(shù),則obj1大于obj2;如果返回一個負(fù)數(shù),則obj1小于obj2。

Java常用類中已經(jīng)實現(xiàn)了Comparable接口的類有以下幾個:

? BigDecimal、BigDecimal以及所有數(shù)值型對應(yīng)的包裝類:按照它們對應(yīng)的數(shù)值大小進行比較。

? Charchter:按照字符的unicode值進行比較。

? Boolean:true對應(yīng)的包裝類實例大于false對應(yīng)的包裝類實例。

? String:按照字符串中的字符的unicode值進行比較。

? Date、Time:后面的時間、日期比前面的時間、日期大。

對于TreeSet集合而言,它判斷兩個對象是否相等的標(biāo)準(zhǔn)是:兩個對象通過compareTo(Object obj)方法比較是否返回0,如果返回0則相等。

? 定制排序

想要實現(xiàn)定制排序,需要在創(chuàng)建TreeSet集合對象時,提供一個Comparator對象與該TreeSet集合關(guān)聯(lián),由Comparator對象負(fù)責(zé)集合元素的排序邏輯。

綜上:自然排序?qū)崿F(xiàn)的是Comparable接口,定制排序?qū)崿F(xiàn)的是Comparator接口。(具體代碼實現(xiàn)會在后續(xù)章節(jié)中講解)

4)EnumSet類

EnumSet是一個專為枚舉類設(shè)計的集合類,不允許添加null值。EnumSet的集合元素也是有序的,它以枚舉值在Enum類內(nèi)的定義順序來決定集合元素的順序。

5)各Set實現(xiàn)類的性能分析

HashSet的性能比TreeSet的性能好(特別是添加,查詢元素時),因為TreeSet需要額外的紅黑樹算法維護元素的次序,如果需要一個保持排序的Set時才用TreeSet,否則應(yīng)該使用HashSet。

LinkedHashSet是HashSet的子類,由于需要鏈表維護元素的順序,所以插入和刪除操作比HashSet要慢,但遍歷比HashSet快。

EnumSet是所有Set實現(xiàn)類中性能最好的,但它只能 保存同一個枚舉類的枚舉值作為集合元素。

以上幾個Set實現(xiàn)類都是線程不安全的,如果多線程訪問,必須手動保證集合的同步性,這在后面的章節(jié)中會講到。

3. List集合

List集合代表一個有序、可重復(fù)集合,集合中每個元素都有其對應(yīng)的順序索引。List集合默認(rèn)按照元素的添加順序設(shè)置元素的索引,可以通過索引(類似數(shù)組的下標(biāo))來訪問指定位置的集合元素。

實現(xiàn)List接口的集合主要有:ArrayList、LinkedList、Vector、Stack。

1)ArrayList

ArrayList是一個動態(tài)數(shù)組,也是我們最常用的集合,是List類的典型實現(xiàn)。它允許任何符合規(guī)則的元素插入甚至包括null。每一個ArrayList都有一個初始容量(10),該容量代表了數(shù)組的大小。隨著容器中的元素不斷增加,容器的大小也會隨著增加。在每次向容器中增加元素的同時都會進行容量檢查,當(dāng)快溢出時,就會進行擴容操作。所以如果我們明確所插入元素的多少,最好指定一個初始容量值,避免過多的進行擴容操作而浪費時間、效率。

ArrayList擅長于隨機訪問元,同時ArrayList是非同步的。

2)LinkedList

LinkedList是List接口的另一個實現(xiàn),除了可以根據(jù)索引訪問集合元素外,LinkedList還實現(xiàn)了Deque接口,可以當(dāng)作雙端隊列來使用,也就是說,既可以當(dāng)作“?!笔褂?,又可以當(dāng)作隊列使用。

LinkedList的實現(xiàn)機制與ArrayList的實現(xiàn)機制完全不同,ArrayLiat內(nèi)部以數(shù)組的形式保存集合的元素,所以隨機訪問集合元素有較好的性能;LinkedList內(nèi)部以鏈表的形式保存集合中的元素,所以隨機訪問集合中的元素性能較差,但在插入刪除元素時有較好的性能。

3)Vector

與ArrayList相似,但是Vector是同步的。所以說Vector是線程安全的動態(tài)數(shù)組。它的操作與ArrayList幾乎一樣。

4)Stack

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

5)Iterator接口和ListIterator接口

Iterator是一個接口,它是集合的迭代器。集合可以通過Iterator去遍歷集合中的元素。Iterator提供的API接口如下:

? boolean hasNext():判斷集合里是否存在下一個元素。如果有,hasNext()方法返回 true。
? Object next():返回集合里下一個元素。
? void remove():刪除集合里上一次next方法返回的元素。

ListIterator接口繼承Iterator接口,提供了專門操作List的方法。ListIterator接口在Iterator接口的基礎(chǔ)上增加了以下幾個方法:

? boolean hasPrevious():判斷集合里是否存在上一個元素。如果有,該方法返回 true。
? Object previous():返回集合里上一個元素。
? void add(Object o):在指定位置插入一個元素。

以上兩個接口相比較,不難發(fā)現(xiàn),ListIterator增加了向前迭代的功能(Iterator只能向后迭代),ListIterator還可以通過add()方法向List集合中添加元素(Iterator只能刪除元素)。

4. Map集合

Map接口采用鍵值對Map<K,V>的存儲方式,保存具有映射關(guān)系的數(shù)據(jù),因此,Map集合里保存兩組值,一組值用于保存Map里的key,另外一組值用于保存Map里的value,key和value可以是任意引用類型的數(shù)據(jù)。key值不允許重復(fù),可以為null。如果添加key-value對時Map中已經(jīng)有重復(fù)的key,則新添加的value會覆蓋該key原來對應(yīng)的value。常用實現(xiàn)類有HashMap、LinkedHashMap、TreeMap等。

Map常見方法(來源于API)如下:

詳解Java集合框架,讓你全面掌握!

1)HashMap與Hashtable

HashMap與Hashtable是Map接口的兩個典型實現(xiàn),它們之間的關(guān)系完全類似于ArrayList與Vertor。HashTable是一個古老的Map實現(xiàn)類,它提供的方法比較繁瑣,目前基本不用了,HashMap與Hashtable主要存在以下兩個典型區(qū)別:

? HashMap是線程不安全,HashTable是線程安全的。

? HashMap可以使用null值最為key或value;Hashtable不允許使用null值作為key和value,如果把null放進HashTable中,將會發(fā)生空指針異常。

為了成功的在HashMap和Hashtable中存儲和獲取對象,用作key的對象必須實現(xiàn)hashCode()方法和equals()方法。

HashMap工作原理如下:

HashMap基于hashing原理,通過put()和get()方法存儲和獲取對象。當(dāng)我們將鍵值對傳遞給put()方法時,它調(diào)用建對象的hashCode()方法來計算hashCode值,然后找到bucket位置來儲存值對象。當(dāng)獲取對象時,通過建對象的equals()方法找到正確的鍵值對,然后返回對象。HashMap使用鏈表來解決碰撞問題,當(dāng)發(fā)生碰撞了,對象將會存儲在鏈表的下一個節(jié)點中。

2)LinkedHashMap實現(xiàn)類

LinkedHashMap使用雙向鏈表來維護key-value對的次序(其實只需要考慮key的次序即可),該鏈表負(fù)責(zé)維護Map的迭代順序,與插入順序一致,因此性能比HashMap低,但在迭代訪問Map里的全部元素時有較好的性能。

3)Properties

Properties類時Hashtable類的子類,它相當(dāng)于一個key、value都是String類型的Map,主要用于讀取配置文件。

4)TreeMap實現(xiàn)類

TreeMap是SortedMap的實現(xiàn)類,是一個紅黑樹的數(shù)據(jù)結(jié)構(gòu),每個key-value對作為紅黑樹的一個節(jié)點。TreeMap存儲key-value對時,需要根據(jù)key對節(jié)點進行排序。TreeMap也有兩種排序方式:

? 自然排序:TreeMap的所有key必須實現(xiàn)Comparable接口,而且所有的key應(yīng)該是同一個類的對象,否則會拋出ClassCastException。

? 定制排序:創(chuàng)建TreeMap時,傳入一個Comparator對象,該對象負(fù)責(zé)對TreeMap中的所有key進行排序。

5)各Map實現(xiàn)類的性能分析

? HashMap通常比Hashtable(古老的線程安全的集合)要快

? TreeMap通常比HashMap、Hashtable要慢,因為TreeMap底層采用紅黑樹來管理key-value。

? LinkedHashMap比HashMap慢一點,因為它需要維護鏈表來爆出key-value的插入順序。

創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務(wù)器買多久送多久。

文章標(biāo)題:詳解Java集合框架,讓你全面掌握!-創(chuàng)新互聯(lián)
鏈接分享:http://muchs.cn/article14/egege.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、電子商務(wù)、品牌網(wǎng)站制作服務(wù)器托管、網(wǎng)站收錄品牌網(wǎng)站設(shè)計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

手機網(wǎng)站建設(shè)