Java 集合類 (Collection)
為什麽要使用集合類?
當你事先不知道要存放數據的個數,或者你需要一種比數組下標存取機制更靈活的方法時,你就需要用到集合類。
集合類存放於java.util包中
java.util中共有13個類可用於管理集合對象,它們支持集、列表或映射等集合
集合類存放的都是對象的引用,而非對象本身,出於表達上的便利,我們稱集合中的對象就是指集合中對象的引用(reference)
集合類型主要有3種:set(集)、list(列表)和map(映射)
總的說來,Java API中所用的集合類,都是實現了Collection 接口,他的一個類繼承結構如下:
Collection<--List<--Vector
Collection<--List<--ArrayList
Collection<--List<--LinkedList
Collection<--Set<--HashSet
Collection<--Set<--HashSet<--LinkedHashSet
Collection<--Set<--SortedSet<—TreeSet
1. List 列表
列表的主要特征是其對象以線性方式存儲,沒有特定順序,只有一個開頭和一個結尾,當然,它與根本沒有順序的集是不同的。
列表在數據結構中分別表現為:數組和向量、鏈表、堆棧、隊列。
Vector : 基於Array的List,其實就是封裝了Array所不具備的一些功能方便我們使用,它不可能走出Array的限制。
性能也就不可能超越Array。所以,在可能的情況下,我們要多運用Array。
另外很重要的一點就是Vector“synchronized”的,這個也是Vector和ArrayList的唯一的區別。
ArrayList
所以在性能上要比Vector優越一些,但是當運行到多線程環境中時,可需要自己在管理線程的同步問題。
LinkedList:LinkedList不同於前面兩種List,它不是基於Array的,所以不受Array性能的限制。
它每一個節點(Node)都包含兩方面的內容:
1.節點本身的數據(data);
2.下一個節點的信息(nextNode)。
所以當對LinkedList做添加,刪除動作的時候就不用像基於 Array 的 List一樣,必須進行大量的數據移動。
只要更改nextNode的相關信息就可以實現了。這就是LinkedList的優勢
List總結:
1. 所有的List中只能容納單個不同類型的對象組成的表,而不是Key-Value鍵值對。例如:[ tom,1,c ];
2. 所有的List中可以有相同的元素,例如Vector中可以有 [ tom,koo,too,koo ];
3. 所有的List中可以有null元素,例如[ tom,null,1 ];
4. 基於Array的List(Vector,ArrayList)適合查詢,而LinkedList(鏈表)適合添加,刪除操作。
2.Set 集
set 是最簡單的一種集合,它的對象不按特定方式排序,只是簡單的把對象加入集合中,就像往口袋裏放東西。
對集中成員的訪問和操作是通過集中對象的引用進行的,所以集中不能有重復對象。
集也有多種變體,可以實現排序等功能,如TreeSet,它把對象添加到集中的操作將變為按照某種比較規則將其插入到有序的對象序列中。
它實現的是SortedSet接口,也就是加入了對象比較的方法。通過對集中的對象叠代,我們可以得到一個升序的對象集合。
HashSet:雖然Set同List都實現了Collection接口,但是他們的實現方式卻大不一樣。
List基本上都是以Array為基礎。但是Set則是 在HashMap的基礎上來實現的,這個就是Set和List的根本區別。
HashSet的存儲方式是把HashMap中的Key作為Set的對應存儲項。看看 HashSet的add(Object obj)方法的實現就可以一目了然了。
public boolean add(Object obj)
{
return map.put(obj, PRESENT) == null;
}
這個也是為什麽在Set中不能像在List中一樣有重復的項的根本原因,因為HashMap的key是不能有重復的。
LinkedHashSet:HashSet的一個子類,一個鏈表。
TreeSet:SortedSet的子類,它不同於HashSet的根本就是TreeSet是有序的。它是通過SortedMap來實現的。(HashSet和TreeSet均為有序的順序由小到大)
Set總結:
1. Set實現的基礎是Map(HashMap);
2. Set中的元素是不能重復的,如果使用add(Object obj)方法添加已經存在的對象,則會覆蓋前面的對象
3.map 映射
映射與集或列表有明顯區別,映射中每個項都是成對的。
映射中存儲的每個對象都有一個相關的關鍵字(Key)對象,關鍵字決定了 對象在映射中的存儲位置,檢索對象時必須提供相應的關鍵字,就像在字典中查單詞一樣。關鍵字應該是唯一的。
關鍵字本身並不能決定對象的存儲位置,它需要對過一種散列(hashing)技術來處理,產生一個被稱作散列碼(hash code)的整數值,
散列碼通常用作一個偏置量,該偏置量是相對於分配給映射的內存區域起始位置的,由此確定關鍵字/對象對的存儲位置。
理想情況 下,散列處理應該產生給定範圍內均勻分布的值,而且每個關鍵字應得到不同的散列碼。
Java 集合類 (Collection)