第13講 JAVA集合類_第1頁(yè)
第13講 JAVA集合類_第2頁(yè)
第13講 JAVA集合類_第3頁(yè)
第13講 JAVA集合類_第4頁(yè)
第13講 JAVA集合類_第5頁(yè)
已閱讀5頁(yè),還剩44頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Java集合類(下),2020/8/1,Java集合類(下),2,collections framework概述,所有抽象出來(lái)的數(shù)據(jù)結(jié)構(gòu)和操作統(tǒng)稱為collections framework框架。Java程序員不必考慮數(shù)據(jù)結(jié)構(gòu)的算法細(xì)節(jié),只需要定義具體應(yīng)用的數(shù)據(jù)結(jié)構(gòu)實(shí)體。數(shù)據(jù)結(jié)構(gòu)上的方法也用不著程序員去寫,用系統(tǒng)的方法就行了,系統(tǒng)的方法總比一般程序員編的要快 所有這些framework都在java.util包中,2020/8/1,Java集合類(下),3,collections framework概述,在Java 2的Collections框架中,主要包括兩個(gè)接口及其擴(kuò)展和實(shí)現(xiàn)類:Collec

2、tion接口和Map接口 Collection是集合接口 Collections是集合類 Collection接口: Set不允許重復(fù) List可以有重復(fù)元素,2020/8/1,Java集合類(下),4,Java類庫(kù)中具體的集合(部分),2020/8/1,Java集合類(下),5,Collection接口,Collection API提供“集合”的功能 Collection API包含下述接口 Collection: 將一組對(duì)象以集合元素的形式組織到一起,在其子接口中分別實(shí)現(xiàn)不同的組織方式 Set: Collection的子接口,不記錄元素的保存順序,且不允許有重復(fù)元素 List: Colle

3、ction的子接口,記錄元素的保存順序,且允許有重復(fù)元素,2020/8/1,Java集合類(下),6,Collection接口,定義了集合的基本行為,一個(gè)Collection的實(shí)現(xiàn)類的實(shí)例能夠: 存放一個(gè)元素 增加/刪除一個(gè)元素 查找一個(gè)元素是否在此集合中 計(jì)算此集合的元素?cái)?shù)目 Collection沒(méi)有約束元素的具體類型(是否為空也未規(guī)定),元素的順序,元素是否可重復(fù) 部分Collection是整齊的(ordered)(注意,整齊的并不是一定是一定要經(jīng)過(guò)排序的,即不一定是sorted).這樣的Collection的元素之間在邏輯上是一個(gè)接一個(gè)(one by one),即可以得到一個(gè)元素的下一個(gè)

4、元素的引用.這些元素可以是排序的(sorted,元素的次序由自然順序或者規(guī)定的順序排列)也可以是未排序的(unsorted,元素順序由插入的順序決定) java.util.List接口繼承Collection接口定義這一類Collection 部分Collection要求無(wú)重復(fù)的元素,稱之為Set,java.util.Set接口繼承Collection來(lái)定義這一類Collection,2020/8/1,Java集合類(下),7,Collection 層次結(jié)構(gòu),2020/8/1,Java集合類(下),8,Collection,ArrayList非常象Vector ,它實(shí)現(xiàn)了可變長(zhǎng)的數(shù)組。而Lin

5、kedList 則有些不同,它是List的鏈表實(shí)現(xiàn)。 LinkedList可以成為堆棧,隊(duì)列或者雙向鏈表.,2020/8/1,Java集合類(下),9,數(shù)組列表ArrayList,在編程中常常會(huì)遇到需要?jiǎng)討B(tài)操縱數(shù)組,比如在運(yùn)行時(shí)增加和刪除數(shù)組元素,而且有時(shí)在編譯時(shí)又不想確定數(shù)組大小希望它可以動(dòng)態(tài)伸縮,在java中解決這一問(wèn)題的方法是使用java.util包中的ArrayList類 ArrayList是List接口的一個(gè)可變長(zhǎng)數(shù)組實(shí)現(xiàn)。,2020/8/1,Java集合類(下),10,數(shù)組列表ArrayList,public int size();/返回列表中的元素個(gè)數(shù) public Object

6、 get(int index);/返回指定位置的元素 public void set(int index, Object obj);/設(shè)置指定位置元素 public void add(Object obj);/在列表末尾增加元素 public void add(int index, Object obj);/在列表指定位置插入元素 public void clear();/刪除列表中所有元素 public void remove(int index);/刪除列表中指定位置元素元素 public void contains(Object obj);/判斷列表中指定對(duì)象是否存在,2020/8/1,

7、Java集合類(下),11,ArrayList示例(ArrayListExample),public class ArrayListExample public static void main( String args ) ArrayList al = new ArrayList(); / Create a new ArrayList for( int i=0; i10; i+ ) al.add( new Integer( i ) ); / Add Items to the array list for( int i=0; ial.size(); i+ ) System.out.printl

8、n( i + = + al.get( i ) ); al.remove( 5 ); al.set( 5, new Integer( 66 ) ); for( Iterator i=al.iterator(); i.hasNext(); ) Integer integer = ( Integer )i.next(); System.out.println( integer ); ,2020/8/1,Java集合類(下),12,A List Example,import java.util.* public class ListExample public static void main(Str

9、ing args) List list = new ArrayList(); list.add(one); list.add(second); list.add(3rd); list.add(new Integer(4); list.add(new Float(5.0F); list.add(second); / duplicate, is added list.add(new Integer(4); / duplicate, is added System.out.println(list); Output: one, second, 3rd, 4, 5.0, second, 4,2020/

10、8/1,Java集合類(下),13,Vector和ArrayList區(qū)別,要回答這個(gè)問(wèn)題不能一概而論,有時(shí)候使用Vector比較好;有時(shí)是ArrayList,有時(shí)候這兩個(gè)都不是 最好的選擇。你別指望能夠獲得一個(gè)簡(jiǎn)單肯定答案,因?yàn)檫@要看你用它們干什么。Vector類似于ArrayList.。所有從API的角度來(lái)看這兩個(gè)類非常相似。但他們之間也還是有一些主要的區(qū)別的。 同步性(jdk 1.4) Vector是同步的。這個(gè)類中的一些方法保證了Vector中的對(duì)象是線程安全的。而ArrayList則是異步的,因此ArrayList中的對(duì)象并不是線程安全的。因?yàn)橥降囊髸?huì)影響執(zhí)行的效率,所以如果你不需

11、要線程安全的集合那么使用ArrayList是一個(gè)很好的選擇,這樣可以避免由于同步帶來(lái)的不必要的性能開銷。 數(shù)據(jù)增長(zhǎng) 從內(nèi)部實(shí)現(xiàn)機(jī)制來(lái)講ArrayList和Vector都是使用數(shù)組(Array)來(lái)控制集合中的對(duì)象。當(dāng)你向這兩種類型中增加元素的時(shí)候,如果元素的數(shù)目超出了內(nèi)部數(shù)組目前的長(zhǎng)度它們都需要擴(kuò)展內(nèi)部數(shù)組的長(zhǎng)度,Vector缺省情況下自動(dòng)增長(zhǎng)原來(lái)一倍的數(shù)組長(zhǎng)度,ArrayList是原來(lái)的50%,所以最后你獲得的這個(gè)集合所占的空間總是比你實(shí)際需要的要大。所以如果你要在集合中保存大量的數(shù)據(jù)那么使用Vector有一些優(yōu)勢(shì),因?yàn)槟憧梢酝ㄟ^(guò)設(shè)置集合的初始化大小來(lái)避免不必要的資源開銷。,2020/8/1,

12、Java集合類(下),14,Vector和ArrayList區(qū)別,使用模式 在ArrayList和Vector中,從一個(gè)指定的位置(通過(guò)索引)查找數(shù)據(jù)或是在集合的末尾增加、移除一個(gè)元素所花費(fèi)的時(shí)間是一樣的,這個(gè)時(shí)間我們用O(1)表示。但是,如果在集合的其他位置增加或移除元素那么花費(fèi)的時(shí)間會(huì)呈線形增長(zhǎng):O(n-i),其中n代表集合中元素的個(gè)數(shù),i代表元素增加或移除元素的索引位置。為什么會(huì)這樣呢?因?yàn)樵谶M(jìn)行上述操作的時(shí)候集合中第i和第i個(gè)元素之后的所有元素都要執(zhí)行位移的操作。這一切意味著什么呢? 這意味著,你只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用Vector或ArrayLi

13、st都可以。如果是其他操作,你最好選擇其他的集合操作類。比如,LinkedList集合類在增加或移除集合中任何位置的元素所花費(fèi)的時(shí)間都是一樣的?O(1),但它在索引一個(gè)元素的使用缺比較慢O(i),其中i是索引的位置.使用ArrayList也很容易,因?yàn)槟憧梢院?jiǎn)單的使用索引來(lái)代替創(chuàng)建iterator對(duì)象的操作。LinkList也會(huì)為每個(gè)插入的元素創(chuàng)建對(duì)象,所有你要明白它也會(huì)帶來(lái)額外的開銷。,2020/8/1,Java集合類(下),15,Set 接口(例:SetTest),Set 接口繼承 Collection 接口,而且它不允許集合中存在重復(fù)項(xiàng),每個(gè)具體的 Set 實(shí)現(xiàn)類依賴添加的對(duì)象的 equ

14、als()方法來(lái)檢查獨(dú)一性。Set接口沒(méi)有引入新方法,所以Set就是一個(gè)Collection,只不過(guò)其行為不同。 不能包含重復(fù)值,兩個(gè)元素是否重復(fù)的依據(jù)是a.equals(b). 特例:因此最多只允許一個(gè)null存在 不能按照索引訪問(wèn),因?yàn)镾et的儲(chǔ)存順序不是有序的 Set的實(shí)現(xiàn)類往往有更快的對(duì)象操作(增加刪除)速度,如: ArrayList查找一個(gè)對(duì)象是否存在于List中,需要遍歷,而HashSet只根據(jù)哈希算法進(jìn)行快速的查找(HashSet元素的儲(chǔ)存不是有序的,2020/8/1,Java集合類(下),16,Set的實(shí)現(xiàn)類HashSet,允許插入最多一個(gè)null值 不保證元素的順序與插入的順

15、序一致,也不能按索引訪問(wèn). 通過(guò)將插入的元素分成一束一束,達(dá)到更快的數(shù)據(jù)操作功能 實(shí)現(xiàn)原理,是利用了一個(gè)HashMap實(shí)例,以每個(gè)元素為key 如果儲(chǔ)存元素的分布是均勻的,增刪查的恒定,且比較高. 加入Set中的元素應(yīng)該重載Object.hashCode()和Object.equals()方法(所有與哈希表有關(guān)的類都應(yīng)該重載) HashSet是線程不安全的. 如需要同步,用Collections. synchronizedSE(Setset)方法創(chuàng)建一個(gè)Set 適用場(chǎng)合:需要儲(chǔ)存大量的不可重復(fù)元素集合,頻繁的增刪操作,且不需要記錄插入時(shí)順序.,2020/8/1,Java集合類(下),17,Se

16、t 接口(例:SetTest),HashSet h = new HashSet(); h.add(1st); h.add(2nd); h.add(new Integer(3); h.add(new Double(4.0); h.add(2nd); / 重復(fù)元素, 未被加入 h.add(new Integer(3); / 重復(fù)元素, 未被加入,2020/8/1,Java集合類(下),18,HashSet,HashSet繼承AbstractSet并且實(shí)現(xiàn)Set接口。它創(chuàng)建一個(gè)類集,該類集使用散列表進(jìn)行存儲(chǔ)。正像大多數(shù)讀者很可能知道的那樣,散列表通過(guò)使用稱之為散列法的機(jī)制來(lái)存儲(chǔ)信息。在散列(hash

17、ing)中,一個(gè)關(guān)鍵字的信息內(nèi)容被用來(lái)確定唯一的一個(gè)值,稱為散列碼(hashcode)。而散列碼被用來(lái)當(dāng)做與關(guān)鍵字相連的數(shù)據(jù)的存儲(chǔ)下標(biāo)。關(guān)鍵字到其散列碼的轉(zhuǎn)換是自動(dòng)執(zhí)行的?你看不到散列碼本身。你的程序代碼也不能直接索引散列表。散列法的優(yōu)點(diǎn)在于即使對(duì)于大的集合,它允許一些基本操作如add( ),contains( ),remove( )和size( )方法的運(yùn)行時(shí)間保持不變。,2020/8/1,Java集合類(下),19,HashSet,HashSet( )構(gòu)造一個(gè)默認(rèn)的散列集合 HashSet(Collection c)用c中的元素初始化散列集合 HashSet(int capacity)用c

18、apacity初始化散列集合的容量 HashSet(int capacity, float fillRatio)第四種形式用它的參數(shù)初始化散列集合的容量和填充比(也稱為加載容量)。填充比必須介于0.0與1.0之間,它決定在散列集合向上調(diào)整大小之前,有多少能被充滿。具體的說(shuō),就是當(dāng)元素的個(gè)數(shù)大于散列集合容量乘以它的填充比時(shí),散列集合被擴(kuò)大。對(duì)于沒(méi)有獲得填充比的構(gòu)造函數(shù),默認(rèn)使用0.75.,2020/8/1,Java集合類(下),20,HashSet(例 ),HashSet沒(méi)有定義任何超過(guò)它的超類和接口提供的其他方法。重要的是,注意散列集合并沒(méi)有確保其元素的順序,因?yàn)樯⒘蟹ǖ奶幚硗ǔ2蛔屪约簠⑴c創(chuàng)

19、建排序集合。如果需要排序存儲(chǔ),另一種類集TreeSet將是一個(gè)更好的選擇。,2020/8/1,Java集合類(下),21,A Set Example,import java.util.*; public class SetExample public static void main(String args) Set set = new HashSet(); set.add(one); set.add(second); set.add(3rd); set.add(new Integer(4); set.add(new Float(5.0F); set.add(second); / duplic

20、ate, not added set.add(new Integer(4); / duplicate, not added System.out.println(set); /Output:one, second, 5.0, 3rd, 4 HashSet以哈希表形式存放,操作速度很快,2020/8/1,Java集合類(下),22,Iterator接口,Iterator接口定義了對(duì)Collection類型對(duì)象中所含元素的遍歷等增強(qiáng)處理功能 可以通過(guò)Collection接口中定義的iterator()方法獲得一個(gè)對(duì)應(yīng)的Iterator(實(shí)現(xiàn)類)對(duì)象 Set (實(shí)現(xiàn)類)對(duì)象對(duì)應(yīng)的Iterator仍然

21、是無(wú)序的 List(實(shí)現(xiàn)類)對(duì)象對(duì)應(yīng)的ListIterator對(duì)象可以實(shí)現(xiàn)對(duì)所含元素的雙向遍歷: 使用next()方法和previous()方法,2020/8/1,Java集合類(下),23,Iterator接口層次,2020/8/1,Java集合類(下),24,Iterator接口,Iterator:提供對(duì)所有集合(Collection)進(jìn)行遍歷的接口 對(duì)Collection提供一個(gè)統(tǒng)一的遍歷接口 是原Collection的一個(gè)視圖,故在進(jìn)行遍歷時(shí)對(duì)應(yīng)Collection中元素的改變會(huì)影響Iterator。 與舊版本遍歷Enumeration的區(qū)別: Iterator可以在遍歷時(shí)刪除對(duì)應(yīng)Co

22、llection中的元素 Iterator有更好的方法名 Enumeration已過(guò)時(shí) 不同的Collection產(chǎn)生Iterator產(chǎn)生的效率是不同的,ArrayList的遍歷應(yīng)該使用索引 List list = new ArrayList(); Iterator elements = list.iterator(); while(elements.hasNext() System.out.println(elements.next(); ,2020/8/1,Java集合類(下),25,Iterator接口,boolean hasNext( ) 如果存在更多的元素,則返回true,否則返回f

23、alse Object next( ) 返回下一個(gè)元素。如果沒(méi)有下一個(gè)元素,則引發(fā)NoSuchElementException異常 void remove( ) 刪除當(dāng)前元素,如果試圖在調(diào)用next( )方法之后,調(diào)用remove( )方法,則引發(fā)IllegalStateException異常,2020/8/1,Java集合類(下),26,Iterator接口,hasPrevious( ) 如果存在前一個(gè)元素,則返回true;否則返回false int nextIndex( ) 返回下一個(gè)元素的下標(biāo),如果不存在下一個(gè)元素,則返回列表的大小 Object previous( ) 返回前一個(gè)元素,

24、如果前一個(gè)元素不存在,則引發(fā)一個(gè)NoSuchElementException異常 int previousIndex( ) 返回前一個(gè)元素的下標(biāo),如果前一個(gè)元素不存在,則返回-1 void set(Object obj) 將obj賦給當(dāng)前元素。這是上一次調(diào)用next( )方法或previous( )方法最后返回的元素 void add(Object obj) 將obj插入列表中的一個(gè)元素之后,該元素在下一次調(diào)用next( )方法時(shí),被返回,2020/8/1,Java集合類(下),27,Iterator next(),對(duì)于a,b,c,d,e這樣一個(gè)5個(gè)元素的序列,有6個(gè)插入位置,每次next()

25、是由一個(gè)插入位置移動(dòng)到下一個(gè)插入位置,而不是元素的位置本身,2020/8/1,Java集合類(下),28,Iterator接口,在通過(guò)迭代函數(shù)訪問(wèn)類集之前,必須得到一個(gè)迭代函數(shù)。每一個(gè)Collection類都提供一個(gè)iterator( )函數(shù),該函數(shù)返回一個(gè)對(duì)類集頭的迭代函數(shù)。通過(guò)使用這個(gè)迭代函數(shù)對(duì)象,可以訪問(wèn)類集中的每一個(gè)元素,一次一個(gè)元素。通常,使用迭代函數(shù)循環(huán)通過(guò)類集的內(nèi)容,步驟如下:,2020/8/1,Java集合類(下),29,Iterator接口,1. 通過(guò)調(diào)用類集的iterator( )方法獲得對(duì)類集頭的迭代函數(shù)。 2. 建立一個(gè)調(diào)用hasNext( )方法的循環(huán),只要hasNe

26、xt( )返回true,就進(jìn)行循環(huán)迭代。 3. 在循環(huán)內(nèi)部,通過(guò)調(diào)用next( )方法來(lái)得到每一個(gè)元素。 對(duì)于執(zhí)行List的類集,也可以通過(guò)調(diào)用ListIterator來(lái)獲得迭代函數(shù)。正如上面解釋的那樣,列表迭代函數(shù)提供了前向或后向訪問(wèn)類集的能力,并可讓你修改元素。否則,ListIterator如同Iterator功能一樣。,2020/8/1,Java集合類(下),30,Iterator接口,import java.util.*; class HashSetTest public static void main(String args) HashSet hs = new HashSet();

27、 / hs.add(one); / hs.add(two); / hs.add(three); / hs.add(one); hs.add(new Student1(1, zhangsan); hs.add(new Student1(2, lisi); hs.add(new Student1(3, wangwu); hs.add(new Student1(1, zhangsan); Iterator it = hs.iterator(); while (it.hasNext() System.out.println(it.next(); ,2020/8/1,Java集合類(下),31,Iter

28、ator接口,class Student1 int num; String name; Student1(int num, String name) this.num = num; = name; public int hashCode() return num * name.hashCode(); public boolean equals(Object o) Student1 s = (Student1) o; return num = s.num ,2020/8/1,Java集合類(下),32,Iterator作為返回值,class IterTest31 public

29、 Iterator tt() List aa = new ArrayList(); aa.add(new Person(w1, 1); aa.add(new Person(w2, 1); aa.add(new Person(w3, 1); aa.add(new Person(w4, 1); aa.add(new Person(w5, 1); Iterator it = aa.iterator(); System.out.println(-); System.out.println(aa); return it; public static void main(String argc) Iter

30、Test31 itt = new IterTest31(); Iterator it = itt.tt(); while(it.hasNext() Person p1 = (Person)it.next(); System.out.println(p1); ,2020/8/1,Java集合類(下),33,多次調(diào)用對(duì)象xxx.iterator()獲取的Iterator,class IterTest41 public Iterator tt() List aa = new ArrayList(); aa.add(new Person(w1, 1); aa.add(new Person(w2, 1)

31、; aa.add(new Person(w3, 1); aa.add(new Person(w4, 1); aa.add(new Person(w5, 1); Iterator it = aa.iterator(); while(it.hasNext() Person p1 = (Person)it.next(); System.out.println(p1); if(p1.getName().equals(w3) System.out.println(-); Iterator it11 = aa.iterator(); if (it11.hasNext() System.out.printl

32、n(it11.next(); System.out.println(-); System.out.println(aa); return it; public static void main(String argc) IterTest41 itt = new IterTest41(); Iterator it = itt.tt();,2020/8/1,Java集合類(下),34,ConcurrentModificationException異常,獲取疊代器后 通過(guò)Connection接口的實(shí)現(xiàn)類增加刪除數(shù)據(jù) 通過(guò)疊代器自身增加刪除數(shù)據(jù),2020/8/1,Java集合類(下),35,映射(ma

33、p),映射(map)是一個(gè)存儲(chǔ)關(guān)鍵字和值的關(guān)聯(lián)或者說(shuō)是關(guān)鍵字/值對(duì)的對(duì)象。給定一個(gè)關(guān)鍵字,可以得到它的值。關(guān)鍵字和值都是對(duì)象。關(guān)鍵字必須是唯一的。但值是可以被復(fù)制的。有些映射可以接收null關(guān)鍵字和null值。而有的則不行。 Map是一個(gè)維護(hù)一組”鍵-值”映射的類(map keys to values)(這里的key,value全部都是引用類型) 一個(gè)Map中key的值是唯一的,不重復(fù) (如,不要用員工姓名作為key) 一個(gè)Map中一個(gè)key只能對(duì)應(yīng)一個(gè)value(可以為空),但一個(gè)value可以有多個(gè)key與之對(duì)應(yīng) Map能讓你通過(guò)key快速查找到相應(yīng)的對(duì)象并獲得它對(duì)應(yīng)的value的引用(如

34、存儲(chǔ)員工資料并用員工ID作為key來(lái)查找某一員工的信息),2020/8/1,Java集合類(下),36,HashMap,HashMap類使用散列表實(shí)現(xiàn)Map接口。這允許一些基本操作如get( )和put( )的運(yùn)行時(shí)間保持恒定,即便對(duì)大型集合,也是這樣的。 HashMap( )構(gòu)造一個(gè)默認(rèn)的散列映射 HashMap(Map m)用m的元素初始化散列映射 HashMap(int capacity)將散列映射的容量初始化為capacity HashMap(int capacity, float fillRatio)用它的參數(shù)同時(shí)初始化散列映射的容量和填充比。容量和填充比的含義與前面介紹的HashS

35、et中的容量和填充比相同。,2020/8/1,Java集合類(下),37,Map接口,HashMap 類,Map接口是Dictionary類的替代品。 HashMap是以哈希表的形式存儲(chǔ)鍵值對(duì),速度快。,2020/8/1,Java集合類(下),38,HashMap,HashMap實(shí)現(xiàn)Map并擴(kuò)展AbstractMap.它本身并沒(méi)有增加任何新的方法。應(yīng)該注意的是散列映射并不保證它的元素的順序。因此,元素加入散列映射的順序并不一定是它們被迭代函數(shù)讀出的順序。,2020/8/1,Java集合類(下),39,HashMap,import java.util.*; class HashMapTest p

36、ublic static void printElements(Collection c) Iterator it = c.iterator(); while (it.hasNext() System.out.println(it.next(); public static void main(String args) HashMap hm = new HashMap(); hm.put(one, zhangsan); hm.put(two, lisi); hm.put(three, wangwu); System.out.println(hm.get(one); System.out.pri

37、ntln(hm.get(two); System.out.println(hm.get(three); Set keys = hm.keySet(); System.out.println(Key:); printElements(keys); Collection values = hm.values(); System.out.println(Value:); printElements(values); Set entry = hm.entrySet(); /printElements(entry); Iterator it = entry.iterator(); while (it.h

38、asNext() Map.Entry me = (Map.Entry) it.next(); System.out.println(me.getKey() + : + me.getValue(); ,2020/8/1,Java集合類(下),40,HashMap,HashMap類: 實(shí)現(xiàn)Map接口及它的它的所有可選操作。允許空key和空value. 類似Hashtable,但Hashtable是線程安全的,且不允許空key和空value. 不保證元素的順序 基本元素操作(put and get)速度恒定。(前提是各“桶”內(nèi)分布的元素是均勻的) 線程不安全,2020/8/1,Java集合類(下),

39、41,HashSet 和 HashMap,HashMap可以看作三個(gè)視圖:key的Set,value的Collection,Entry的Set。 這里HashSet就是其實(shí)就是HashMap的一個(gè)視圖。HashSet內(nèi)部就是使用Hashmap實(shí)現(xiàn)的,和Hashmap不同的是它不需要Key和Value兩個(gè)值。 往hashset中插入對(duì)象其實(shí)只不過(guò)是內(nèi)部做了 public boolean add(Object o) return map.put(o, PRESENT)=null; HashMap為散列映射,它是基于hash table的一個(gè)實(shí)現(xiàn),它可在常量時(shí)間內(nèi)安插元素,或找出一組key-valu

40、e pair. HashSet為散列集,它把查找時(shí)間看的很重要,其中所有元素必須要有hashCode(),2020/8/1,Java集合類(下),42,Dictionary和Hashtable類,Dictionary類提供了根據(jù)關(guān)鍵字查值的功能。 Dictionary是個(gè)abstract的類,因此我們不直接使用它。直接使用的一般是Hashtable類。 Hashtable繼承了dictionary類,稱為哈希表類。快速尋址等,2020/8/1,Java集合類(下),43,Hashtable類,如果要取得并顯示哈希表中所有記錄值,應(yīng)該用以下程序段 Enumeration enum=table.e

41、lements() ; while(enum.hasMoreElements() ) show(Found Elements(not key): +enum.nextElement() ); 其中的table.elements 取得的是所有哈希表中的對(duì)象 如果要取得并顯示哈希表中所有關(guān)鍵字的值,就應(yīng)該這么做 Enumeration enum1=table.keys() ; while(enum1.hasMoreElements() ) show(Key is -+enum1.nextElement() ); 其中的table.keys 取得哈希表中所有關(guān)鍵字的值,2020/8/1,Java集合

42、類(下),44,Hashtable (注意不是HashTable),import java.util.*; class HashTableTest1 public Hashtable tt() try Hashtable mm = new Hashtable(); mm.put(w1, new Person(w1, 11); mm.put(w2, new Person(w2, 11); mm.put(w3, new Person(w3, 11); mm.put(w4, new Person(w4, 11); /* * mm.put(null,sdfds); mm.put(w3,null); E

43、numeration */ return mm; catch (Exception e) e.printStackTrace(); return null; public static void main(String argc) HashTableTest1 htt = new HashTableTest1(); Hashtable mm = htt.tt(); / 可以采用Map的 keySet(),values(),entrySet()方法來(lái)訪問(wèn)Hashtable /* * Set ss = mm.keySet(); Iterator ii = ss.iterator(); * while(ii.hasNext() System.out.println(ii.next(); */ / 也可以用早期提供的Enumeration訪問(wèn) /elements()返回value的,keys()返回key的Enumeration , values()返回values的Collection Enumeration

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論