Java程序設計課件:泛型與集合_第1頁
Java程序設計課件:泛型與集合_第2頁
Java程序設計課件:泛型與集合_第3頁
Java程序設計課件:泛型與集合_第4頁
Java程序設計課件:泛型與集合_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

泛型與集合

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

泛型泛型是數(shù)據(jù)類型多態(tài)化的一種體現(xiàn)。集合在Java的API中,對常用的數(shù)據(jù)結(jié)構(gòu)和算法做了一些規(guī)范和實現(xiàn),形成一系列接口和類。這些抽象出來的數(shù)據(jù)結(jié)構(gòu)和算法操作統(tǒng)稱為Java的集合框架(JavaCollectionFramework,JCF)。程序員使用集合框架提供的接口和類,在具體應用時,不必考慮這些數(shù)據(jù)結(jié)構(gòu)算法的實現(xiàn)細節(jié),只需用這些類創(chuàng)建對象并直接應用即可,這大大提高了編程效率。2024/2/4

2/30泛型的基本概念泛型能解決什么樣的問題?通過引用來實現(xiàn)參數(shù)類型的“任意化”。減少參數(shù)傳遞中顯式的數(shù)據(jù)類型轉(zhuǎn)換。如何理解泛型?是java解決通用數(shù)據(jù)類型問題的一種實現(xiàn)方案。對比Eg6.1和eg6.2可體會使用泛型與否的差別。2024/2/4

3/35使用泛型帶泛型的類。帶泛型的方法。定義帶泛型的方法和定義普通成員方法的語句格式完全一樣,只是方法的返回值類型和方法的參數(shù)可以使用泛型類而已。使用帶泛型方法的方式與使用不帶泛型方法的方式完全相同。帶泛型的語句2024/2/4

4/35[類說明修飾符]class類名<類型參數(shù)列表>[extends父類名][implements接口名列表]{……}類名<類型實參列表>對象名=new構(gòu)造方法名<類型實參列表>([參數(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/2/4

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/2/4

6/35使用泛型的注意事項泛型的類型參數(shù)必須為類的引用,不能用基本類型(如int,short,long,byte,float,double,char,boolean)。泛型是類型的參數(shù)化,在使用時可以用作不同類型,但不同類型的泛型類實例是不兼容的。泛型的類型參數(shù)可以有多個,也可以是一個。泛型可以使用extends,super,?

(通配符)來對類型參數(shù)進行限定不能實例化泛型類型變量。Gen<T>a=newGen();//錯誤的Gen<String>a=newGen();//正確的不能創(chuàng)建帶泛型類型的數(shù)組。如錯誤語句“TwoGen<Integer,String>[]tArray=newTwoGen<Integer,String>[3];”2024/2/4

7/356.2集合在程序設計過程中,我們經(jīng)常需要對一些具有特殊數(shù)據(jù)結(jié)構(gòu)的多個對象進行操作,比如對表、棧等的對象操作。在Java的API中,對常用的數(shù)據(jù)結(jié)構(gòu)和算法做了一些規(guī)范和實現(xiàn),形成一系列接口和類。這些抽象出來的數(shù)據(jù)結(jié)構(gòu)和算法操作統(tǒng)稱為Java的集合框架(JavaCollectionFramework,JCF)。程序員使用集合框架提供的接口和類,在具體應用時,不必考慮這些數(shù)據(jù)結(jié)構(gòu)算法的實現(xiàn)細節(jié),只需用這些類創(chuàng)建對象并直接應用即可,這大大提高了編程效率。2024/2/4

8/356.2.1集合框架核心接口主要有Collection、List、Set、Queue、Deque和Map。2024/2/4

9/35Collection接口Collection接口是集合的框架基礎,它用于表示對象集合。該接口中聲明了所有集合都將擁有的核心方法,如添加元素和刪除元素等。2024/2/4

10/35表6.1Collection的方法方法名說明add(Ee)將元素加入的集合中,成功返回true。clear()移除collection中的所有元素。equals(Objecto)比較collection與指定對象o是否相等。isEmpty()判定collection是否為空,是則返回true。size()獲取collection中的元素數(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中的所有元素添加到當前集合中,添加成功返回true。2024/2/4

11/35Set接口Set接口用來描述數(shù)據(jù)結(jié)構(gòu)中的集合。它具有與Collection完全一樣的接口,只是Set不保存重復的元素,向Set添加元素時,不保證元素添加后與添加的順序一致。實現(xiàn)它的常用子類有TreeSet類和HashSet類。2024/2/4

12/35Deque接口Deque用于描述數(shù)據(jù)結(jié)構(gòu)中的雙端隊列。它是一種在兩端都可以進行加入和刪除元素操作的線性表。2024/2/4

13/35Deque的常用方法方法名說明addFirst(Ee)將指定元素插入雙端隊列的開頭。addLast(Ee)將指定元素插入雙端隊列的末尾。getFirst()求雙端隊列的第一個元素。getLast()求雙端隊列的最后一個元素。peekFirst()求雙端隊列的第一個元素;如果雙端隊列為空,則返回null。peekLast()求雙端隊列的最后一個元素;如果雙端隊列為空,則返回null。pollFirst()獲取并移除隊列的首元素;如果雙端隊列為空,則返回null。pollLast()獲取并移除隊列的末元素;如果雙端隊列為空,則返回null。removeFirst()獲取并移除雙端隊列第一個元素。removeLast()獲取并移除雙端隊列的最后一個元素。size()返回雙端隊列的元素數(shù)。2024/2/4

14/35List接口List用來描述數(shù)據(jù)結(jié)構(gòu)中的表。List表中允許有重復的元素,而且元素的位置是按照元素的添加順序存放的。常用的List實現(xiàn)類有ArrayList(數(shù)組列表)類和LinkedList(鏈表)類。2024/2/4

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/2/4

16/35Queue接口Queue接口描述數(shù)據(jù)結(jié)構(gòu)中的隊列。它是一種先進先出的線性表。2024/2/4

17/35

Queue的常用方法方法名說明element()獲取隊列頭的元素,但是不移除此元素。offer(Ee)將元素e插入隊列,添加成功返回true。peek()獲取但不移除此隊列的頭;如果隊列為空,則返回null。poll()獲取并移除此隊列的頭,如果隊列為空,則返回null。2024/2/4

18/35Map接口Map接口用于維護鍵/值對(key/value)的集合,Map容器中的鍵對象不允許重復,而一個值對象又可以是一個Map,以此類推,這樣就形成了一個多級映射。Map有兩種常用的實現(xiàn)HashMap類和TreeMap類。2024/2/4

19/35Map接口的常用方法方法名說明clear()刪除所有的鍵值對。containsKey(Objectkey)判斷Map中是否有關(guān)鍵字為key的鍵值對,有則返回true。containsValue(Objectvalue)判斷Map中是否有值為key的鍵值對,有則返回true。entrySet()返回Map中的項的集合,集合對象類型為Map.Entry。get(Objectkey)獲取鍵值為key對應值得對象。hashCode()獲取Map的哈希碼值。isEmpty()判斷Map是否為空,是則返回true。keySet()獲取Map的鍵的集合。put(Kkey,Vvalue)將鍵/值為key-value的項加入Map。putAll(Map<?extendsK,?extendsV>m)將m的項全部加入到Map中remove(Objectkey)移除鍵值為key對應的項。size()獲取Map中項的個數(shù)。values()獲取Map中值的集合。2024/2/4

20/35其他接口SortedMap接口繼承自Map接口,它表示有序的Map。SortedSet接口描述的是一個帶有排序的集合,它根據(jù)向集合加入元素的順序排序,比Set接口多了幾個和排序相關(guān)的方法定義,2024/2/4

21/35迭代器接口(Iterator和Listlterator)迭代器是集合框架中的一種特殊接口。它提供對集合或表的遍歷和各種訪問功能。常用的迭代器接口有Iterator接口和Listlterator接口兩個。Iterator接口提供對集合元素的訪問操作功能2024/2/4

22/35Iterator接口的方法方法名說明hasNext()判斷是否存在另一個可訪問的元素,有則返回true。next()返回要訪問的下一個元素。remove()刪除上次訪問返回的對象。2024/2/4

23/35Listlterator接口的常用方法方法名說明add(Ee)將元素e插入列表當前位置的前面。hasNext()判斷是否有下一個元素,有則返回true。hasPrevious()判斷是否還有上一個元素,是的話返回true。next()獲取列表中的下一個元素。nextIndex()獲取下一個元素的索引。previous()獲取列表中的前一個元素。previousIndex()獲取列表中前一個元素的索引。remove()從列表中移除由next()或previous()返回的最后一個元素。set(Ee)用指定元素e替換next或previous返回的最后一個元素。2024/2/4

24/35表List接口的具體實現(xiàn)類常用的有ArrayList和LinkedList。ArrayList稱為數(shù)組列表,它采用類似數(shù)組存儲元素的形式存儲元素,不過它不需要預先定義存儲容量。2024/2/4

25/35ArrayList

我們可以把ArrayList看成一個可變長度的數(shù)組。每個ArrayList對象都有一個容量(capacity)。當元素添加到ArrayList時,它的容量會自動增加。2024/2/4

26/35方法名說明ArrayList()構(gòu)造一個初始容量為10的空表。ArrayList(Collection<?extendsE>c)用集合c的元素構(gòu)造列表。ArrayList(intn)構(gòu)造一個初始容量為n的空列表。trimToSize()將列表的容量調(diào)整為列表的當前大小。ensureCapacity(intminCapacity)修改列表的容量,使之可容納minCapacity個元素例:用ArrayList實現(xiàn)學生成績排序功能importjava.util.ArrayList;classStudent{//自定義的學生類 Stringname; doublescore; publicStudent(){ name=newString(); score=0; } publicStudent(Stringname,doublescore){ =name; this.score=score; }}2024/2/4

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/2/4

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/2/4

29/35LinkedList類的部分方法方法名說明LinkedList()構(gòu)造一個空表。addFirst(Ee)將指定元素插入列表的開頭。addLast(Ee)將指定元素添加到列表的結(jié)尾。getFirst()返回列表的第一個元素。getLast()返回列表的最后一個元素。removeFirst()移除并返回列表的第一個元素removeLast()移除并返回列表的最后一個元素。LinkedList(Collection<?extendsE>c)構(gòu)造一個包含集合c中的元素的列表2024/2/4

30/35迭代器的使用步驟通過iterator()方法得到集合的迭代器。通過調(diào)用hasNext方法判斷是否存在下一個元素。調(diào)用next方法得到當前遍歷到的元素。2024/2/4

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/2/4

32/35publicvoiddelE(Stringstr){//通過遍歷找符合刪除條件的元素,然后刪除 Iterator<String>iterator=names.iterator(); for(inti=0;iterator.hasNext();i++){ if(iterator.next().equals(str)) iterator.remove()

溫馨提示

  • 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

提交評論