《Java程序設(shè)計(jì)》課件-javaCP6泛型與集合_第1頁
《Java程序設(shè)計(jì)》課件-javaCP6泛型與集合_第2頁
《Java程序設(shè)計(jì)》課件-javaCP6泛型與集合_第3頁
《Java程序設(shè)計(jì)》課件-javaCP6泛型與集合_第4頁
《Java程序設(shè)計(jì)》課件-javaCP6泛型與集合_第5頁
已閱讀5頁,還剩32頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第六章泛型與集合

Java程序設(shè)計(jì)本章主要內(nèi)容

泛型泛型是數(shù)據(jù)類型多態(tài)化的一種體現(xiàn)。集合在Java的API中,對常用的數(shù)據(jù)結(jié)構(gòu)和算法做了一些規(guī)范和實(shí)現(xiàn),形成一系列接口和類。這些抽象出來的數(shù)據(jù)結(jié)構(gòu)和算法操作統(tǒng)稱為Java的集合框架(JavaCollectionFramework,JCF)。程序員使用集合框架提供的接口和類,在具體應(yīng)用時(shí),不必考慮這些數(shù)據(jù)結(jié)構(gòu)算法的實(shí)現(xiàn)細(xì)節(jié),只需用這些類創(chuàng)建對象并直接應(yīng)用即可,這大大提高了編程效率。2024/12/24李飛——計(jì)算中心2/30泛型的基本概念泛型能解決什么樣的問題?通過引用來實(shí)現(xiàn)參數(shù)類型的“任意化”。減少參數(shù)傳遞中顯式的數(shù)據(jù)類型轉(zhuǎn)換。如何理解泛型?是java解決通用數(shù)據(jù)類型問題的一種實(shí)現(xiàn)方案。對比Eg6.1和eg6.2可體會使用泛型與否的差別。2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心3/35使用泛型帶泛型的類。帶泛型的方法。定義帶泛型的方法和定義普通成員方法的語句格式完全一樣,只是方法的返回值類型和方法的參數(shù)可以使用泛型類而已。使用帶泛型方法的方式與使用不帶泛型方法的方式完全相同。帶泛型的語句2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心4/35[類說明修飾符]class類名<類型參數(shù)列表>[extends父類名][implements接口名列表]{……}類名<類型實(shí)參列表>對象名=new構(gòu)造方法名<類型實(shí)參列表>([參數(shù)表]);例6.3:定義有兩個可變類型的泛型類。classTwoGen<T,V>{ privateTob1; privateVob2; publicTwoGen(To1,Vo2){ ob1=o1; ob2=o2; } publicTgetOb1(){ returnob1;

} publicVgetOb2(){ returnob2; } publicvoidsetOb1(Tob1){ this.ob1=ob1; } publicvoidsetOb2(Vob2){ this.ob2=ob2; }2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心5/35 publicvoidshowTypes(){System.out.println("TypeofTis"+ob1.getClass().getName());System.out.println("TypeofVis"+ob2.getClass().getName());}}

publicclasseg6_3{ publicstaticvoidmain(String[]args){ TwoGen<Integer,String>tgObj=newTwoGen<Integer,String>(88,"Generics");//使用泛型的語句 intt=tgObj.getOb1(); System.out.println("value:"+t); Stringv=tgObj.getOb2(); System.out.println("value:"+v); tgObj.setOb1(25);//使用帶泛型的方法 tgObj.showTypes(); }}2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心6/35使用泛型的注意事項(xiàng)泛型的類型參數(shù)必須為類的引用,不能用基本類型(如int,short,long,byte,float,double,char,boolean)。泛型是類型的參數(shù)化,在使用時(shí)可以用作不同類型,但不同類型的泛型類實(shí)例是不兼容的。泛型的類型參數(shù)可以有多個,也可以是一個。泛型可以使用extends,super,?

(通配符)來對類型參數(shù)進(jìn)行限定不能實(shí)例化泛型類型變量。Gen<T>a=newGen();//錯誤的Gen<String>a=newGen();//正確的不能創(chuàng)建帶泛型類型的數(shù)組。如錯誤語句“TwoGen<Integer,String>[]tArray=newTwoGen<Integer,String>[3];”2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心7/356.2集合在程序設(shè)計(jì)過程中,我們經(jīng)常需要對一些具有特殊數(shù)據(jù)結(jié)構(gòu)的多個對象進(jìn)行操作,比如對表、棧等的對象操作。在Java的API中,對常用的數(shù)據(jù)結(jié)構(gòu)和算法做了一些規(guī)范和實(shí)現(xiàn),形成一系列接口和類。這些抽象出來的數(shù)據(jù)結(jié)構(gòu)和算法操作統(tǒng)稱為Java的集合框架(JavaCollectionFramework,JCF)。程序員使用集合框架提供的接口和類,在具體應(yīng)用時(shí),不必考慮這些數(shù)據(jù)結(jié)構(gòu)算法的實(shí)現(xiàn)細(xì)節(jié),只需用這些類創(chuàng)建對象并直接應(yīng)用即可,這大大提高了編程效率。2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心8/356.2.1集合框架核心接口主要有Collection、List、Set、Queue、Deque和Map。2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心9/35Collection接口Collection接口是集合的框架基礎(chǔ),它用于表示對象集合。該接口中聲明了所有集合都將擁有的核心方法,如添加元素和刪除元素等。2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心10/35表6.1Collection的方法方法名說明add(Ee)將元素加入的集合中,成功返回true。clear()移除collection中的所有元素。equals(Objecto)比較collection與指定對象o是否相等。isEmpty()判定collection是否為空,是則返回true。size()獲取collection中的元素?cái)?shù)。iterator()獲得collection的迭代器。hashCode()獲得collection的哈希碼值。toArray()以數(shù)組形式返回collection中所有元素。removeAll(Collection<?>c)從collection中移除c中的所有元素。retainAll(Collection<?>c)僅保留collection中也包含在c中的元素。contains(Objecto)判定集合中是否包含元素o,是返回true。remove(Objecto)移除集合中元素o,刪除成功返回true。containsAll(Collection<?>c)判定集合中是否包含子集c,是返回true。addAll(Collection<?extendsE>c)將集合c中的所有元素添加到當(dāng)前集合中,添加成功返回true。2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心11/35Set接口Set接口用來描述數(shù)據(jù)結(jié)構(gòu)中的集合。它具有與Collection完全一樣的接口,只是Set不保存重復(fù)的元素,向Set添加元素時(shí),不保證元素添加后與添加的順序一致。實(shí)現(xiàn)它的常用子類有TreeSet類和HashSet類。2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心12/35Deque接口Deque用于描述數(shù)據(jù)結(jié)構(gòu)中的雙端隊(duì)列。它是一種在兩端都可以進(jìn)行加入和刪除元素操作的線性表。2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心13/35Deque的常用方法方法名說明addFirst(Ee)將指定元素插入雙端隊(duì)列的開頭。addLast(Ee)將指定元素插入雙端隊(duì)列的末尾。getFirst()求雙端隊(duì)列的第一個元素。getLast()求雙端隊(duì)列的最后一個元素。peekFirst()求雙端隊(duì)列的第一個元素;如果雙端隊(duì)列為空,則返回null。peekLast()求雙端隊(duì)列的最后一個元素;如果雙端隊(duì)列為空,則返回null。pollFirst()獲取并移除隊(duì)列的首元素;如果雙端隊(duì)列為空,則返回null。pollLast()獲取并移除隊(duì)列的末元素;如果雙端隊(duì)列為空,則返回null。removeFirst()獲取并移除雙端隊(duì)列第一個元素。removeLast()獲取并移除雙端隊(duì)列的最后一個元素。size()返回雙端隊(duì)列的元素?cái)?shù)。2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心14/35List接口List用來描述數(shù)據(jù)結(jié)構(gòu)中的表。List表中允許有重復(fù)的元素,而且元素的位置是按照元素的添加順序存放的。常用的List實(shí)現(xiàn)類有ArrayList(數(shù)組列表)類和LinkedList(鏈表)類。2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心15/35List的常用方法方法名說明add(intindex,Eelement)在列表的index位置插入指定元素E。addAll(intindex,Collection<?extendsE>c)將集合c中所有元素插入到列表中的index起始位置。get(intindex)求列表中指定位置的元素。indexOf(Objecto)求列表中第一次出現(xiàn)元素o的索引;如果列表不包含該元素,則返回-1。lastIndexOf(Objecto)求列表中最后出現(xiàn)的元素o的索引;如果列表不包含此元素,則返回-1。remove(intindex)移除列表中索引為index的元素。set(intindex,Eelement)用元素E替換列表中索引為index的元素。listIterator()返回此列表元素的列表迭代器。listIterator(intindex)返回列表中從列表的index位置開始的列表迭代器。subList(intfromIndex,inttoIndex)返回列表中從索引fromIndex(包括)到toIndex(不包括)之間的子列表。2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心16/35Queue接口Queue接口描述數(shù)據(jù)結(jié)構(gòu)中的隊(duì)列。它是一種先進(jìn)先出的線性表。2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心17/35

Queue的常用方法方法名說明element()獲取隊(duì)列頭的元素,但是不移除此元素。offer(Ee)將元素e插入隊(duì)列,添加成功返回true。peek()獲取但不移除此隊(duì)列的頭;如果隊(duì)列為空,則返回null。poll()獲取并移除此隊(duì)列的頭,如果隊(duì)列為空,則返回null。2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心18/35Map接口Map接口用于維護(hù)鍵/值對(key/value)的集合,Map容器中的鍵對象不允許重復(fù),而一個值對象又可以是一個Map,以此類推,這樣就形成了一個多級映射。Map有兩種常用的實(shí)現(xiàn)HashMap類和TreeMap類。2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心19/35Map接口的常用方法方法名說明clear()刪除所有的鍵值對。containsKey(Objectkey)判斷Map中是否有關(guān)鍵字為key的鍵值對,有則返回true。containsValue(Objectvalue)判斷Map中是否有值為key的鍵值對,有則返回true。entrySet()返回Map中的項(xiàng)的集合,集合對象類型為Map.Entry。get(Objectkey)獲取鍵值為key對應(yīng)值得對象。hashCode()獲取Map的哈希碼值。isEmpty()判斷Map是否為空,是則返回true。keySet()獲取Map的鍵的集合。put(Kkey,Vvalue)將鍵/值為key-value的項(xiàng)加入Map。putAll(Map<?extendsK,?extendsV>m)將m的項(xiàng)全部加入到Map中remove(Objectkey)移除鍵值為key對應(yīng)的項(xiàng)。size()獲取Map中項(xiàng)的個數(shù)。values()獲取Map中值的集合。2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心20/35其他接口SortedMap接口繼承自Map接口,它表示有序的Map。SortedSet接口描述的是一個帶有排序的集合,它根據(jù)向集合加入元素的順序排序,比Set接口多了幾個和排序相關(guān)的方法定義,2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心21/35迭代器接口(Iterator和Listlterator)迭代器是集合框架中的一種特殊接口。它提供對集合或表的遍歷和各種訪問功能。常用的迭代器接口有Iterator接口和Listlterator接口兩個。Iterator接口提供對集合元素的訪問操作功能2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心22/35Iterator接口的方法方法名說明hasNext()判斷是否存在另一個可訪問的元素,有則返回true。next()返回要訪問的下一個元素。remove()刪除上次訪問返回的對象。2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心23/35Listlterator接口的常用方法方法名說明add(Ee)將元素e插入列表當(dāng)前位置的前面。hasNext()判斷是否有下一個元素,有則返回true。hasPrevious()判斷是否還有上一個元素,是的話返回true。next()獲取列表中的下一個元素。nextIndex()獲取下一個元素的索引。previous()獲取列表中的前一個元素。previousIndex()獲取列表中前一個元素的索引。remove()從列表中移除由next()或previous()返回的最后一個元素。set(Ee)用指定元素e替換next或previous返回的最后一個元素。2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心24/35表List接口的具體實(shí)現(xiàn)類常用的有ArrayList和LinkedList。ArrayList稱為數(shù)組列表,它采用類似數(shù)組存儲元素的形式存儲元素,不過它不需要預(yù)先定義存儲容量。2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心25/35ArrayList

我們可以把ArrayList看成一個可變長度的數(shù)組。每個ArrayList對象都有一個容量(capacity)。當(dāng)元素添加到ArrayList時(shí),它的容量會自動增加。2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心26/35方法名說明ArrayList()構(gòu)造一個初始容量為10的空表。ArrayList(Collection<?extendsE>c)用集合c的元素構(gòu)造列表。ArrayList(intn)構(gòu)造一個初始容量為n的空列表。trimToSize()將列表的容量調(diào)整為列表的當(dāng)前大小。ensureCapacity(intminCapacity)修改列表的容量,使之可容納minCapacity個元素例:用ArrayList實(shí)現(xiàn)學(xué)生成績排序功能importjava.util.ArrayList;classStudent{//自定義的學(xué)生類 Stringname; doublescore; publicStudent(){ name=newString(); score=0; } publicStudent(Stringname,doublescore){ =name; this.score=score; }}2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心27/35publicclasseg6_4{ ArrayList<Student>students; publiceg6_4(){ students=newArrayList<Student>();//利用泛型生成ArrayList對象 } publiceg6_4(intn){ students=newArrayList<Student>(n); }publicvoidlistSort(){//內(nèi)部類為列表排序 Studenttemp=newStudent(); for(inti=0;i<students.size()-1;i++) for(intj=i+1;j<students.size();j++){ if(students.get(i).score<students.get(j).score){ temp=students.get(i); students.set(i,students.get(j)); students.set(j,temp); } }

}2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心28/35publicstaticvoidmain(String[]args){ eg6_4eg=neweg6_4(); Students1=newStudent("張三",80); eg.students.add(s1);//向ArrayList追加元素 eg.students.add(newStudent("李四",76));//向ArrayList追加元素 eg.students.add(newStudent("王五",90)); eg.students.add(newStudent("趙六",56)); eg.listSort(); for(inti=0;i<eg.students.size();i++){//輸出ArrayList System.out.println("姓名:"+eg.students.get(i).name+ "\t成績:"+eg.students.get(i).score+ "\t名次:"+(i+1)); } }}2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心29/35LinkedList類的部分方法方法名說明LinkedList()構(gòu)造一個空表。addFirst(Ee)將指定元素插入列表的開頭。addLast(Ee)將指定元素添加到列表的結(jié)尾。getFirst()返回列表的第一個元素。getLast()返回列表的最后一個元素。removeFirst()移除并返回列表的第一個元素removeLast()移除并返回列表的最后一個元素。LinkedList(Collection<?extendsE>c)構(gòu)造一個包含集合c中的元素的列表2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心30/35迭代器的使用步驟通過iterator()方法得到集合的迭代器。通過調(diào)用hasNext方法判斷是否存在下一個元素。調(diào)用next方法得到當(dāng)前遍歷到的元素。2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心31/35例6.5:定義一個類,演示Iterator的使用。importjava.util.Iterator;importjava.util.LinkedList;publicclasseg6_5{ LinkedList<String>names; publiceg6_5(){ names=newLinkedList<String>(); } publicvoidtraversal(){//遍歷

Iterator<String>iterator=names.iterator(); System.out.print("姓名:"); for(inti=0;iterator.hasNext();i++){ System.out.print(iterator.next()+""); } System.out.println();

}2024/12/24李飛——東北大學(xué)秦皇島分校計(jì)算中心32/35publicvoiddelE(Stringstr){//通過遍歷找符合刪除條件的元素,然后刪除 Iterator<String>iterator=names.iterator(); for(inti=0;iterator.hasNext();i++){ if(iterator.next().equals(str)) iterator.remove(); } } publicst

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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

提交評論