Collection:List、Set
Map:HashMap、HashTable
如何在它們之間選擇
一、Array , Arrays
Java所有“存儲(chǔ)及隨機(jī)訪問(wèn)一連串對(duì)象”的做法,array是最有效率的一種。
1、
效率高,但容量固定且無(wú)法動(dòng)態(tài)改變。
array還有一個(gè)缺點(diǎn)是,無(wú)法判斷其中實(shí)際存有多少元素,length只是告訴我們array的容量。
2、Java中有一個(gè)Arrays類,專門(mén)用來(lái)操作array。
arrays中擁有一組static函數(shù),
equals():比較兩個(gè)array是否相等。array擁有相同元素個(gè)數(shù),且所有對(duì)應(yīng)元素兩兩相等。
fill():將值填入array中。
sort():用來(lái)對(duì)array進(jìn)行排序。
binarySearch():在排好序的array中尋找元素。
System.arraycopy():array的復(fù)制。
二、Collection , Map
若撰寫(xiě)程序時(shí)不知道究竟需要多少對(duì)象,需要在空間不足時(shí)自動(dòng)擴(kuò)增容量,則需要使用容器類庫(kù),array不適用。
1、Collection 和 Map 的區(qū)別
容器內(nèi)每個(gè)為之所存儲(chǔ)的元素個(gè)數(shù)不同。
Collection類型者,每個(gè)位置只有一個(gè)元素。
Map類型者,持有 key-value pair,像個(gè)小型數(shù)據(jù)庫(kù)。
2、各自旗下的子類關(guān)系
Collection
--List:將以特定次序存儲(chǔ)元素。所以取出來(lái)的順序可能和放入順序不同。
--ArrayList / LinkedList / Vector
--Set : 不能含有重復(fù)的元素
--HashSet / TreeSet
Map
--HashMap
--HashTable
--TreeMap
3、其他特征
* List,Set,Map將持有對(duì)象一律視為Object型別。
* Collection、List、Set、Map都是接口,不能實(shí)例化。
繼承自它們的 ArrayList, Vector, HashTable, HashMap是具象class,這些才可被實(shí)例化。
* vector容器確切知道它所持有的對(duì)象隸屬什么型別。vector不進(jìn)行邊界檢查。
三、Collections
Collections是針對(duì)集合類的一個(gè)幫助類。提供了一系列靜態(tài)方法實(shí)現(xiàn)對(duì)各種集合的搜索、排序、線程完全化等操作。
相當(dāng)于對(duì)Array進(jìn)行類似操作的類——Arrays。
如,Collections.max(Collection coll); 取coll中最大的元素。
Collections.sort(List list); 對(duì)list中元素排序
四、如何選擇?
1、容器類和Array的區(qū)別、擇取
* 容器類僅能持有對(duì)象引用(指向?qū)ο蟮闹羔槪皇菍?duì)象信息copy一份至數(shù)列某位置。
* 一旦將對(duì)象置入容器內(nèi),便損失了該對(duì)象的型別信息。
2、
* 在各種Lists中,最好的做法是以ArrayList作為缺省選擇。當(dāng)插入、刪除頻繁時(shí),使用LinkedList();
Vector總是比ArrayList慢,所以要盡量避免使用。
* 在各種Sets中,HashSet通常優(yōu)于HashTree(插入、查找)。只有當(dāng)需要產(chǎn)生一個(gè)經(jīng)過(guò)排序的序列,才用TreeSet。
HashTree存在的唯一理由:能夠維護(hù)其內(nèi)元素的排序狀態(tài)。
* 在各種Maps中
HashMap用于快速查找。
* 當(dāng)元素個(gè)數(shù)固定,用Array,因?yàn)锳rray效率是最高的。
結(jié)論:最常用的是ArrayList,HashSet,HashMap,Array。
注意:
1、Collection沒(méi)有g(shù)et()方法來(lái)取得某個(gè)元素。只能通過(guò)iterator()遍歷元素。
2、Set和Collection擁有一模一樣的接口。
3、List,可以通過(guò)get()方法來(lái)一次取出一個(gè)元素。使用數(shù)字來(lái)選擇一堆對(duì)象中的一個(gè),get(0)...。(add/get)
4、一般使用ArrayList。用LinkedList構(gòu)造堆棧stack、隊(duì)列queue。
5、Map用 put(k,v) / get(k),還可以使用containsKey()/containsValue()來(lái)檢查其中是否含有某個(gè)key/value。
HashMap會(huì)利用對(duì)象的hashCode來(lái)快速找到key。
* hashing
哈希碼就是將對(duì)象的信息經(jīng)過(guò)一些轉(zhuǎn)變形成一個(gè)獨(dú)一無(wú)二的int值,這個(gè)值存儲(chǔ)在一個(gè)array中。
我們都知道所有存儲(chǔ)結(jié)構(gòu)中,array查找速度是最快的。所以,可以加速查找。
發(fā)生碰撞時(shí),讓array指向多個(gè)values。即,數(shù)組每個(gè)位置上又生成一個(gè)梿表。
6、Map中元素,可以將key序列、value序列單獨(dú)抽取出來(lái)。
使用keySet()抽取key序列,將map中的所有keys生成一個(gè)Set。
使用values()抽取value序列,將map中的所有values生成一個(gè)Collection。
為什么一個(gè)生成Set,一個(gè)生成Collection?那是因?yàn)椋琸ey總是獨(dú)一無(wú)二的,value允許重復(fù)。