為什么要使用集合類(lèi)
當(dāng)你事先不知道要存放數(shù)據(jù)的個(gè)數(shù),或者你需要一種比數(shù)組下標(biāo)存取機(jī)制更靈活的方法時(shí),你就需要用到集合類(lèi)。
理解集合類(lèi)
集合類(lèi)存放于java.util包中。
集合類(lèi)存放的都是對(duì)象的引用,而非對(duì)象本身,出于表達(dá)上的便利,我們稱集合中的對(duì)象就是指集合中對(duì)象的引用(reference)。
集合類(lèi)型主要有3種:set(集)、list(列表)和map(映射)。
其中List和Set接口都繼承自Collection接口,而Map接口和他倆不同,不是繼承于Collection接口。
(1)集 Set
集(set)是最簡(jiǎn)單的一種集合,它的對(duì)象不按特定方式排序,只是簡(jiǎn)單的把對(duì)象加入集合中,就像往口袋里放東西。
對(duì)集中成員的訪問(wèn)和操作是通過(guò)集中對(duì)象的引用進(jìn)行的,所以集中不能有重復(fù)對(duì)象。
集也有多種變體,可以實(shí)現(xiàn)排序等功能,如TreeSet,它把對(duì)象添加到集中的操作將變?yōu)榘凑漳撤N比較規(guī)則將其插入到有序的對(duì)象序列中。它實(shí)現(xiàn)的是SortedSet接口,也就是加入了對(duì)象比較的方法。通過(guò)對(duì)集中的對(duì)象迭代,我們可以得到一個(gè)升序的對(duì)象集合。
1:HashSet 能夠快速定位一個(gè)元素,但是它要求存入HasgSet的對(duì)象必須實(shí)現(xiàn)HashCode方法
2:TreeSet 將放入其中的元素按序存放
(2)列表 List
List接口與其實(shí)現(xiàn)類(lèi)是容量可變的列表,可以按照索引訪問(wèn)集合中的元素,是有序的集合
列表在數(shù)據(jù)結(jié)構(gòu)中分別表現(xiàn)為:數(shù)組和向量、鏈表、堆棧、隊(duì)列。
1:ArrayList: 實(shí)現(xiàn)一個(gè)數(shù)組,它的規(guī)??勺儾⑶夷芟矜湵硪粯颖辉L問(wèn)。它提供的功能類(lèi)似Vector類(lèi)但不同步,它是以Array方式實(shí)現(xiàn)的List,允許快速隨機(jī)存取。
2:LinkedList: 實(shí)現(xiàn)一個(gè)鏈表,提供最佳順序存取,適合插入和移除元素。由這個(gè)類(lèi)定義的鏈表也可以像?;蜿?duì)列一樣被使用。
(3)映射 Map
映射與集或列表有明顯區(qū)別,映射中每個(gè)項(xiàng)都是成對(duì)的,Map是把鍵對(duì)象和值對(duì)象進(jìn)行關(guān)聯(lián)的容器。映射中存儲(chǔ)的每個(gè)對(duì)象都有一個(gè)相關(guān)的關(guān)鍵字(Key)對(duì)象,關(guān)鍵字決定了對(duì)象在映射中的存儲(chǔ)位置,檢索對(duì)象時(shí)必須提供相應(yīng)的關(guān)鍵字,就像在字典中查單詞一樣。關(guān)鍵字應(yīng)該是唯一的,也就是說(shuō)Map中的鍵對(duì)象不允許重復(fù),這是為了保證查詢結(jié)果的一致性。
關(guān)鍵字本身并不能決定對(duì)象的存儲(chǔ)位置,它需要對(duì)過(guò)一種散列(hashing)技術(shù)來(lái)處理,產(chǎn)生一個(gè)被稱作散列碼(hash code)的整數(shù)值,散列碼通常用作一個(gè)偏置量,該偏置量是相對(duì)于分配給映射的內(nèi)存區(qū)域起始位置的,由此確定關(guān)鍵字/對(duì)象對(duì)的存儲(chǔ)位置。理想情況下,散列處理應(yīng)該產(chǎn)生給定范圍內(nèi)均勻分布的值,而且每個(gè)關(guān)鍵字應(yīng)得到不同的散列碼。
1:HashMap: 實(shí)現(xiàn)一個(gè)鍵到值映射的哈希表,通過(guò)鍵取得值對(duì)象,允許存儲(chǔ)空對(duì)象,而且允許鍵是空(由于鍵必須是唯一的,當(dāng)然只能有一個(gè))。
2:HashTable: 實(shí)現(xiàn)一個(gè)映象,所有的鍵必須非空。為了能高效的工作,定義鍵的類(lèi)必須實(shí)現(xiàn)hashcode()方法和equal()方法。這個(gè)類(lèi)是前面java實(shí)現(xiàn)的一個(gè)繼承,并且通常能在實(shí)現(xiàn)映象的其他類(lèi)中更好的使用。Dictionary的子類(lèi),確省是線程同步的。不允許關(guān)鍵字或值為null,當(dāng)元素的順序很重要時(shí)選用TreeMap,當(dāng)元素不必以特定的順序進(jìn)行存儲(chǔ)時(shí),使用HashMap.
Hashtable的使用不被推薦,因?yàn)镠ashMap提供了所有類(lèi)似的功能,并且速度更快。當(dāng)你需要在多線程環(huán)境下使用時(shí),HashMap也可以轉(zhuǎn)換為同步的。
考試大提示:在編寫(xiě)程序的過(guò)程中,使用到集合類(lèi),要根據(jù)不同的需求,來(lái)決定使用哪種集合類(lèi),比如,要經(jīng)常遍歷集合內(nèi)元素,就要使用List,如果要保證集合中不存在重復(fù)的數(shù)據(jù),就要用Set;如果要通過(guò)某一鍵來(lái)查找某一值,就要使用Map。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。