java中List、Map、Set、Collection、Stack、Queue等的使用
java中這幾個東西是比較常用的,雖然我用的不多,也正是因為用的不多,所以我一直搞不清楚他們之間的具體用法以及相互之間的關系,現在特單獨作為一個東西來總結一下。
?
本文參考一下資料:
1.《java編程思想》一書第11章
2.http://blog.sina.com.cn/s/blog_a345a8960101k9vx.html
3.http://f51889920.iteye.com/blog/1884810
4.http://blog.csdn.net/speedme/article/details/22398395
5.http://www.tuicool.com/articles/qeEzym
6.http://blog.csdn.net/hguisu/article/details/7644395
在《java編程思想》一書中,這幾個東西放到一章里面講的,是在第11章。分了好多的小節去講的,看了一會,看的頭疼,但是基本上好多東西都可以明白,比較容易梳理。
首先放個圖在前面,展示下他們各個集合類之間的關系,如下:
java集合框架的基本接口/類層次結構
java.util.Collection [I] +--java.util.List [I]+--java.util.ArrayList [C]+--java.util.LinkedList [C]+--java.util.Vector [C]+--java.util.Stack [C] +--java.util.Set [I]+--java.util.HashSet [C]+--java.util.SortedSet [I]+--java.util.TreeSet [C]java.util.Map [I] +--java.util.SortedMap [I]+--java.util.TreeMap [C] +--java.util.Hashtable [C] +--java.util.HashMap [C] +--java.util.LinkedHashMap [C] +--java.util.WeakHashMap [C][I]:接口 [C]:類那么,為什么要有集合類?
面向對象的語言對事物的體現都是以對象的形式,為了方便對多個對象操作,就要對對象進行存儲,集合類就是對多個對象進行存儲的一種方式。
數組和集合類有何不同?
最主要的區別是長度可變不可變問題。數組可以存儲對象,但是長度是固定的,不可變的。集合長度是可變的。其次,數組中可以存儲基本數據類型,集合只能存儲對象。集合的一個比較大的優點是可以存儲不同類型的對象。數組不可以。
下面就開始各種總結。
Collection接口
Collection接口是最基本的集合接口,代表一組Object集合,這些Object被稱作Collection的元素,所有實現Collection接口的類型必須提供兩個標準的構造函數:無參數的構造函數用于創建一個空的Collection,有一個Collection參數的構造函數用于創建一個新的Collection,這個新的Collection與傳入的Collection有相同的元素后一個構造函數允許用戶復制一個Collection。這些都比較容易理解。
1 Collection<Integer> ci = new ArrayList<Integer>(); 2 Collection<Integer> ci2 = new ArrayList<Integer>(Arrays.asList(1,2,3,4,5));并且注意Collection中沒有get()方法,要想查看或者操作Collection中的元素只能遍歷,使用的是iterator()方法,使用該方法可以逐一訪問Collection的每一個元素。
1 Iterator it = collection.iterator();//獲得迭代 2 while(it.hasNext()){ 3 Object obj = it.next();//得到下一個元素 4 }由上圖可知,Collection分為Lst接口和Set接口。
List接口
List接口是有序的Collection,使用該接口能精確控制每個元素的插入位置,可以使用索引來訪問List中的元素,跟數組是很類似的。并且List中允許有重復元素,當然有些List的實現類不允許重復元素的存在。
List中有iterator()方法,還有listIterator方法,返回一個ListIterator接口,這個接口比標準的Iterator接口相比,多了一些add之類的方法,允許添加、刪除、設置元素值以及向前或者向后遍歷等。
如上圖,List下有幾個常用類:LinkedList、ArrayList和Vector以及Stack。
(1)ArrayList類:實現了可變大小的數組。它允許包含所有元素,包括null。每個ArrayList實例都有一個容量,即用于存儲元素的數組的大小,這個容量可以隨著不斷添加新元素而自動增加,但增長算法沒有定義,當插入大量元素時,插入前可以調用ensureCapacity方法來增加ArrayList的容量以提高插入效率。
? (2)LinkedList類:允許null元素,提供額外的get,remove和insert方法,這使得LinkedList可以用作stack、queue或雙向隊列。它可以再List的中間插入和移除,在這方面比ArrayList有效,但是在隨機訪問方面就沒有ArrayList有效了。如果多個線程同時訪問一個List,則必須自己實現訪問同步,一種解決方法是在創建List時構造一個同步的List:
List list = Collection.synchronizedList(new LinkedList(……));(3)Vector類:Vector跟ArrayList非常類似,但是Vector是同步的,由Vector創建的Iterator,雖然和ArrayList創建的 Iterator是同一接口,但是,因為Vector是同步的,當一個Iterator被創建而且正在被使用,另一個線程改變了Vector的狀態(例如,添加或刪除了一些元素),這時調用Iterator的方法時將拋出ConcurrentModificationException,因此必須捕獲該異常。
(4)Stack類:繼承自Vector,實現一個后進先出的棧。提供了幾個基本方法,push、pop、peak、empty、search等。
總結:
- List:元素是有序的,元素可以重復。因為該集合體系有索引。
-
- ArrayList:底層的數據結構使用的是數據結構。
-
- 查詢速度很快。
- 增刪稍慢。
- 線程不同步。
- 默認長度為10增長率為50%。
- LinkedList:底層使用的鏈表數據結構。
-
- 增刪速度很快。
- 查詢稍慢。
- Vector:底層是數組數據結構。1.0出現
-
- 線程同步
- 被ArrayList替代了。
- 長度增長率100%。
Set接口
Set接口是繼承自Collection的,它不能包含有重復元素。Set中最多有一個null元素。
因為Set的這個制約,在使用Set集合的時候,應該注意: 1,為Set集合里的元素的實現類實現一個有效的equals(Object)方法。 2,對Set的構造函數,傳入的Collection參數不能包含重復的元素。 Set下有幾個set類,HashSet、SortedSet、TreeSet,用的較多的是HashSet,其他兩種基本不常用,以后慢慢補充該方面知識,下面說HashSet。 (1)HashSet,底層數據結構式哈希表,由哈希表支持,不保證集合的迭代順序,特別是不保證該順序恒久不變,此類允許使用null元素。HashSet保證元素唯一性的方法是通過元素的兩個方法,hashCode和equals來完成。如果元素的HashCode值相同,才會判斷equals是否為true。如果元素的hashCode值不同,不會調用equals。 (2)TreeSet:底層數據結構式二叉樹。注:添加元素必須實現Comparable接口或在實例TreeSet時指定比較器。可以對Set集合中的元素進行排序。保證元素唯一性的依據:compareTo方法return 0; Map接口 Map集成Collection接口,Map和Collection是兩種不同的集合,Collection是值(value)的集合,Map是鍵值對(key,value)的集合。包含幾種主要類和接口:HashMap、LinkedMap、WeakHashMap、SortedMap、TreeMap、HashTable等幾種。 (1)Hashtable繼承Map接口,實現一個key-value映射的哈希表。任何非空(non-null)的對象都可作為key或者value。添加數據使用put(key, value),取出數據使用get(key),這兩個基本操作的時間開銷為常數。 (2)WeakHashMap類,WeakHashMap是一種改進的HashMap,它對key實行“弱引用”,如果一個key不再被外部所引用,那么該key可以被GC回收。 總結: 如果涉及到堆棧,隊列等操作,應該考慮用List,對于需要快速插入,刪除元素,應該使用LinkedList,如果需要快速隨機訪問元素,應該使用ArrayList。 如果程序在單線程環境中,或者訪問僅僅在一個線程中進行,考慮非同步的類,其效率較高,如果多個線程可能同時操作一個類,應該使用同步的類。 在除需要排序時使用TreeSet,TreeMap外,都應使用HashSet,HashMap,因為他們 的效率更高。 要特別注意對哈希表的操作,作為key的對象要正確復寫equals和hashCode方法。 容器類僅能持有對象引用(指向對象的指針),而不是將對象信息copy一份至數列某位置。一旦將對象置入容器內,便損失了該對象的型別信息。 盡量返回接口而非實際的類型,如返回List而非ArrayList,這樣如果以后需要將ArrayList換成LinkedList時,客戶端代碼不用改變。這就是針對抽象編程。 注意: 1、Collection沒有get()方法來取得某個元素。只能通過iterator()遍歷元素。 2、Set和Collection擁有一模一樣的接口。 3、List,可以通過get()方法來一次取出一個元素。使用數字來選擇一堆對象中的一個,get(0)...。(add/get) 4、一般使用ArrayList。用LinkedList構造堆棧stack、隊列queue。 5、Map用 put(k,v) / get(k),還可以使用containsKey()/containsValue()來檢查其中是否含有某個key/value。 HashMap會利用對象的hashCode來快速找到key。 6、Map中元素,可以將key序列、value序列單獨抽取出來。 使用keySet()抽取key序列,將map中的所有keys生成一個Set。 使用values()抽取value序列,將map中的所有values生成一個Collection。 為什么一個生成Set,一個生成Collection?那是因為,key總是獨一無二的,value允許重復。轉載于:https://www.cnblogs.com/Pillar/p/4226549.html
總結
以上是生活随笔為你收集整理的java中List、Map、Set、Collection、Stack、Queue等的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux最常用的20条命令
- 下一篇: 改变listview中item选中时文字