面向?qū)ο?教案(第25講) 泛型、集合框架;(第26講) Set接口及實現(xiàn)類_第1頁
面向?qū)ο?教案(第25講) 泛型、集合框架;(第26講) Set接口及實現(xiàn)類_第2頁
面向?qū)ο?教案(第25講) 泛型、集合框架;(第26講) Set接口及實現(xiàn)類_第3頁
面向?qū)ο?教案(第25講) 泛型、集合框架;(第26講) Set接口及實現(xiàn)類_第4頁
面向?qū)ο?教案(第25講) 泛型、集合框架;(第26講) Set接口及實現(xiàn)類_第5頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

《面向?qū)ο蟪绦蛟O計》教案第25講教學對象計算機科學技術專業(yè)授課內(nèi)容10.1泛型10.2集合框架10.3List接口及實現(xiàn)類課程標準教學目標(一)知識目標1.了解泛型的概念2.掌握泛型的定義和使用3.了解集合框架4.掌握List接口及實現(xiàn)類(二)能力目標1.能夠?qū)W會泛型類的定義和使用2.熟練掌握ArrayList的基本操作,能夠熟練使用List集合解決問題教學方法采用講授法、演示法、討論法、案例教學。學時及分配(第1學時50分鐘)課堂講授30分鐘課堂練習20分鐘10.1泛型10.2集合框架學時及分配(第2學時50分鐘)課堂講授20分鐘課堂練習30分鐘10.3List接口及實現(xiàn)類知識點分析重點:泛型類型的定義和使用ArrayList的基本操作難點:泛型接口及泛型方法集合的體系結(jié)構(gòu)、迭代器教學過程設計內(nèi)容方式問題導入回顧一下,我們在前邊課程中定義了一個整數(shù)棧類IntStack,該類使用Integer作為棧的元素,這就限制了該類只能對Integer元素操作。如果要使這個棧類更具有通用性,我們可以使用Object作為棧的元素,因為Object類是所有類的超類,所以Object可以引用任何對象類型。然而,這種做法無法提供類型的安全性,在進行類型轉(zhuǎn)換時可能發(fā)生類型不匹配異常。使用泛型就可以提高類型安全性,因為,它可以使類型轉(zhuǎn)換自動地、隱式地進行。所謂泛型(generics)就是帶一個或多個類型參數(shù)(typeparameter)的類或接口。對于上述討論的對象棧,可以使用泛型定義。內(nèi)容要點10.1.1泛型類泛型是帶一個或多個類型參數(shù)的類或接口。【程序10-1】定義一個泛型Node類表示節(jié)點,類型參數(shù)T表示節(jié)點中存放的值。Node.javapackagecom.boda.xy;publicclassNode<T>{privateTdata;//泛型成員publicNode(){}//默認構(gòu)造方法publicNode(Tdata){//帶參數(shù)構(gòu)造方法this.data=data;}publicTgetData(){//訪問方法定義 returndata;}publicvoidsetData(Tdata){//修改方法定義 this.data=data;}//顯示類型名publicvoidshowType(){ System.out.println("T的類型是:"+data.getClass().getName());}}泛型類型的使用與方法調(diào)用類似,方法調(diào)用需向方法傳遞參數(shù),使用泛型需傳遞一個類型參數(shù),即用某個具體的類型替換T。例如,如果要在Node對象中存放Integer對象,就需要在創(chuàng)建Node對象時為其傳遞Integer類型參數(shù)。要實例化泛型類對象,也使用new運算符,但在類名后面需加上要傳遞的具體類型。varintNode=newNode<Integer>();一旦創(chuàng)建了intNode對象,就可以調(diào)用setData()方法設置其中的Integer對象,調(diào)用getData()方法返回其中的Integer對象,如下代碼所示?!境绦?0-2】NodeTest.javapackagecom.boda.xy;publicclassNodeTest{publicstaticvoidmain(String[]args){varintNode=newNode<Integer>();不需要強制類型轉(zhuǎn)換intNode.setData(999);不需要強制類型轉(zhuǎn)換varvalue=intNode.getData();System.out.println(value);intNode.showType();}}按照約定,類型參數(shù)名使用單個大寫字母表示。常用的類型參數(shù)名有:E表示元素,K表示鍵,N表示數(shù)字,T表示類型,V表示值等。10.1.2泛型接口還可以定義泛型接口。泛型可能具有多個類型參數(shù),但在類或接口的聲明中,每個參數(shù)名必須是唯一的?!境绦?0-3】定義了帶兩個參數(shù)的泛型接口Entry?!境绦?0-4】定義了實現(xiàn)Entry接口的泛型類Pair。下面語句創(chuàng)建兩個Pair類實例:varp1=newPair<Integer,String>(20,"twenty");varp2=newPair<String,String>("china","Beijing");10.1.3泛型方法泛型方法(genericmethod)是帶類型參數(shù)的方法。類的成員方法和構(gòu)造方法都可以定義為泛型方法。泛型方法的定義與泛型類型的定義類似,但類型參數(shù)的作用域僅限于聲明的方法和構(gòu)造方法內(nèi)。泛型方法可以定義為靜態(tài)的和非靜態(tài)的?!境绦?0-5】泛型方法的定義和使用。MathUtil.java參見教材。10.1.4通配符(?)的使用泛型類型本身是一個Java類型,為泛型類型傳遞不同的類型參數(shù)會產(chǎn)生不同的類型。例如:List<Object>list1=newArrayList<Object>();List<String>list2=newArrayList<String>();List<String>并不是List<Object>的子類型。因此,把一個List<String>對象傳遞給一個需要List<Object>對象的方法,將會產(chǎn)生一個編譯錯誤。請看下面代碼。publicstaticvoidprintList(List<Object>list){for(Objectelement:list){System.out.println(element);}}如果傳遞給該方法一個List<String>對象,將發(fā)生編譯錯誤。如果要使上述方法可打印任何類型的列表,可將其參數(shù)類型修改為List<?>,如下所示:publicstaticvoidprintList(List<?>list){for(Objectelement:list){System.out.println(element);}}這里,問號(?)就是通配符,它表示該方法可接受任何類型的List對象?!境绦?0-6】WildCardDemo.java10.1.5方法中有界參數(shù)有時需要限制傳遞給類型參數(shù)的類型種類,例如,要求一個方法只接受Number類或其子類的實例,這就需要使用有界類型參數(shù)(boundedtypeparameter)。有界類型分為上界和下界,上界用extends指定,下界用super指定。例如,要聲明上界類型參數(shù),應使用問號(?),后跟extends關鍵字,然后是上界類型。這里,extends具有一般的意義,對類表示擴展(extends),對接口表示實現(xiàn)(implements)。假如要定義一個getAverage()方法,它返回一個列表中所有數(shù)字的平均值,我們希望該方法能夠處理Integer列表、Double列表等各種數(shù)字列表。但是,如果把List<Number>作為getAverage()方法的參數(shù),它將不能處理List<Integer>列表或List<Double>列表。為了使該方法更具有通用性,可以限定傳遞給該方法的參數(shù)是Number對象或其子類對象的列表,這里Number類型就是列表中元素類型的上界(upperbound)。下面案例的getAverage()方法就是這樣的參數(shù)?!境绦?0-7】BoundedTypeDemo.java10.2集合框架集合是指集中存放一組對象的一個對象。集合相當于一個容器,它提供了保存、獲取和操作其他元素的方法。集合能夠幫助Java程序員輕松地管理對象。Java集合框架由兩種類型構(gòu)成,一個是Collection,另一個是Map。Collection對象用于存放一組對象,Map對象用于存放一組“關鍵字/值”的對象。Collection和Map是最基本的接口,它們又有子接口,這些接口的層次關系如圖12-5所示。10.3List接口及實現(xiàn)類List接口實現(xiàn)一種線性表的數(shù)據(jù)結(jié)構(gòu)。存放在

List中的所有元素都有一個下標(從0開始),可以通過下標訪問List中的元素。List中可以包含重復元素。List接口的實現(xiàn)類包括ArrayList、LinkedList、Vector和Stack。10.3.1List的操作List接口除繼承Collection的方法外,還定義了一些自己的方法。使用這些方法可以實現(xiàn)定位訪問、查找、迭代和返回子線性表。booleanadd(Objecte):將指定元素插入到列表末尾。voidadd(intindex,Eelement):將指定元素插入到指定下標處。Eget(intindex):返回指定下標處的元素。Eset(intindex,Eelement):修改指定下標處的元素。Eremove(intindex):刪除指定下標處的元素booleanaddAll(intindex,Collection<?extendsE>c):在指定下標處插入集合c中的全部元素。intindexOf(Objecto):查找指定對象第一次出現(xiàn)的位置。intlastIndexOf(Objecto):查找指定對象最后一次出現(xiàn)的位置。List<E>subList(intfrom,intto):返回從from到to元素的一個子線性表。10.3.2ArrayList類ArrayList是最常用的列表實現(xiàn)類,它通過數(shù)組實現(xiàn)的集合對象。ArrayList類實際上實現(xiàn)了一個變長的對象數(shù)組,其元素可以動態(tài)地增加和刪除。它的定位訪問時間是常量時間。ArrayList的構(gòu)造方法如下:ArrayList():創(chuàng)建一個空的數(shù)組列表對象,默認初始容量是10。初始容量指的是列表可以存放多少元素。當列表填滿而又需要添加更多元素時,列表大小會自動增大。ArrayList(Collectionc):用集合c中的元素創(chuàng)建一個數(shù)組列表對象。ArrayList(intinitialCapacity):創(chuàng)建一個空的數(shù)組列表對象,并指定初始容量。下列代碼創(chuàng)建一個ArrayList對象向其中插入幾個元素,并使用ArrayList的有關方法對它操作。varbigCities=newArrayList<String>();bigCities.add("北京");bigCities.add("上海");bigCities.add("廣州");System.out.println(bigCities.size());bigCities.add(2,"倫敦");//插入元素bigCities.set(2,"紐約");//修改元素System.out.println(bigCities.contains("北京"));System.out.println(bigCities);System.out.println(bigCities.indexOf("巴黎"));10.3.3遍歷集合元素在使用集合時,遍歷集合元素是最常見的任務。遍歷集合中的元素有多種方法:用簡單的for循環(huán)、用增強的for循環(huán)和用Iterator迭代器對象。1.使用簡單的for循環(huán)使用簡單的for循環(huán)可以遍歷集合中的每個元素。for(vari=0;i<bigCities.size();i++){System.out.print(bigCities.get(i)+"");}2.使用增強的for循環(huán)使用增強的for循環(huán)不但可以遍歷數(shù)組的每個元素,還可以遍歷集合中的每個元素。下面的代碼打印集合的每個元素:for(varcity:bigCities)System.out.println(city);上述代碼的含義是:將集合bigCities中的每個對象存儲到city變量中,然后打印輸出。使用這種方法只能按順序訪問集合中的元素,不能修改和刪除集合元素。3.使用迭代器迭代器是一個可以遍歷集合中每個元素的對象。調(diào)用集合對象的iterator()方法可以得到Iterator對象,再調(diào)用Iterator對象的方法就可以遍歷集合中的每個元素。Iterator接口定義了如下3個方法。booleanhasNext():返回迭代器中是否還有對象。Enext():返回迭代器中下一個對象。voidremove():刪除迭代器中的當前對象。Iterator使用一個內(nèi)部指針,開始它指向第一個元素的前面。如果在指針的后面還有元素,hasNext()方法返回true。調(diào)用next()方法,指針將移到下一個元素,并返回該元素。remove()方法將刪除指針所指的元素。假設myList是ArrayList的一個對象,要訪問myList中的每個元素,可以按下列方法實現(xiàn):Iteratoriterator=myList.iterator();//得到迭代器對象while(iterator.hasNext()){System.out.println(iterator.next());}使用Iterator也可以用for循環(huán)訪問集合元素。for(variterator=myList.iterator();iterator.hasNext();){System.out.println(iterator.next());}【程序10-8】ListDemo.java10.3.4數(shù)組轉(zhuǎn)換為List對象java.util.Arrays類提供了一個asList()方法,它將數(shù)組轉(zhuǎn)換成List對象:publicstatic<T>List<T>asList(T…a)該方法提供了一個方便的從多個元素創(chuàng)建List對象的途徑,它的功能與Collection接口的toArray()方法相反。varstr=newString[]{"one","two","three","four"};varlist=Arrays.asList(str);//將數(shù)組轉(zhuǎn)換為列表System.out.println(list);也可以將數(shù)組元素直接作為asList()方法的參數(shù)寫在括號中,例如:varlist=Arrays.asList("one","two","three","four");數(shù)組元素還可以使用基本數(shù)據(jù)類型,如果使用基本數(shù)據(jù)類型,則轉(zhuǎn)換成List對象元素時進行了自動裝箱操作。在Java9中,如果希望使用幾個元素創(chuàng)建一個集合,可以使用集合的工廠方法,從而可以避免調(diào)用add()方法。varints=Set.of(1,2,3);varstrList=List.of("first","second");注意,使用Arrays.asList()方法和集合的of()工廠方法返回的集合對象是不可變的,因此創(chuàng)建后再進行填加、刪除等操作,將拋出UnsupportedOperationException異常。如果要實現(xiàn)對集合對象的操作,可以將其作為一個參數(shù)傳遞給另一個List的構(gòu)造方法,如下所示。List<String>list=newArrayList<>(Arrays.asList(str));采用機房授課邊講邊練,同時用啟發(fā)式、討論式、案例教學等教學方法。布置課外學習任務教材課后編程題:1,2教學反思《面向?qū)ο蟪绦蛟O計》教案第26講教學對象計算機科學技術專業(yè)授課內(nèi)容10.4Set接口及實現(xiàn)類10.5Queue接口及實現(xiàn)類10.6案例學習——用集合存儲、遍歷員工記錄課程標準教學目標(一)知識目標1.掌握Set接口及實現(xiàn)類的定義和使用2.掌握Queue接口及實現(xiàn)類的定義和使用(二)能力目標1.熟練掌握HashSet和TreeSet集合的基本操作,能夠熟練使用Set集合解決實際問題2.熟練掌握Queue接口的基本操作,能夠熟練使用LinkedList解決實際問題教學方法采用講授法、演示法、討論法、案例教學。學時及分配(第1學時50分鐘)課堂講授30分鐘課堂練習20分鐘10.4Set接口及實現(xiàn)類學時及分配(第2學時50分鐘)課堂講授20分鐘課堂練習30分鐘10.5Queue接口及實現(xiàn)類10.6案例學習——用集合存儲、遍歷員工記錄知識點分析重點:HashSet和TreeSet集合的基本操作ArrayDeque類和LinkedList類的使用難點:自定義比較器教學過程設計內(nèi)容方式問題導入在Connection接口中,有兩個重要接口List和Set,上節(jié)課已經(jīng)講解了List接口及其實現(xiàn)類的使用,本節(jié)課將繼續(xù)講解Connection接口的另一個子接口Set接口及其實現(xiàn)類的使用。內(nèi)容要點10.4Set接口及實現(xiàn)類Set接口對象類似于數(shù)學上的集合概念,其中不允許有重復的元素。Set接口沒有定義新的方法,只包含從Collection接口繼承的方法。Set接口的常用實現(xiàn)類有:HashSet類、TreeSet類和LinkedHashSet類。10.4.1HashSet類HashSet類用散列方法存儲元素,具有最好的存取性能,但元素沒有順序。HashSet類的構(gòu)造方法有:HashSet():創(chuàng)建一個空的散列集合,該集合的默認初始容量是16,默認裝填因子(loadfactor)是0.75。裝填因子決定何時對散列表進行再散列。例如,如果裝填因子為0.75(默認值),而表中超過75%的位置已經(jīng)填入元素,這個表就會用雙倍的桶數(shù)自動地進行再散列。對于大多數(shù)應用程序來說,裝填因子為75%是比較合理的。HashSet(Collectionc):用指定的集合c的元素創(chuàng)建一個散列集合。HashSet(intinitialCapacity):創(chuàng)建一個散列集合,并指定集合的初始容量。下面代碼演示了HashSet的使用。varwords=newHashSet<>();words.add("one");words.add("two");words.add("three");words.add("four");words.add("one");//不能將重復的元素添加到集合中for(varw:words)System.out.print(w+"");//fouronetwothree從結(jié)果可以看到,在向Set對象中添加元素時,重復的元素不能添加到集合中。另外,由于程序中使用的實現(xiàn)類為HashSet,它并不保證集合中元素的順序。10.4.2TreeSet類TreeSet實現(xiàn)一種樹集合,它使用紅-黑樹為元素排序,添加到TreeSet中的元素必須是可比較的,即元素的類必須實現(xiàn)Comparable<T>接口。它的操作要比HashSet慢。TreeSet類的默認構(gòu)造方法創(chuàng)建一個空的樹集合,其他構(gòu)造方法如下。TreeSet(Collectionc):用指定集合c中的元素創(chuàng)建一個新的樹集合,集合中的元素按自然順序排序。TreeSet(Comparatorc):創(chuàng)建一個空的樹集合,元素的排序規(guī)則按給定的比較器c的規(guī)則排序?!境绦?0-9】TreeSetDemo.java10.4.3對象順序創(chuàng)建TreeSet類對象時如果沒有指定比較器對象,集合中的元素按自然順序排列。所謂自然順序(naturalorder)是指集合對象實現(xiàn)了Comparable<T>接口的compareTo()方法,對象則根據(jù)該方法排序。如果試圖對沒有實現(xiàn)Comparable<T>接口的集合元素排序,將拋出ClassCastException異常。另一種排序方法是創(chuàng)建TreeSet對象時指定一個比較器對象,這樣,元素將按比較器的規(guī)則排序。如果需要指定新的比較規(guī)則,可以定義一個類實現(xiàn)Comparator<T>接口,然后為集合提供一個新的比較器。字符串的默認比較規(guī)則是按字母順序比較。假如按反順序比較,可以定義一個類實現(xiàn)Comparator<T>接口,然后用該類對象作為比較器。【程序10-10】實現(xiàn)字符串的降序排序DescSortDemo.java10.5Queue接口及實現(xiàn)類Queue接口是Collection的子接口,它是以先進先出(First-In-First-Out,F(xiàn)IFO)的方式排列其元素,稱為隊列(queue)。Queue接口的子接口Deque實現(xiàn)雙端隊列,ArrayDeque和LinkedList是它的兩個實現(xiàn)類。10.5.1Queue接口和Deque接口Queue接口除了提供Collection的操作外,還提供了插入、刪除和檢查操作。Queue接口的常用方法如下:booleanadd(Ee):將指定的元素e插入到隊列中。Eremove():返回隊列頭元素,同時將其刪除。Eelement():返回隊列頭元素,但不將其刪除。Deque接口實現(xiàn)雙端隊列,它支持從兩端插入和刪除元素。Deque接口中定義的基本操作方法,如表10-1所示。表10-1Deque接口常用方法操作類型隊首元素操作隊尾元素操作插入元素addFirst(e)addLast(e)offerFirst(e)offerLast(e)刪除元素removeFirst()removeLast()pollFirstpollLast()返回元素getFirst()getLast()peekFirst()peekLast()10.5.2ArrayDeque類和LinkedList類Deque的常用實現(xiàn)類包括ArrayDeque類和LinkedList類,前者是可變數(shù)組的實現(xiàn),后者是線性表的實現(xiàn)。LinkedList類比ArrayDeque類更靈活,它實現(xiàn)了線性表的所有操作,其中可以存儲null元素,但ArrayDeque對象不能存儲null??梢允褂迷鰪姷膄or循環(huán)和迭代器訪問Deque的元素。varaDeque=newArrayDeque<String>();…for(varstr:aDeque){System.out.println(str);}使用迭代器訪問Deque元素代碼如下:varaDeque=newArrayDeque<String>();…for(variter=aDeque.iterator();iter.hasNext();){System.out.println(iter.next());}【程序10-11】演示了ArrayDeque類的使用DequeDemo.java隊列的實現(xiàn)類一般不允許插入null元素,但LinkedList類是它允許null元素。如果需要經(jīng)常在線性表的頭部添加元素或在內(nèi)部刪除元素,就應該使用LinkedList。這些操作在LinkedList中是常量時間,在ArrayList中是線性時間。而對定位訪問LinkedList是線性時間,ArrayList是常量時間。LinkedList的構(gòu)造方法如下:LinkedList():創(chuàng)建一個空的鏈表。LinkedList(Collecti

溫馨提示

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

評論

0/150

提交評論