Java Collection
而且Java用面向?qū)ο蟮脑O(shè)計(jì)對這些數(shù)據(jù)結(jié)構(gòu)和算法進(jìn)行了封裝,這就極大的減化了程序猿編程時的負(fù)擔(dān)。程序猿也能夠以這個集合框架為基礎(chǔ),定義更高級別的數(shù)據(jù)抽象。比方棧、隊(duì)列和線程安全的集合等,從而滿足自己的須要。
Java2的集合框架。抽其核心。主要有三種:List、Set和Map。
例如以下圖所看到的:
須要注意的是,這里的 Collection、List、Set和Map都是接口(Interface)。不是詳細(xì)的類實(shí)現(xiàn)。 List lst = new ArrayList(); 這是我們尋常常常使用的創(chuàng)建一個新的List的語句,在這里, List是接口,ArrayList才是詳細(xì)的類。
經(jīng)常使用集合類的繼承結(jié)構(gòu)例如以下:
Collection<--List<--Vector
Collection<--List<--ArrayList
Collection<--List<--LinkedList
Collection<--Set<--HashSet
Collection<--Set<--HashSet<--LinkedHashSet
Collection<--Set<--SortedSet<--TreeSet
Map<--SortedMap<--TreeMap
Map<--HashMap
-----------------------------------------------SB切割線------------------------------------------
List:
List是有序的Collection,使用此接口可以精確的控制每一個元素插入的位置。用戶可以使用索引(元素在List中的位置。類似于數(shù)組下 >標(biāo))來訪問List中的元素,這類似于Java的數(shù)組。
Vector:
基于數(shù)組(Array)的List,事實(shí)上就是封裝了數(shù)組所不具備的一些功能方便我們使用,所以它難易避免數(shù)組的限制,同一時候性能也不可能超越數(shù)組。所以。在可能的情況下,我們要多運(yùn)用數(shù)組。另外非常重要的一點(diǎn)就是Vector是線程同步的(sychronized)的,這也是Vector和ArrayList 的一個的重要差別。
ArrayList:
同Vector一樣是一個基于數(shù)組上的鏈表,可是不同的是ArrayList不是同步的。所以在性能上要比Vector好一些,可是當(dāng)執(zhí)行到多線程環(huán)境中時,可須要自己在管理線程的同步問題。
LinkedList:
LinkedList不同于前面兩種List,它不是基于數(shù)組的,所以不受數(shù)組性能的限制。
它每個節(jié)點(diǎn)(Node)都包括雙方面的內(nèi)容:
1.節(jié)點(diǎn)本身的數(shù)據(jù)(data);
2.下一個節(jié)點(diǎn)的信息(nextNode)。
所以當(dāng)對LinkedList做加入,刪除動作的時候就不用像基于數(shù)組的ArrayList一樣,必須進(jìn)行大量的數(shù)據(jù)移動。僅僅要更改nextNode的相關(guān)信息就能夠?qū)崿F(xiàn)了。這是LinkedList的優(yōu)勢。
List總結(jié):
- 全部的List中僅僅能容納單個不同類型的對象組成的表,而不是Key-Value鍵值對。
比如:[ tom,1,c ]
- 全部的List中能夠有同樣的元素,比如Vector中能夠有 [ tom,koo,too,koo ]
- 全部的List中能夠有null元素,比如[ tom,null,1 ]
- 基于Array的List(Vector。ArrayList)適合查詢,而LinkedList 適合加入,刪除操作
--------------------------------------NB切割線------------------------------------
Set:
Set是一種不包括反復(fù)的元素的無序Collection。
HashSet:
盡管Set同List都實(shí)現(xiàn)了Collection接口。可是他們的實(shí)現(xiàn)方式卻大不一樣。List基本上都是以Array為基礎(chǔ)。
可是Set則是在 HashMap的基礎(chǔ)上來實(shí)現(xiàn)的。這個就是Set和List的根本差別。HashSet的存儲方式是把HashMap中的Key作為Set的相應(yīng)存儲項(xiàng)。
看看 HashSet的add(Object obj)方法的實(shí)現(xiàn)就能夠一目了然了。
這個也是為什么在Set中不能像在List中一樣有反復(fù)的項(xiàng)的根本原因。由于HashMap的key是不能有反復(fù)的。
LinkedHashSet:
HashSet的一個子類,一個鏈表。
TreeSet:
SortedSet的子類,它不同于HashSet的根本就是TreeSet是有序的。它是通過SortedMap來實(shí)現(xiàn)的。
Set總結(jié):
- Set實(shí)現(xiàn)的基礎(chǔ)是Map(HashMap)
- Set中的元素是不能反復(fù)的。假設(shè)使用add(Object obj)方法加入已經(jīng)存在的對象,則會覆蓋前面的對象
--------------------------------------2B切割線------------------------------------
Map:
Map 是一種把鍵對象和值對象進(jìn)行關(guān)聯(lián)的容器,而一個值對象又能夠是一個Map,依次類推。這樣就可形成一個多級映射。對于鍵對象來說,像Set一樣,一個 Map容器中的鍵對象不同意反復(fù),這是為了保持查找結(jié)果的一致性;假設(shè)有兩個鍵對象一樣,那你想得到那個鍵對象所相應(yīng)的值對象時就有問題了,可能你得到的并非你想的那個值對象,結(jié)果會造成混亂,所以鍵的唯一性非常重要,也是符合集合的性質(zhì)的。當(dāng)然在使用過程中,某個鍵所相應(yīng)的值對象可能會發(fā)生變化,這時會依照最后一次改動的值對象與鍵相應(yīng)。對于值對象則沒有唯一性的要求,你能夠?qū)㈦S意多個鍵都映射到一個值對象上,這不會發(fā)生不論什么問題(只是對你的使用卻可能會造成不便,你不知道你得到的究竟是那一個鍵所相應(yīng)的值對象)。
Map有兩種比較經(jīng)常使用的實(shí)現(xiàn):HashMap和TreeMap。
HashMap也用到了哈希碼的算法,以便高速查找一個鍵,
TreeMap則是對鍵按序存放,因此它便有一些擴(kuò)展的方法,比方firstKey(),lastKey()等,你還能夠從TreeMap中指定一個范圍以取得其子Map。
鍵和值的關(guān)聯(lián)非常easy。用put(Object key,Object value)方法就可以將一個鍵與一個值對象相關(guān)聯(lián)。用get(Object key)可得到與此key對象所相應(yīng)的值對象。
--------------------------------------JB切割線------------------------------------
其他:
一、幾個經(jīng)常使用類的差別
1.ArrayList: 元素單個。效率高,多用于查詢
2.Vector: 元素單個,線程安全,多用于查詢
3.LinkedList:元素單個。多用于插入和刪除
4.HashMap: 元素成對,元素可為空
5.HashTable: 元素成對。線程安全。元素不可為空
二、Vector、ArrayList和LinkedList
大多數(shù)情況下,從性能上來說ArrayList最好。可是當(dāng)集合內(nèi)的元素須要頻繁插入、刪除時LinkedList會有比較好的表現(xiàn)。可是它們?nèi)齻€性能都比不上數(shù)組,另外Vector是線程同步的。所以:
假設(shè)能用數(shù)組的時候(元素類型固定。數(shù)組長度固定),請盡量使用數(shù)組來取代List;
假設(shè)沒有頻繁的刪除插入操作。又不用考慮多線程問題,優(yōu)先選擇ArrayList。
假設(shè)在多線程條件下使用,能夠考慮Vector。
假設(shè)須要頻繁地刪除插入。LinkedList就有了用武之地;
假設(shè)你什么都不知道,用ArrayList沒錯。
三、Collections和Arrays
在 Java集合類框架里有兩個類叫做Collections(注意。不是Collection。)和Arrays,這是JCF里面功能強(qiáng)大的工具。但剛開始學(xué)習(xí)的人往往會忽視。
按JCF文檔的說法,這兩個類提供了封裝器實(shí)現(xiàn)(Wrapper Implementations)、數(shù)據(jù)結(jié)構(gòu)算法和數(shù)組相關(guān)的應(yīng)用。
想必大家不會忘記上面談到的“折半查找”、“排序”等經(jīng)典算法吧。Collections類提供了豐富的靜態(tài)方法幫助我們輕松完畢這些在數(shù)據(jù)結(jié)構(gòu)課上煩人的工作:
binarySearch:折半查找。
sort:排序,這里是一種類似于高速排序的方法,效率仍然是O(n * log n)。但卻是一種穩(wěn)定的排序方法。
reverse:將線性表進(jìn)行逆序操作,這個但是從前數(shù)據(jù)結(jié)構(gòu)的經(jīng)典考題哦!
rotate:以某個元素為軸心將線性表“旋轉(zhuǎn)”。
swap:交換一個線性表中兩個元素的位置。
……
Collections另一個重要功能就是“封裝器”(Wrapper),它提供了一些方法能夠把一個集合轉(zhuǎn)換成一個特殊的集合,例如以下:
unmodifiableXXX:轉(zhuǎn)換成僅僅讀集合,這里XXX代表六種基本集合接口:Collection、List、Map、Set、SortedMap和SortedSet。假設(shè)你對僅僅讀集合進(jìn)行插入刪除操作。將會拋出UnsupportedOperationException異常。
synchronizedXXX:轉(zhuǎn)換成同步集合。
singleton:創(chuàng)建一個僅有一個元素的集合,這里singleton生成的是單元素Set,
singletonList和singletonMap分別生成單元素的List和Map。
空集:由Collections的靜態(tài)屬性EMPTY_SET、EMPTY_LIST和EMPTY_MAP表示。
這次關(guān)于Java集合類概述就到這里,下一次我們來解說Java集合類的詳細(xì)應(yīng)用。如List排序、刪除反復(fù)元素。
原文出自:http://skyuck.iteye.com/blog/526358
轉(zhuǎn)載于:https://www.cnblogs.com/zfyouxi/p/5135258.html
總結(jié)
以上是生活随笔為你收集整理的Java Collection的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转】Android应用开发allowB
- 下一篇: Atitit. atiJavaExCon