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