Java集合框架List,Map,Set等全面介紹_第1頁
Java集合框架List,Map,Set等全面介紹_第2頁
Java集合框架List,Map,Set等全面介紹_第3頁
Java集合框架List,Map,Set等全面介紹_第4頁
Java集合框架List,Map,Set等全面介紹_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、Java集合框架List,Map,Set等全面介紹Java Collections Framework是Java提供的對集合進行定義,操作,和管理的包含一組接口,類的體系結構。 Java集合框架的基本接口/類層次結構:I:接口C:類Collection接口Collection是最基本的集合接口,一個Collection代表一組Object的集合,這些Object被稱作Collection 的元素。所有實現(xiàn)Collection接口的類都必須提供兩個標準的構造函數(shù):無參數(shù)的構造函數(shù)用于創(chuàng)建一個空的 Collection,有一個 Collection參數(shù)的構造函數(shù)用于創(chuàng)建一個新的Collection

2、,這 個新的Collection與傳入 的Collection有相同的元素。后一個構造函數(shù)允許用戶復制一個Collection。如何遍歷Collection中的每一個元素?不論Collection的實際類型如何,它都支持一個iterator(的方法, 該方法返回一個迭代子,使用該迭代子即可逐一訪問Collection中每一個元素。典型的用法如下:Iterator it = collection.iterator(; / 獲得一個迭代子 while(it.hasNext( Object obj = it.next(; / 得到下一個元素 根據(jù)用途的不同,Collection又劃分為List與Se

3、t。List接口List繼承自Collection接口。List是有序的Collection,使用此接口能夠精確的控制每個元素插入的位 置。用戶能夠使用索引(元素在List中的位置,類似于數(shù)組下標來訪問List中的元素,這類似于Java的數(shù)組。 跟Set集合不同的是,List允許有重復元素。對于滿足e1.equals(e2條件的e1與e2對象元素,可以同時存 在于List集合中。當然,也有List的實現(xiàn)類不允許重復元素的存在。除了具有Collection接口必備的iterator (方法外,List還提供一個listIterator(方法,返回一個 ListIterator接口,和標準的Ite

4、rator接口相比, ListIterator多了一些add(之類的方法,允許添加,刪除,設定元素, 還能向前或向后遍歷。實現(xiàn)List接口的常用類有LinkedList,ArrayList,Vector和Stack。LinkedList類LinkedList實現(xiàn)了List接口,允許null元素。此外LinkedList提供額外的get,remove,insert方法在 LinkedList的首部或尾部。這些操作使LinkedList可被用作堆棧(stack,隊列(queue或雙向隊列(deque。 注意LinkedList沒有同步方法。如果多個線程同時訪問一個List,則必須自己實現(xiàn)訪問同步。

5、一種解決方 法是在創(chuàng)建List時構造一個同步的List:List list = Collections.synchronizedList(new LinkedList(.;ArrayList類ArrayList實現(xiàn)了可變大小的數(shù)組。它允許所有元素,包括null。ArrayList沒有同步。size,isEmpty,get,set方法運行時間為常數(shù)。但是add方法開銷為分攤的常數(shù),添加n個元素需要O(n的 時間。其他的方法運行時間為線性。每個ArrayList實例都有一個容量(Capacity,即用于存儲元素的數(shù)組的大小。這個容量可隨著不斷添加新 元素而自動增加,但是增長算法并 沒有定義。當需要

6、插入大量元素時,在插入前可以調(diào)用ensureCapacity方法 來增加ArrayList的容量以提高插入效率。和LinkedList一樣,ArrayList也是非同步的(unsynchronized。Vector類Vector非常類似ArrayList,但是Vector是同步的。由Vector創(chuàng)建的Iterator,雖然和ArrayList創(chuàng)建的 Iterator是同一接口,但是,因為Vector是同步的,當一個Iterator被創(chuàng)建而且正在被使用,另一個線程改變 了Vector的狀態(tài)(例如,添加或刪除了一些元素,這時調(diào)用Iterator的方法時將拋出 ConcurrentModificat

7、ionException,因此必須捕獲該異常。Stack 類Stack繼承自Vector,實現(xiàn)一個后進先出的堆棧。Stack提供5個額外的方法使得Vector得以被當作堆棧使 用?;镜膒ush和pop方 法,還有peek方法得到棧頂?shù)脑?empty方法測試堆棧是否為空,search方法檢測一 個元素在堆棧中的位置。Stack剛創(chuàng)建后是空棧。Set接口Set繼承自Collection接口。Set是一種不能包含有重復元素的集合,即對于滿足e1.equals(e2條件的e1與 e2對象元素,不能同時存在于同一個Set集合里,換句話說,Set集合里任意兩個元素e1和e2都滿足e1.equals (

8、e2=false條件,Set最多有一個 null元素。因為Set的這個制約,在使用Set集合的時候,應該注意:1,為Set集合里的元素的實現(xiàn)類實現(xiàn)一個有效的equals(Object方法。2,對Set的構造函數(shù),傳入的Collection參數(shù)不能包含重復的元素。請注意:必須小心操作可變對象(Mutable Object。如果一個Set中的可變元素改變了自身狀態(tài)導致 Object.equals(Object=true將導致一些問題。Map接口Map沒有繼承Collection接口。也就是說Map和Collection是2種不同的集合。Collection可以看作是(value的集合,而Map可以

9、看作是(key,value的集合。Map接口由Map的內(nèi)容提供3種類型的集合視圖,一組key集合,一組value集合,或者一組key-value映射關 系的集合。Hashtable類Hashtable繼承Map接口,實現(xiàn)一個key-value映射的哈希表。任何非空(non-null的對象都可作為key或者 value。添加數(shù)據(jù)使用put(key, value,取出數(shù)據(jù)使用get(key,這兩個基本操作的時間開銷為常數(shù)。Hashtable 通過initial capacity和load factor兩個參數(shù)調(diào)整性能。通常缺省的load factor 0.75較好地 實現(xiàn)了時間和空間的均衡。增大l

10、oad factor可以節(jié)省空間但相應的查找時間將增大,這會影響像get和put這樣 的操作。使用Hashtable的簡單示例如下,將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;要取出一個數(shù),比如2,用相應的k

11、ey:由于作為key的對象將通過計算其散列函數(shù)來確定與之對應的value的位置,因此任何作為key的對象都必須 實現(xiàn)hashCode和equals方 法。hashCode和equals方法繼承自根類Object,如果你用自定義的類當作key的話, 要相當小心,按照散列函數(shù)的定義,如果兩個對象相 同,即obj1.equals(obj2=true,則它們的hashCode必須 相同,但如果兩個對象不同,則它們的hashCode不一定不同,如 果兩個不同對象的hashCode相同,這種現(xiàn)象稱 為沖突,沖突會導致操作哈希表的時間開銷增大,所以盡量定義好的hashCode(方法,能加快哈希 表的操作。

12、如果相同的對象有不同的hashCode,對哈希表的操作會出現(xiàn)意想不到的結果(期待的get方法返回null,要避免 這種問題,只需要牢記一條:要同時復寫equals方法和hashCode方法,而不要只寫其中一個。Hashtable是同步的。HashMap類HashMap和Hashtable類似,不同之處在于HashMap是非同步的,并且允許null,即null value和null key。,但是將HashMap視為Collection時(values(方法可返回Collection,其迭代子操作時間開銷和HashMap 的容量成比例。因此,如果迭代操作的性能相當重要的話,不要將HashMap的

13、初始化容量設得過高,或者load factor過低。WeakHashMap類WeakHashMap是一種改進的HashMap,它對key實行“弱引用”,如果一個key不再被外部所引用,那么該key 可以被GC回收。對集合操作的工具類總結如果涉及到堆棧,隊列等操作,應該考慮用List,對于需要快速插入,刪除元素,應該使用LinkedList, 如果需要快速隨機訪問元素,應該使用ArrayList。如果程序在單線程環(huán)境中,或者訪問僅僅在一個線程中進行,考慮非同步的類,其效率較高,如果多個線 程可能同時操作一個類,應該使用同步的類。在除需要排序時使用TreeSet,TreeMap外,都應使用Hash

14、Set,HashMap,因為他們 的效率更高。要特別注意對哈希表的操作,作為key的對象要正確復寫equals和hashCode方法。容器類僅能持有對象引用(指向?qū)ο蟮闹羔?而不是將對象信息copy一份至數(shù)列某位置。一旦將對象置入 容器內(nèi),便損失了該對象的型別信息。盡量返回接口而非實際的類型,如返回List而非ArrayList,這樣如果以后需要將ArrayList換成LinkedList時,客戶端代碼不用改變。這就是針對抽象編程。注意:1、Collection沒有get(方法來取得某個元素。只能通過iterator(遍歷元素。2、Set和Collection擁有一模一樣的接口。3、List,可以通過get(方法來一次取出一個元素。使用數(shù)字來選擇一堆對象中的一個,get(0.。 (add/get4、一般使用ArrayList。用LinkedList構造堆棧stack、隊列queue。5、Map用 put(k,v / get(k,還可以使用containsKey(/contain

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論