Java程序設(shè)計(jì)課件項(xiàng)目5Java泛型與集合框架_第1頁
Java程序設(shè)計(jì)課件項(xiàng)目5Java泛型與集合框架_第2頁
Java程序設(shè)計(jì)課件項(xiàng)目5Java泛型與集合框架_第3頁
Java程序設(shè)計(jì)課件項(xiàng)目5Java泛型與集合框架_第4頁
Java程序設(shè)計(jì)課件項(xiàng)目5Java泛型與集合框架_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

Java程序設(shè)計(jì)

項(xiàng)目5Jav泛型和集合框架主要內(nèi)容:一、泛型二、泛型集合類三、工具類(1)泛型類聲明型類的聲明格式如下:

class類名<泛型列表>例如:classA<E>{…}其中,A是泛型類的名稱,E是其中的泛型列表中一個(gè)類型參數(shù),它可以是任何類或接口,但不能是基本數(shù)據(jù)類型。泛型聲明時(shí),E可以作為類的成員變量的類型、方法的類型以及局部變量的類型。泛型列表也可以有多個(gè),必須用逗號隔開,格式如下:classA<E,F>{…}任務(wù)1泛型1、泛型類泛型類的結(jié)構(gòu)和普通類完全類似,由成員變量和方法構(gòu)成。例如:我們聲明一個(gè)泛型類Pair,代碼如下:classPair<T>{ privateTfirst; privateTsecond; publicPair(){first=null;second=null;} publicPair(Tfirst,Tsecond){this.first=first;this.second=second;} publicTgetFirst(){returnfirst;} publicTgetSecond(){returnsecond;} publicvoidsetFirst(TnewValue){first=newValue;} publicvoidsetSecond(TnewValue){second=newValue;}}任務(wù)1泛型(2)使用泛型類聲明對象與普通類不同的是,使用泛型類型聲明和創(chuàng)建對象時(shí),類名后多了一對“<>”符號。而且要用具體的類型替換“<>”符號中的泛型。如:Pair<String>pair;//聲明一個(gè)泛型對象pair=newPair<String>("Hello","Java");//創(chuàng)建泛型對象例5.1泛型類的應(yīng)用。publicclassPairTest{publicstaticvoidmain(String[]args){Pair<String>pair=newPair<String>("Hello","Java"); System.out.println("first="+pair.getFirst()); System.out.println("second="+pair.getSecond());}}程序運(yùn)行結(jié)果為:first=Hellosecond=Java任務(wù)1泛型前面已經(jīng)介紹了如何定義一個(gè)泛型類。實(shí)際上,還可以定義一個(gè)帶有參數(shù)類型的方法即泛型方法。泛型方法使得該方法能夠獨(dú)立于類而產(chǎn)生變化,泛型方法所在的類可以是泛型類,也可以不是泛型類。創(chuàng)建一個(gè)泛型方法常用的形式如下:[訪問修飾符][static][final]<泛型列表>返回值方法名([形式參數(shù)列表])任務(wù)1泛型2、泛型方法例5.2泛型方法的應(yīng)用。classGenericMethod{public<T>voidf(Tx){ System.out.println(x.getClass().getName());}}publicclassGenericMethodTest{ publicstaticvoidmain(String[]args){ GenericMethodgm=newGenericMethod(); gm.f(""); gm.f(1); gm.f(1.0f); gm.f('c'); gm.f(gm); }}程序運(yùn)行結(jié)果為:java.lang.Stringjava.lang.Integerjava.lang.Floatjava.lang.CharacterGenericMethod任務(wù)1泛型除了泛型類和泛型方法,還可以使用泛型接口。泛型接口的定義與泛型類非常相似,它的聲明形式如下:

interface接口名<泛型列表>下面我們創(chuàng)建了一個(gè)名為MinMax的接口,用來返回某個(gè)對象集的最小值或最大值。代碼如下:interfaceMinMax<TextendsComparable<T>>{ Tmin(); Tmax();}MinMax接口類型參數(shù)T是有界類型,它必須是Comparable的子類。任務(wù)1泛型3、泛型接口接下來我們定義一個(gè)類MyClass來實(shí)現(xiàn)這個(gè)接口,代碼如下:

classMyClass<TextendsComparable<T>>implementsMinMax<T>{ T[]vals; MyClass(T[]ob){ vals=ob; } publicTmin(){ Tval=vals[0]; for(inti=1;i<vals.length;++i) if(vals[i].compareTo(val)<0)val=vals[i]; returnval; } publicTmax(){ Tval=vals[0]; for(inti=1;i<vals.length;++i) if(vals[i].compareTo(val)>0)val=vals[i]; returnval; }}任務(wù)1泛型例5.3泛型接口的應(yīng)用。publicclassMyClassTest{publicstaticvoidmain(Stringargs[]){Integerinums[]={56,47,23,45,85,12,55};Characterchs[]={'x','w','z','y','b','o','p'};MyClass<Integer>iob=newMyClass<Integer>(inums);MyClass<Character>cob=newMyClass<Character>(chs);System.out.println("Maxvalueininums:"+iob.max());System.out.println("Minvalueininums:"+iob.min());System.out.println("Maxvalueinchs:"+cob.max());System.out.println("Minvalueinchs:"+cob.min());}}出現(xiàn)運(yùn)行結(jié)果為:Maxvalueininums:85Minvalueininums:12Maxvalueinchs:zMinvalueinchs:b任務(wù)1泛型

Java集合框架由兩種類型構(gòu)成,一個(gè)是Collection,另一個(gè)是Map。它們層次關(guān)系如下圖。

任務(wù)2泛型集合類1、Collection<E>接口集合可理解為一個(gè)容器,該容器主要指映射(map)、集合(set)、列表(list)、散列表(hashtable)等抽象數(shù)據(jù)結(jié)構(gòu)。容器可以包含有多個(gè)元素,這些元素通常是一些Java對象。

Collection接口是構(gòu)造集合框架的基礎(chǔ)。它聲明所有集合類都將擁有的核心方法,這些方法的定義如下表所示。

任務(wù)2泛型集合類集合是指一個(gè)不包含重復(fù)元素的對象集合,是數(shù)學(xué)上“集合”概念的一種抽象。其本身是無序的。在集合框架中,HashSet類和TreeSet類實(shí)現(xiàn)了Set接口。這兩個(gè)類定義在java.util包中一般情況下,采用HashSet類創(chuàng)建一個(gè)無序的集合對象,采用TreeSet類創(chuàng)建有序的集合對象。這里我們只介紹比較常用的HasSet類。HashSet類所創(chuàng)建的類集使用散列表進(jìn)行存儲(chǔ)。HashSet類的構(gòu)造方法如下:●HashSet()創(chuàng)建一個(gè)空的哈希集合,裝填因子(loadfactor)是0.75?!馠ashSet(Collectionc)用指定的集合c的元素創(chuàng)建一個(gè)哈希集合。任務(wù)2泛型集合類2、Set<E>接口

●HashSet(intinitialCapacity)創(chuàng)建一個(gè)哈希集合,并指定的集合初始容量?!馠ashSet(intinitialCapacity,floatloadFactor)創(chuàng)建一個(gè)哈希集合,并指定的集合初始容量和裝填因子。例5.4從命令行輸入若干英文單詞,輸出每個(gè)重復(fù)的單詞,不同單詞的個(gè)數(shù)及消除重復(fù)單詞后的列表。

importjava.util.*;publicclassFindDups{publicstaticvoidmain(Stringargs[]){Set<String>hs=newHashSet<String>(); for(Stringa:args){ if(!hs.add(a)){ System.out.println("Duplicate:"+a); } }System.out.println(hs.size()+"distinctwords:"+hs);}}任務(wù)2泛型集合類如果使用下面命令運(yùn)行程序:C:\>javaFindDupsyoucameyousawyouleft程序運(yùn)行結(jié)果為:Duplicate:youDuplicate:you4distinctwords:[left,came,saw,you]任務(wù)2泛型集合類3、List<E>接口

List<E>接口也是Collection<E>接口的子接口,它實(shí)現(xiàn)一種順序表的數(shù)據(jù)結(jié)構(gòu),有時(shí)也稱為序列。存放在List中的所有元素都有一個(gè)下標(biāo)(下標(biāo)從0開始),可以通過下標(biāo)訪問List中的元素。List中可以包含重復(fù)元素。List接口及其實(shí)現(xiàn)類的層次結(jié)構(gòu)如下圖所示:任務(wù)2泛型集合類在列表接口中,除了在集合中所定義的方法外,還有一系列針對列表中特定位置的方法。列表List<E>接口定義在java.util包中,這些方法如下表所示。任務(wù)2泛型集合類任務(wù)2泛型集合類

List接口中只是聲明了一些列表元素存取的方法,而沒有具體的實(shí)現(xiàn),要真正實(shí)現(xiàn)對列表的操作還需要通過其實(shí)現(xiàn)類,下面列出了幾種List接口的實(shí)現(xiàn)類。①ArrayList類ArrayList類繼承AbstractList并實(shí)現(xiàn)List接口。它提供了一種數(shù)組列表的數(shù)據(jù)結(jié)構(gòu)。ArrayList的構(gòu)造方法如下:●ArrayList()創(chuàng)建一個(gè)空的數(shù)組列表對象?!馎rrayList(Collectionc)用集合c中的元素創(chuàng)建一個(gè)數(shù)組列表對象?!馎rrayList(intinitialCapacity)創(chuàng)建一個(gè)空的數(shù)組列表對象,并指定初始容量。任務(wù)2泛型集合類例5.5ArraryList類的應(yīng)用。importjava.util.*;publicclassListDemo{publicstaticvoidmain(Stringargs[]){Collectionc=newArrayList();Stringweekday[]=newString[]{"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};for(inti=0;i<weekday.length;i++)c.add(weekday[i]);System.out.println(c);Stringweekend[]=newString[]{"Saturday","Sunday"};Collectionc1=newArrayList();Collectionc2=newArrayList();c1.add(weekend[0]);c1.add(weekend[1]);System.out.println(c1);c.removeAll(c1);c2=newArrayList(c);System.out.println(c);System.out.println("c.containsAll(c1)="+c.containsAll(c1));System.out.println(c2);c.addAll(c1);System.out.println(c);System.out.println("c.containsAll(c1)="+c.containsAll(c1));c.retainAll(c2);System.out.println(c);}}任務(wù)2泛型集合類程序運(yùn)行結(jié)果為:[Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday][Saturday,Sunday][Monday,Tuesday,Wednesday,Thursday,Friday]c.containsAll(c1)=false[Monday,Tuesday,Wednesday,Thursday,Friday][Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday]c.containsAll(c1)=true[Monday,Tuesday,Wednesday,Thursday,Friday]②LinkedList類ArrayList類是通過數(shù)組方式來實(shí)現(xiàn)的,LinkedList類則是通過鏈表結(jié)構(gòu)來實(shí)現(xiàn)。一般說來,若對一個(gè)列表結(jié)構(gòu)的開始和結(jié)束處有頻繁地添加和刪除操作時(shí),一般選用LinkedList類所實(shí)例化的對象表示該列表。任務(wù)2泛型集合類LinkedList類擴(kuò)展了AbstractSequentialList類并實(shí)現(xiàn)List接口,其構(gòu)造方法如下:●LinkedList()創(chuàng)建一個(gè)空的鏈表?!馤inkedList(Collectionc)用集合c中的元素創(chuàng)建一個(gè)鏈表。通常利用LinkedList對象表示一個(gè)堆棧(stack)或隊(duì)列(queue)。對此LinkedList類中特別定義了一些方法,而這是ArrayList類所不具備的。這些方法用于在列表的開始和結(jié)束處添加和刪除元素,其方法定義如下:●publicvoidaddFirst(Objecto)將指定元素插入此列表的開頭。任務(wù)2泛型集合類●publicvoidaddLast(Objecto)將指定元素添加到此列表的結(jié)尾?!駊ublicObejctremoveFirst()移除并返回此列表的第一個(gè)元素?!駊ublicObjectremoveLast()移除并返回此列表的最后一個(gè)元素?!駊ublicObejctgetFirst()獲得列表的第一個(gè)元素?!駊ublicObjectgetLast()獲得列表的最后一個(gè)元素。任務(wù)2泛型集合類例5.6LinkedList類的應(yīng)用。

importjava.util.LinkedList;publicclassLinkedListDemo{ publicstaticvoidmain(String[]args){ LinkedList<String>queue=newLinkedList<String>(); queue.addFirst("set"); queue.addLast("HashSet"); queue.addLast("TreeSet"); queue.addFirst("List"); queue.addLast("ArrayList"); queue.addLast("LinkedList"); queue.addLast("map"); queue.addFirst("collection"); System.out.println(queue); queue.removeLast(); queue.removeFirst(); System.out.println(queue); }}任務(wù)2泛型集合類程序運(yùn)行結(jié)果為:[collection,List,set,HashSet,TreeSet,ArrayList,LinkedList,map][List,set,HashSet,TreeSet,ArrayList,LinkedList]4、Map<K,E>接口(1)Map<K,E>接口映射接口是與Collection接口相并列的一個(gè)接口,該接口描述了不重復(fù)的鍵到值的映射。一個(gè)映射對象中不能包含重復(fù)的鍵,且每個(gè)鍵只能映射到一個(gè)值。在映射中“鍵—值”對所描述的對象稱為條目(Entry)。其主要方法見下表所示。任務(wù)2泛型集合類任務(wù)2泛型集合類(2)HashMap類

HashMap類的構(gòu)造方法如下:●HashMap()創(chuàng)建一個(gè)空的映射對象,使用缺省的裝填因子(0.75)?!馠ashMap(intinitialCapacity)用指定的初始容量和缺省的裝填因子(0.75)創(chuàng)建一個(gè)映射對象?!馠ashMap(intinitialCapacity,floatloadFactor)用指定的初始容量和指定的裝填因子創(chuàng)建一個(gè)映射對象?!馠ashMap(Mapt)用指定的映射對象創(chuàng)建一個(gè)新的映射對象。任務(wù)2泛型集合類例5.7HashMap類的應(yīng)用。

importjava.util.*;publicclassFrequency{publicstaticvoidmain(Stringargs[]){ Map<String,Integer>m=newHashMap<String,Integer>(); //由命令行參數(shù)初始化單詞頻率表

for(Stringa:args){ Integerfreq=m.get(a); m.put(a,(freq==null?1:freq+1)); } System.out.println(m.size()+"distinctwords:"); System.out.println(m);}}使用下面的命令行運(yùn)行該程序:C:\>javaFrequencynoneedtolightanightlightonalightnightliketonight.程序運(yùn)行結(jié)果為:9distinctwords:{no=1,a=2,need=1,light=3,like=1,night=2,tonight.=1,to=1,on=1}

Collections工具類,是集合對象的工具類,提供了操作集合的工具方法,例如排序,復(fù)制和反轉(zhuǎn)排序等方法。Collections工具類常用的方法如下:●publicstaticvoidsort(Listlist)根據(jù)數(shù)據(jù)元素的自然順序?qū)χ付惣瓷蜻M(jìn)行排序?!駊ublicstaticvoidshuffle(Listlist)對指定類集進(jìn)行隨機(jī)排序?!駊ublicstaticvoidreverse(Listlist)反轉(zhuǎn)指定類集中數(shù)據(jù)元素的順序?!駊ublicstaticObjectmax(Collectioncoll)根據(jù)數(shù)據(jù)元素的自然順序,返回給定Collection的最大元素?!駊ublicstaticObjectmin(Collectioncoll)根據(jù)數(shù)據(jù)元素的自然順序返回給定Collection的最小元素。任務(wù)3工具類1、Collection工具類

●publicstaticintbinarySearch(Listlist,Objectkey)使用二分搜索法搜索指定類集,以獲得指定key的對象。●publicstaticintindexOfSubList(Listsource,Listtarget)返回指定源類集中第一次出現(xiàn)指定目標(biāo)類集的起始位置,如果沒有返回-1?!駊ublicstaticintlastindexOfSubList(Listsource,Listtarget)返回指定源類集中最后一次出現(xiàn)指定目標(biāo)類集的起始位置,如果沒有返回-1?!駊ublicstaticvoidcopy(Listsource,Listtarget)將所有數(shù)據(jù)元素從一個(gè)類集source復(fù)制到另一個(gè)類集target?!駊ublicstaticvoidfill(Listlist,Objectobj)使用指定數(shù)據(jù)元素obj替換指定類集中的所有數(shù)據(jù)元素。任務(wù)3工具類例5.8Collections工具類應(yīng)用。

importjava.util.*;publicclassTestCollections{publicstaticvoidmain(String[]args){ Listlist=newArrayList(); list.add("w");list.add("o");list.add("r"); list.add("l");list.add("d"); System.out.println("排序前:"+list); System.out.println("該集合中的最大值:"+Collections.max(list)); System.out.println("該集合中的最小值:"+Collections.min(list)); Collections.sort(list); System.out.println("排序后:"+list); //二分查找,要求查找前集合是自然有序排列

System.out.println("r在集合中的索引為:"+Collections.binarySearch(list,"r")); Collections.shuffle(list); System.out.println("隨機(jī)排序結(jié)果:"+list); Collections.reverse(list);任務(wù)3工具類

System.out.println("逆序結(jié)果:"+list); Collections.swap(list,1,4); System.out.println("索引號為1、4的元素交換后:"+list); Collections.replaceAll(list,"w","d"); System.out.println("把w都換成d后結(jié)果:"+list); Collections.fill(list,"s"); System.out.println("全部填充為s后的結(jié)果:"+list);}}出現(xiàn)運(yùn)行結(jié)果為:排序前:[w,o,r,l,d]該集合中的最大值:w該集合中的最小值:d排序后:[d,l,o,r,w]r在集合中的索引為:3隨機(jī)排序結(jié)果:[w,d,r,l,o]逆序結(jié)果:[o,l,r,d,w]索引號為1、4的元素交換后:[o,w,r,d,l]把w都換成d后結(jié)果:[o,d,r,d,l]全部填充為s后的結(jié)果:[s,s,s,s,s]任務(wù)3工具類

Arrarys工具類,是數(shù)組的工具類,提供了對數(shù)組的工具方法,例如排序,二分查找等。Arrarys工具類常用方法如下:●publicstaticvoidfill(int[]a,intval)用指定的val值填充數(shù)組中的每個(gè)元素?!駊ublicstaticvoidfill(int[]a,intfromIndex,inttoIndex,intval)用指定的val值填充數(shù)組中的下標(biāo)從fromIndex開始到toIndex為止的每個(gè)元素?!駊ublicstaticvoidfill(Object[]a,Objectval)用指定的val值填充對象數(shù)組中的每個(gè)元素?!駊ublicstaticvoidfill(Object[]a,intfromIndex,inttoIndex,Objectval)用指定的val值填充對象數(shù)組中的下標(biāo)從fromIndex開始到toIndex為止的每個(gè)元素。任務(wù)3工具類2、Arrays工具類●publicstaticvoidsort(Object[]a)對數(shù)組a按自然順序排序?!駊ublicstaticvoidsort(Object[]a,intfromIndex,inttoIndex)對數(shù)組a中的元素從其始下標(biāo)fromIndex到終止下標(biāo)toIndex之間的元素排序?!駊ublicstaticintbinarySearch(int[]a,intkey)對已排序的int類型數(shù)組使用二分搜索法搜索,如果找到指定的值就返回其所在的索引位置,否則返回負(fù)值?!駊ublicstaticintbinarySearch(Object[]a,Objectkey)對已排序的對象數(shù)組使用二分搜索法搜索,如果找到指定的值就返回其所在的索引位置,否則返回負(fù)值?!?/p>

溫馨提示

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

評論

0/150

提交評論