下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第八章集合框架授課講師:顏鵬飛本章概述集合也稱容器,是裝在一組對(duì)象的容器,集合框架用來(lái)表示和操作集合的一組接口與類。如數(shù)組、列表和隊(duì)列等。集合框架中的常用接口1.java.util.Collection:Collection表示一組對(duì)象,這些對(duì)象也稱為collection的元素。一些collection允許有重復(fù)的元素,而另一些則不允許。一些collection是有序的,而另一些則是無(wú)序的。JDK不提供此接口的任何直接實(shí)現(xiàn):它提供更具體的子接口(如Set和List)實(shí)現(xiàn)。;2.java.util.List:繼承Collection,允許重復(fù),以元素安插的次序來(lái)放置元素(以元素安插的次序來(lái)放置元素:放進(jìn)去什么樣,里邊的結(jié)構(gòu)就是什么樣),不會(huì)重新排列;3.java.util.Set:繼承Collcetion,但是不允許重復(fù),使用自己內(nèi)部的一個(gè)排列機(jī)制。4.Map:是一組成對(duì)的鍵--值對(duì)象,既所持有的是Key-value對(duì)。Map中不能有重復(fù)的Key,擁有自己的內(nèi)部排列機(jī)制學(xué)習(xí)集合框架的思路:如何添加元素、如何獲得元素、如何刪除元素、如何遍歷元素。本章目標(biāo)對(duì)象數(shù)組集合集合框架(Collection接口,Map接口)Arrays類集合框架接口實(shí)現(xiàn)泛型1對(duì)象數(shù)組在Java提供的存儲(chǔ)及隨機(jī)訪問(wèn)對(duì)象序列的各種方法中,數(shù)組是效率最高的一種。對(duì)象數(shù)組數(shù)組元素是類的對(duì)象所有元素具有相同的類型每個(gè)元素都是一個(gè)對(duì)象的引用1.1對(duì)象數(shù)組初始化1.靜態(tài)初始化:在聲明和定義數(shù)組的同時(shí)對(duì)數(shù)組元素進(jìn)行初始化,例如:BankAccount[]accounts={newBankAccount(“Zhang",100.00),newBankAccount(“Li",2380.00),newBankAccount(“Wang",500.00),newBankAccount(“Liu",175.56),newBankAccount(“Ma",924.02)};2.動(dòng)態(tài)初始化:使用運(yùn)算符new,需要經(jīng)過(guò)兩步:首先給數(shù)組分配空間typearrayName[]=newtype[arraySize];然后給每一個(gè)數(shù)組元素分配空間arrayName[0]=newtype(paramList);1.2示例:對(duì)象數(shù)組(一)示例:使用數(shù)組存儲(chǔ)一個(gè)班的學(xué)生信息及考試成績(jī)。學(xué)生信息包括學(xué)號(hào)、姓名、二門課(日語(yǔ)、Java)的成績(jī)及總成績(jī)。分析:1.聲明學(xué)生類Student屬性包括學(xué)號(hào)(id),姓名(name),日語(yǔ)成績(jī)(japScore),java成績(jī)(javaScore),總成績(jī)(sum)方法包括構(gòu)造方法,get方法,set方法,toString方法,equals方法,compare方法(比較兩個(gè)學(xué)生的總成績(jī),結(jié)果分大于,小于,等于),sumScore方法(計(jì)算總成績(jī))1.2示例:對(duì)象數(shù)組(二)2.聲明學(xué)生班級(jí)類StudentClass屬性包括班級(jí)名稱(name),容量(capacity),學(xué)生(students),實(shí)際人數(shù)(size)。方法包括構(gòu)造方法,get方法,set方法,toString方法。1.2.1示例:學(xué)生類Student(一)publicclassStudent{ privateStringid; privateStringname; privateintjapScore;//日語(yǔ)成績(jī) privateintjavaScore;//java成績(jī) privateintsum; publicStudent(Stringid,Stringname,intjapScore,intjavaScore){ this.id=id; =name; this.japScore=japScore; this.javaScore=javaScore; sumScore(); }
1.2.1示例:學(xué)生類Student(二)publicStringgetId(){ returnid;}publicvoidsetId(Stringid){ this.id=id;}………………..publicvoidsumScore(){ this.sum=japScore+javaScore;} publicStringtoString(){ //TODOAuto-generatedmethodstub returngetId()+"\t"+getName()+"\t"+getJapScore()+"\t"+getJavaScore()+"\t"+getSum(); }1.2.1示例:學(xué)生類Student(三)//重寫(xiě)equals方法publicbooleanequals(Objectobj){ //TODOAuto-generatedmethodstub if(this.getClass()!=obj.getClass()){ returnfalse; } else{ Studentstudent=(Student)obj; returnthis.getId().equals(student.getId()); }}1.2.1示例:學(xué)生類Student(四)//比較規(guī)則publicintcompare(Studentstudent){ if(this.getSum()>student.getSum()){ return1; } elseif(this.getSum()==student.getSum()){ return0; } else{ return-1; }}1.2.2示例:班級(jí)類StudentClass(一)publicclassStudentClass{ privateStringname;//班級(jí)名稱 privateintcapacity=40;//班級(jí)容量 privateStudentstudents[];//學(xué)生 privateintsize;//實(shí)際人數(shù)
publicStudentClass(Stringname,intsize){ =name; this.size=size; students=newStudent[capacity]; }1.2.2示例:班級(jí)類StudentClass(二)publicvoidsetName(Stringname){ =name;}publicStringgetName(){ returnname;}publicvoidsetStudent(Student[]students){ for(inti=0;i<size;i++){ this.students[i]=students[i]; }}…………..1.2.2示例:班級(jí)類StudentClass(三)publicStringtoString(){ Stringresult; result="班級(jí):"+name+"\t"+"容量:"+capacity+"\t"+"實(shí)際人數(shù):"+size+"\n\n"; result+="學(xué)號(hào)"+"\t"+"姓名"+"\t"+"日語(yǔ)成績(jī)"+"\t"+"Java成績(jī)"+"\t"+"總成績(jī)"+"\n"; for(inti=0;i<size;i++){ result+=students[i].getId()+"\t"+students[i].getName()+"\t"+students[i].getJapScore()+"\t"+students[i].getJavaScore()+"\t"+students[i].getSum()+"\n"; } returnresult;}1.2.3示例:測(cè)試類(一)publicstaticvoidmain(String[]args){ Studentstudents[]; StudentClasssClass=newStudentClass("對(duì)日軟件開(kāi)發(fā)班",5); students=newStudent[5]; for(inti=0;i<5;i++){ students[i]=getStudent(i+1); } sClass.setStudent(students);
System.out.println(sClass); }1.2.3示例:測(cè)試類(二)publicstaticStudentgetStudent(inti){ Scannerscanner=newScanner(System.in); Studentstudent; System.out.println("輸入第"+i+"個(gè)學(xué)生信息"); System.out.println("學(xué)號(hào):"); Stringid=scanner.nextLine();//讀取鍵盤輸入的一行(以回車換行為結(jié)束輸入) System.out.println("姓名:"); Stringname=scanner.nextLine(); System.out.println("日語(yǔ)成績(jī):"); intjapScore=scanner.nextInt(); System.out.println("Java成績(jī):"); intjavaScore=scanner.nextInt(); student=newStudent(id,name,japScore,javaScore); returnstudent; }1.3.1對(duì)象數(shù)組--查找方法查找也稱為檢索,就是從一組數(shù)據(jù)中找出所需的具有某種特征的數(shù)據(jù)項(xiàng)。順序查找對(duì)所存儲(chǔ)的數(shù)據(jù)從第一項(xiàng)開(kāi)始(也可以從最后一項(xiàng)開(kāi)始),依次與所要查找的數(shù)據(jù)進(jìn)行比較,直到找到該數(shù)據(jù)或?qū)⑷吭囟颊彝赀€沒(méi)有找到該數(shù)據(jù)為止。示例:已知學(xué)生的學(xué)號(hào),查找此學(xué)生是否存在。如果存在,返回其在數(shù)組中的下標(biāo)位置;如果不存在,返回-1。publicintfindStudent(Stringid){ for(inti=0;i<size;i++){ if(students[i].getId().equals(id)){returni;} return-1;}}1.3.2對(duì)象數(shù)組--增加方法在數(shù)組的末尾增加一個(gè)學(xué)生對(duì)象。增加之前需先判斷數(shù)組中是否還有空間,并且在數(shù)組中查找將要增加的學(xué)號(hào)是否已經(jīng)存在。增加成功,返回true;否則,返回false。
publicbooleanaddStudent(StudentaStudent){if(size==capacity){returnfalse;}if(findStudent(aStudent.getId())>=0){returnfalse;}this.students[size]=aStudent;size++;returntrue;}1.3.3對(duì)象數(shù)組—?jiǎng)h除方法(一)1.已知一個(gè)Student對(duì)象,將此對(duì)象從數(shù)組中刪除publicbooleandelStudent(StudentaStudent){ intpos=findStudent(aStudent.getId()); if(pos==-1){returnfalse;} for(inti=pos+1;i<size;i++){ {students[i-1]=students[i];} size--; returntrue; }} 1.3.3對(duì)象數(shù)組—?jiǎng)h除方法(二)2.已知學(xué)號(hào),刪除一個(gè)學(xué)生publicbooleandelStudent(Stringid){ intpos=findStudent(id); if(pos==-1){returnfalse;} for(inti=pos+1;i<size;i++){ students[i-1]=students[i];} size--; returntrue;}
1.4對(duì)象數(shù)組—排序1.用選擇排序方法按總成績(jī)從高到低排序publicvoidselectionSort(){ Studenttemp; for(inti=0;i<size-1;i++) for(intj=i+1;j<size;j++) if(students[j]pare(students[i])>0){ temp=students[i]; students[i]=students[j]; students[j]=temp; }}1.4對(duì)象數(shù)組—排序排序前:班級(jí):對(duì)日軟件開(kāi)發(fā)班容量:40實(shí)際人數(shù):5學(xué)號(hào)姓名日語(yǔ)成績(jī)Java成績(jī)總成績(jī)001張三8790177002李四7865143003王五8664150004趙六9080170005田七4980129排序后:學(xué)號(hào) 姓名 日語(yǔ)成績(jī)Java成績(jī) 總成績(jī)001 張三 87 90 177004 趙六 90 80 170006 King 78 89 167003 王五 86 64 150002 李四 78 65 143005 田七 49 80 1292集合集合把具有相同性質(zhì)的一類東西,匯聚成一個(gè)整體。在Java2中有很多與集合有關(guān)的接口及類。它們被組織在以Collection及Map接口為根的層次結(jié)構(gòu)中,稱為集合框架。在Java2之前,在Java1.0/1.1中,沒(méi)有完整的集合框架。只有一些簡(jiǎn)單的可以自擴(kuò)展的容器類VectorHashtable2.1為什么使用集合數(shù)組的優(yōu)點(diǎn)是Java提供的隨機(jī)訪問(wèn)對(duì)象序列的最有效方法。是一個(gè)簡(jiǎn)單的線性序列,訪問(wèn)元素的速度較快。數(shù)組的缺點(diǎn)大小自創(chuàng)建以后就固定了,在其整個(gè)生存期內(nèi)其大小不可改變。數(shù)組元素只能是同一類型。集合可動(dòng)態(tài)改變其大小??稍谛蛄兄写鎯?chǔ)不同類型的數(shù)據(jù)。3Java集合框架集合框架(JavaCollectionsFramework)為表示和操作集合而規(guī)定的一種統(tǒng)一的標(biāo)準(zhǔn)的體系結(jié)構(gòu)。提供了一些現(xiàn)成的數(shù)據(jù)結(jié)構(gòu)可供使用,程序員可以利用集合框架快速編寫(xiě)代碼,并獲得優(yōu)良性能。包含三大塊內(nèi)容對(duì)外的接口:表示集合的抽象數(shù)據(jù)類型,使集合的操作與表示分開(kāi)。接口的實(shí)現(xiàn):指實(shí)現(xiàn)集合接口的Java類,是可重用的數(shù)據(jù)結(jié)構(gòu)。對(duì)集合運(yùn)算的算法:是指執(zhí)行運(yùn)算的方法,例如在集合上進(jìn)行查找和排序。3.1Java集合框架(續(xù))——對(duì)外的接口集合框架接口聲明了對(duì)各種集合類型執(zhí)行的一般操作。包括Collection、Set、List、SortedSet、Map、SortedMap?;窘Y(jié)構(gòu)如圖:3.2Java集合框架——Collection接口包括4個(gè)接口、4個(gè)抽象類及6個(gè)具體類CollectionAbstractCollectionVectorArrayListStackListSetSortedSetAbstractSetAbstractListAbstractSequentialListHashSetTreeSetLinkedList3.2.1Java集合框架——Collection接口1.Collection接口聲明了一組操作成批對(duì)象的抽象方法:查詢方法、修改方法。查詢方法intsize()–返回集合對(duì)象中包含的元素個(gè)數(shù)。booleanisEmpty()–判斷集合對(duì)象中是否還包含元素,如果沒(méi)有任何元素,則返回true。booleancontains(Objectobj)–判斷對(duì)象是否在集合中。booleancontainsAll(Collectionc)–判斷方法的接收者對(duì)象是否包含集合中的所有元素。3.2.1Java集合框架——Collection接口(續(xù))修改方法包括booleanadd(Objectobj)–向集合中增加對(duì)象。booleanaddAll(Collectionc)–將參數(shù)集合中的所有元素增加到接收者集合中。booleanremove(Objectobj)–從集合中刪除對(duì)象。booleanremoveAll(Collectionc)-將參數(shù)集合中的所有元素從接收者集合中刪除。booleanretainAll(Collectionc)–在接收者集合中保留參數(shù)集合中的所有元素,其它元素都刪除。voidclear()–刪除集合中的所有元素。3.2.3Java集合框架——List接口2.List接口擴(kuò)展了Collection可包含重復(fù)元素。元素是有順序的,每個(gè)元素都有一個(gè)index值(從0開(kāi)始)標(biāo)明元素在列表中的位置。實(shí)現(xiàn)List接口的四個(gè)主要類是:Vector。ArrayList:一種類似數(shù)組的形式進(jìn)行存儲(chǔ),因此它的隨機(jī)訪問(wèn)速度極快。LinkedList:內(nèi)部實(shí)現(xiàn)是鏈表,適合于在鏈表中間需要頻繁進(jìn)行插入和刪除操作。棧Stack。3.2.2Java集合框架——Set、SortedSet接口3.Set接口擴(kuò)展了Collection。禁止重復(fù)的元素,是數(shù)學(xué)中“集合”的抽象。對(duì)equals和hashCode操作有了更強(qiáng)的約定,如果兩個(gè)Set對(duì)象包含同樣的元素,二者便是相等的。實(shí)現(xiàn)它的兩個(gè)主要類是哈希集合(HashSet)及樹(shù)集合(TreeSet)。4.SortedSet接口一種特殊的Set。其中的元素是升序排列的,還增加了與次序相關(guān)的操作。通常用于存放詞匯表這樣的內(nèi)容。3.2.4Java集合框架——Map、SortedMap接口1.Map接口不是Collection接口的繼承。用于維護(hù)鍵/值對(duì)(key/valuepairs)。描述了從不重復(fù)的鍵到值的映射,是一個(gè)從關(guān)鍵字到值的映射對(duì)象。其中不能有重復(fù)的關(guān)鍵字,每個(gè)關(guān)鍵字最多能夠映射到一個(gè)值。2.SortedMap接口一種特殊的Map,其中的關(guān)鍵字是升序排列的。與SortedSet對(duì)等的Map,通常用于詞典和電話目錄等。3.2.5Java集合框架——接口實(shí)現(xiàn)類接口實(shí)現(xiàn)歷史集合類SetHashSetTreeSetListArrayListVectorLinkedListStackMapHashMapHashtableTreeMapProperties4.1Arrays類Arrays類Java集合框架提供了一套專門用于操作數(shù)組的實(shí)用方法,它們作為靜態(tài)方法存在該類中。常用方法fill(type[]a,typeval):給數(shù)組填充,就是簡(jiǎn)單地把一個(gè)數(shù)組全部或者某段數(shù)據(jù)填成一個(gè)特殊的值。equals(type[]a,type[]b):實(shí)現(xiàn)兩個(gè)數(shù)組的比較,相等時(shí)返回true。sort(type[]a):對(duì)數(shù)組排序。binarySearch(
):對(duì)數(shù)組元素進(jìn)行二分法查找。Arrays.asList(Object[]a):實(shí)現(xiàn)數(shù)組到ArrayList的轉(zhuǎn)換。4.1Arrays類使用數(shù)組的填充和復(fù)制importjava.util.*;publicclassCopyingArrays{publicstaticvoidmain(String[]args){int[]i=newint[25];int[]j=newint[25];Arrays.fill(i,47);Arrays.fill(j,99);System.arraycopy(i,0,j,0,i.length);int[]k=newint[10];Arrays.fill(k,103);System.arraycopy(i,0,k,0,k.length);Arrays.fill(k,103);System.arraycopy(k,0,i,0,k.length);Integer[]u=newInteger[10];Integer[]v=newInteger[5];Arrays.fill(u,newInteger(47));Arrays.fill(v,newInteger(99));System.arraycopy(v,0,u,u.length/2,v.length);}}4.2Arrays類使用數(shù)組的比較importjava.util.*;publicclassComparingArrays{ publicstaticvoidmain(String[]args){ int[]a1=newint[10]; int[]a2=newint[10]; Arrays.fill(a1,47); Arrays.fill(a2,47); System.out.println(Arrays.equals(a1,a2));//true a2[3]=11; System.out.println(Arrays.equals(a1,a2));//false String[]s1=newString[5]; Arrays.fill(s1,"Hi"); String[]s2={"Hi","Hi","Hi","Hi","Hi"}; System.out.println(Arrays.equals(s1,s2));//true }}5Java集合框架接口實(shí)現(xiàn)接口的實(shí)現(xiàn)Collection沒(méi)有直接的實(shí)現(xiàn),除Collection以外,其余五個(gè)接口都有實(shí)現(xiàn)。主要的實(shí)現(xiàn)有ListVector/ArrayList/LinkedListSetHashSetSortedSetTreeSetMapHashMapSortedMapTreeMap5.1Java集合框架--List接口實(shí)現(xiàn)List接口實(shí)現(xiàn)類:Vector/ArrayList/LinkedList能夠存儲(chǔ)任意對(duì)象,但通常情況下,這些不同類型的對(duì)象都具有相同的父類或接口。不能存儲(chǔ)基本類型(primitive)的數(shù)據(jù),除非將這些數(shù)據(jù)包裹在包裝類中。其容量能夠根據(jù)空間需要自動(dòng)擴(kuò)充。增加元素方法的效率較高,除非空間已滿,在這種情況下,在增加之前需要先擴(kuò)充容量??梢栽贚ist中間插入和刪除元素。Vector:方法是同步的,線程安全。ArrayList/LinkedList:方法是非同步的,效率較高。5.1Java集合框架--List接口實(shí)現(xiàn)簡(jiǎn)述實(shí)現(xiàn)操作特性List提供基于索引的對(duì)成員的隨機(jī)訪問(wèn)ArrayList提供快速的基于索引的成員訪問(wèn),對(duì)尾部成員的增加和刪除支持較好LinkedList對(duì)列表中任何位置的成員的增加和刪除支持較好,但對(duì)基于索引的成員訪問(wèn)支持性能較差5.1.1ArrayList類1.ArrayList類:動(dòng)態(tài)數(shù)組,允許快速訪問(wèn)元素,但是從中間插入和刪除元素的速度很慢。ArrayList的構(gòu)造方法ArrayListmyList=newArrayList();ArrayListmyList=newArrayList(intcap);ArrayListmyList=newArrayList(Collectioncol);5.1.1ArrayList類的方法(一)ArrayList類常用方法:(1).voidadd(Objectobj)——添加一個(gè)對(duì)象,如ArrayListteamList=newArrayList();teamList.add("ZhangWei");teamList.add("LiHong");(2).booleanaddAll(Collectioncol)——添加整個(gè)集合,如果接收者對(duì)象的結(jié)果有變化,則返回true,如ArrayListteamList=newArrayList();teamList.add("ZhangWei");teamList.add("LiHong");ArrayListlist=newArrayList();list.addAll(teamList);5.1.1ArrayList類的方法(二)(3).intsize()——返回元素的個(gè)數(shù)。(4).booleanisEmpty()——如果不含元素,則返回true。(5).Objectget(intpos)——返回指定位置的元素,如ArrayListteamList=newArrayList();teamList.add("ZhangWei");teamList.add("LiHong");teamList.add("YuHongshu");teamList.get(1);//返回"LiHong"teamList.get(3);//產(chǎn)生異常ArrayIndexOutOfBoundsException5.1.1ArrayList類的方法(三)(6).voidset(intpos,Objectobj)——用參數(shù)對(duì)象替換指定位置的對(duì)象,如ArrayListteamList=newArrayList();teamList.add("ZhangWei");teamList.add("LiHong");teamList.add("YuHongshu");teamList.set(2,"LiuNa");System.out.println(teamList);//顯示[ZhangWei,LiHong,LiuNa]teamList.set(3,"MaLi");//產(chǎn)生例外ArrayIndexOutOfBoundsException5.1.1ArrayList類的方法(四)(7).booleanremove(Objectobj)——去除給定對(duì)象的第一次出現(xiàn),如果找到了對(duì)象,則返回true。去除一個(gè)對(duì)象后,其后面的所有對(duì)象都依次向前移動(dòng)。如ArrayListteamList=newArrayList();
teamList.add("ZhangWei");
teamList.add("LiHong");teamList.add("YuHongshu");teamList.remove("LiHong");teamList.remove("WangHong");//不做任何事,也不出現(xiàn)錯(cuò)誤System.out.println(teamList);//顯示[ZhangWei,YuHongshu]5.1.1ArrayList類的方法(五)(8).Objectremove(intpos)——去除給定位置的元素,并返回被去除的對(duì)象。如ArrayListteamList=newArrayList();
teamList.add("ZhangWei");
teamList.add("LiHong");teamList.add("YuHongshu");teamList.remove(0);//去除ZhangWeiteamList.remove(0);//去除LiHongSystem.out.println(teamList);//顯示[YuHongshu]teamList.remove(1);//產(chǎn)生例外ArrayIndexOutOfBoundsException5.1.1ArrayList類的方法(七)(9).booleanremoveAll(Collectioncol)——從接收者對(duì)象中去除所有在參數(shù)對(duì)象中出現(xiàn)的元素,如果接收者對(duì)象的結(jié)果有變化,則返回true。如ArrayListteamList=newArrayList();
teamList.add("ZhangWei");
teamList.add("LiHong");teamList.add("YuHongshu");ArrayListlist=newArrayList();
list.add("YuHongshu");
list.add("HeLi");list.add("ZhangWei");teamList.removeAll(list);System.out.println(teamList);//顯示[LiHong]5.1.1ArrayList類的方法(八)(10).voidclear()——去除所有的元素(11).booleancontains(Objectobj)——返回是否包含指定的對(duì)象,如果包含則返回true;否則,返回false(12).booleancontainsAll(Collectioncol)——返回是否包含參數(shù)col中的所有對(duì)象(13).intindexOf(Objectobj)——返回給定對(duì)象在Vector/ArrayList中第一次出現(xiàn)的位置,如不存在,則返回-1。如ArrayListteamList=newArrayList();
teamList.add("ZhangWei");
teamList.add("LiHong");teamList.indexOf("LiHong");//返回1。teamList.indexOf("ZhangLi");//返回-1。5.1.1ArrayList類的方法(九)注意:當(dāng)使用get()方法取出ArrayList中的元素時(shí),返回的類型都是Object類型。ArrayList的使用者需要記住存入對(duì)象的具體類型,當(dāng)使用get()方法取出后,再塑型成其本來(lái)的類型。使用get()方法將Customer對(duì)象從ArrayList中取出后,需要再塑型成Customer類。代碼如下:for(inti=0;i<v.size();i++){
Customerc=(Customer)v.get(i);
System.out.println(c.getName());}5.1.1Iterator迭代器迭代器(Iterator)本身就是一個(gè)對(duì)象,它的工作就是遍歷并選擇集合序列中的對(duì)象,而客戶端的程序員不必知道或關(guān)心該序列底層的結(jié)構(gòu)。此外,迭代器通常被稱為.輕量級(jí).對(duì)象,創(chuàng)建它的代價(jià)小。Iterator接口(1.2版,替代Enumeration)是一個(gè)遍歷集合元素的工具,是對(duì)Enumeration接口的改進(jìn),因此在遍歷集合元素時(shí),優(yōu)先選用Iterator接口。與Enumeration不同,具有從正在遍歷的集合中去除對(duì)象的能力。具有如下三個(gè)實(shí)例方法,可見(jiàn)相對(duì)于Enumeration接口簡(jiǎn)化了方法名:hasNext()
——判斷是否還有元素next()
——取得下一個(gè)元素remove()——去除一個(gè)元素。注意是從集合中去除最后調(diào)用next()返回的元素,而不是從Iterator類中去除5.1.1ListIterator迭代器ListIterator接口繼承Iterator接口以支持添加或更改底層集合中的元素,還支持雙向訪問(wèn)。方法:hasNext()
——判斷后邊是否還有元素next()
——取得下一個(gè)元素remove()——去除一個(gè)元素。注意是從集合中去除最后調(diào)用next()返回的元素,而不是從Iterator類中去除add()——向List中添加對(duì)象set()——實(shí)現(xiàn)對(duì)象的修改hasPrevious()——判斷前邊是否還有元素5.1.1Iterator與ListIterator區(qū)別區(qū)別:1.ListIterator有add()方法,可以向List中添加對(duì)象,而Iterator不能。2.ListIterator和Iterator都有hasNext()和next()方法,可以實(shí)現(xiàn)順序向后遍歷,但是ListIterator有hasPrevious()和previous()方法,可以實(shí)現(xiàn)逆向(順序向前)遍歷。Iterator就不可以。3.ListIterator可以定位當(dāng)前的索引位置,nextIndex()和previousIndex()可以實(shí)現(xiàn)。Iterator沒(méi)有此功能。4.都可實(shí)現(xiàn)刪除對(duì)象,但是ListIterator可以實(shí)現(xiàn)對(duì)象的修改,set()方法可以實(shí)現(xiàn)。Iierator僅能遍歷,不能修改。因?yàn)長(zhǎng)istIterator的這些功能,可以實(shí)現(xiàn)對(duì)LinkedList等List數(shù)據(jù)結(jié)構(gòu)的操作。一般情況下,我們使用Iterator就可以了,如果你需要進(jìn)行記錄的前后反復(fù)檢索的話,你就可以使用ListIterator來(lái)擴(kuò)展你的功能5.1.1案例:使用ArrayList類案例:電影DVD在線銷售系統(tǒng),它需要完成如下功能:1.能夠添加n個(gè)電影DVD對(duì)象,數(shù)量不確定,并且能夠、修改、刪除、查詢電影DVD信息。2.能夠獲取電影DVD對(duì)象的總數(shù)。3.能夠取出電影DVD對(duì)象并且逐條打印它的名稱。ArrayList類遍歷元素的效率比較高存儲(chǔ)方式如何選擇?元素個(gè)數(shù)不確定使用集合類需要遍歷元素存儲(chǔ)對(duì)象如何確定?類型:電影DVD對(duì)象屬性:電影ID、電影名稱、電影定價(jià)使用ArrayList類(一)第一步:確定集合中要存放的對(duì)象。publicclassMovie{privateintmovieId;//電影IdprivateStringmovieName;//電影名稱
privatedoubleprice;//電影定價(jià)
//構(gòu)造方法初始化對(duì)象
publicMovie(intmovieId,StringmovieName,doubleprice){ this.movieId=movieId; this.movieName=movieName; this.price=price;}//getter、setter方法……… }使用ArrayList類(二)第二步:操作集合中存放的對(duì)象。//顯示電影DVD列表publicstaticvoidshowMovieDvdList(){}//添加電影DVD信息publicstaticvoidaddMovieDvd(){}//修改電影DVD信息publicstaticvoideditMovieDvd(){}//修改電影DVD信息publicstaticvoiddeleteMovieDvd(){}//查詢電影DVD信息publicstaticvoidqueryMovieDvd(){}5.1.2LinkedList類LinkedList類是List接口的一個(gè)具體實(shí)現(xiàn)類。LinkedList類用于創(chuàng)建鏈表數(shù)據(jù)結(jié)構(gòu)。插入或者刪除元素時(shí),它提供更好的性能。addFirst方法添加銷售冠軍電影DVD對(duì)象addLast方法添加銷售最后一名的電影DVD對(duì)象getFirst方法獲取銷售冠軍電影DVD對(duì)象getLast方法獲取銷售最后一名的電影DVD對(duì)象removeFirst方法刪除銷售冠軍電影DVDremoveLast方法刪除銷售最后一名的電影DVD案例:使用LinkedList類繼續(xù)分析案例:電影DVD在線銷售系統(tǒng)需要增加新的功能,如下:能夠添加銷售冠軍電影DVD對(duì)象能夠刪除銷售最后一名的電影DVD對(duì)象存儲(chǔ)方式如何選擇?元素個(gè)數(shù)不確定使用集合類需要在列表的頭或尾添加、刪除元素LinkedList提供額外的方法在列表的首部或尾部添加或刪除元素。案例:使用LinkedList類addFirst方法添加銷售冠軍電影DVD對(duì)象addLast方法添加銷售最后一名的電影DVD對(duì)象getFirst方法獲取銷售冠軍電影DVD對(duì)象getLast方法獲取銷售最后一名的電影DVD對(duì)象removeFirst方法刪除銷售冠軍電影DVDremoveLast方法刪除銷售最后一名的電影DVD5.2Java集合框架--Map接口實(shí)現(xiàn)Map接口以該接口為根的集合類,用于存儲(chǔ)“關(guān)鍵字”(key)和“值”(value)的元素對(duì),其中每個(gè)關(guān)鍵字映射到一個(gè)值。當(dāng)需要通過(guò)關(guān)鍵字實(shí)現(xiàn)對(duì)值的快速存取時(shí)使用。聲明的抽象方法主要有查詢方法修改方法兩個(gè)主要實(shí)現(xiàn)類HashTable(1.0)HashMap(1.2)5.2Java集合框架--Map接口實(shí)現(xiàn)簡(jiǎn)述實(shí)現(xiàn)操作特性成員要求Map保存鍵值對(duì)成員,基于鍵找值操作,使用compareTo或compare方法對(duì)鍵進(jìn)行排序HashMap能滿足用戶對(duì)Map的通用需求鍵成員可為任意Object子類的對(duì)象,但如果覆蓋了equals方法,同時(shí)注意修改hashCode方法。TreeMap支持對(duì)鍵有序地遍歷,使用時(shí)建議先用HashMap增加和刪除成員,最后從HashMap生成TreeMap;附加實(shí)現(xiàn)SortedMap接口,支持子Map等要求順序的操作鍵成員要求實(shí)現(xiàn)Comparable接口,或者使用Comparator構(gòu)造TreeMap鍵成員一般為同一類型。LinkedHashMap保留鍵的插入順序,用equals方法檢查鍵和值的相等性成員可為任意Object子類的對(duì)象,但如果覆蓋了equals方法,同時(shí)注意修hashCode方法。5.2.1Java集合框架--查詢方法查詢方法intsize()——返回Map中的元素個(gè)數(shù)booleanisEmpty()——返回Map中是否包含元素,如不包括任何元素,則返回truebooleancontainsKey(Objectkey)——判斷給定的參數(shù)是否是Map中的一個(gè)關(guān)鍵字(key)booleancontainsValue(Objectval)——判斷給定的參數(shù)是否是Map中的一個(gè)值(value)Objectget(Objectkey)——返回Map中與給定關(guān)鍵字相關(guān)聯(lián)的值(value)Collectionvalues()——返回包含Map中所有值(value)的Collection對(duì)象SetkeySet()——返回包含Map中所有關(guān)鍵字(key)的Set對(duì)象SetentrySet()——返回包含Map中所有項(xiàng)的Set對(duì)象5.2.2Java集合框架--修改方法修改方法Objectput(Objectkey,Objectval)——將給定的關(guān)鍵字(key)/值(value)對(duì)加入到Map對(duì)象中。其中關(guān)鍵字(key)必須唯一,否則,新加入的值會(huì)取代Map對(duì)象中已有的值。voidputAll(Mapm)——將給定的參數(shù)Map中的所有項(xiàng)加入到接收者M(jìn)ap對(duì)象中。Objectremove(Objectkey)——將關(guān)鍵字為給定參數(shù)的項(xiàng)從Map對(duì)象中刪除。voidclear()——從Map對(duì)象中刪除所有的項(xiàng)。5.2.3Java集合框架Map接口實(shí)現(xiàn)
–HashTable,HashMap哈希表也稱為散列表,是用來(lái)存儲(chǔ)群體對(duì)象的集合類結(jié)構(gòu),其兩個(gè)常用的類是HashTable及HashMap。哈希表存儲(chǔ)對(duì)象的方式與前面所講的數(shù)組,Vector及ArrayList不同。數(shù)組,Vector及ArrayList中對(duì)象的存儲(chǔ)位置是隨機(jī)的,即對(duì)象本身與其存儲(chǔ)位置之間沒(méi)有必然的聯(lián)系。因此查找一個(gè)對(duì)象時(shí),只能以某種順序(如順序查找,二分查找)與各個(gè)元素進(jìn)行比較,如果數(shù)組或向量中的元素?cái)?shù)量很龐大時(shí),查找的效率必然降低。哈希表中,對(duì)象的存儲(chǔ)位置和對(duì)象的關(guān)鍵屬性k之間有一個(gè)特定的對(duì)應(yīng)關(guān)系f,我們稱之為哈希(Hash)函數(shù)。它使每個(gè)對(duì)象與一個(gè)唯一的存儲(chǔ)位置相對(duì)應(yīng)。因而在查找時(shí),只要根據(jù)待查對(duì)象的關(guān)鍵屬性k,計(jì)算f(k)的值即可知其存儲(chǔ)位置。5.2.3Java集合框架Map接口實(shí)現(xiàn)
–HashTable,HashMap哈希表相關(guān)的一些主要概念容量(capacity)——哈希表的容量不是固定的,隨對(duì)象的加入,其容量可以自動(dòng)擴(kuò)充。關(guān)鍵字/鍵(key)——每個(gè)存儲(chǔ)的對(duì)象都需要有一個(gè)關(guān)鍵字key,key可以是對(duì)象本身,也可以是對(duì)象的一部分(如對(duì)象的某一個(gè)屬性)。哈希碼(hashcode)——要將對(duì)象存儲(chǔ)到HashTable,就需要將其關(guān)鍵字key映射到一個(gè)整型數(shù)據(jù),稱為key的哈希碼(hashcode)。哈希函數(shù)(hashfunction)——返回對(duì)象的哈希碼。項(xiàng)(item)——哈希表中的每一項(xiàng)都有兩個(gè)域:關(guān)鍵字域key及值域value(即存儲(chǔ)的對(duì)象)。key及value都可以是任意的Object類型的對(duì)象,但不能為空(null),HashTable中的所有關(guān)鍵字都是唯一的。裝填因子(loadfactor)——(表中填入的項(xiàng)數(shù))/(表的容量)。5.2.3Java集合框架Map接口實(shí)現(xiàn)
–HashTable,HashMapObjectget(Objectkey)——返回關(guān)鍵字為key的值value,如果不存在,則返回null。如Hashtable
aPhoneBook=newHashtable();aPhoneBook.put("ZhangLei","");aPhoneBook.put("ZhuYongqin","");aPhoneBook.get("ZhangLei");//返回""aPhoneBook.get("ZhuYongqin");//返回""aPhoneBook.get("LiuLing");//返回nullObjectremove(Objectkey)——將鍵/值對(duì)從表中去除,并返回從表中去除的值,如果不存在,則返回null。如Hashtable
aPhoneBook=newHashtable();aPhoneBook.put("ZhuYongqin","");aPhoneBook.put("LiuNa","");aPhoneBook.remove("ZhuYongqin");aPhoneBook.remove("");//不出錯(cuò),但返回nullSystem.out.println(aPhoneBook);//顯示{LiuNa=}5.2.3Java集合框架Map接口實(shí)現(xiàn)
–HashTable,HashMapbooleanisEmpty()——判斷哈希表是否為空。booleancontainsKey(Objectkey)——判斷給定的關(guān)鍵字是否在哈希表中。booleancontains(Objectvalue)——判斷給定的值是否在哈希表中。booleancontainsValue(Objectvalue)——判斷給定的值是否在哈希表中。voidclear()——將哈希表清空。Enumerationelements()——返回包含值的Enumeration對(duì)象。SetkeySet():返回所有的鍵(key),并使用Set容器存放。SetentrySet():返回一個(gè)實(shí)現(xiàn)Map.Entry接口的元素Set。Collectionvalues():返回所有的值。HashMap類與HashTable類很相似,只是HashTable類不允許有空的關(guān)鍵字,而HashMap類允許。5.2.3Java集合框架Map接口實(shí)現(xiàn)
–HashTable與HashMap區(qū)別HashTable的應(yīng)用非常廣泛,HashMap是新框架中用來(lái)代替HashTable的類,也就是說(shuō)建議使用HashMap,不要使用HashTable。1.HashTable的方法是同步的,HashMap未經(jīng)同步,所以在多線程場(chǎng)合要手動(dòng)同步HashMap這個(gè)區(qū)別就像Vector和ArrayList一樣。2.HashTable不允許null值(key和value都不可以),HashMap允許null值(key和value都可以)。3.HashTable有一個(gè)contains(Objectvalue),功能和containsValue(Objectvalue)功能一樣。4.HashTable使用Enumeration,HashMap使用Iterator。5.2.3Java集合框架Map接口實(shí)現(xiàn)
–HashTable,HashMap遍歷HashMap:第一種:效率高,以后一定要使用此種方式!Mapmap=newHashMap();Iteratoriter=map.entrySet().iterator();while(iter.hasNext()){Map.Entryentry=(Map.Entry)iter.next();Objectkey=entry.getKey();Objectval=entry.getValue();}第二種:效率低,以后盡量少使用!Mapmap=newHashMap();Iteratoriter=map.keySet().iterator();while(iter.hasNext()){Objectkey=iter.next();Objectval=map.get(key);}5.2.3案例:HashMap電影DVD在線銷售系統(tǒng)中,每一部電影都會(huì)屬于一種電影分類,一種電影分類包含N部電影。科幻電影阿凡達(dá)、暮光之城恐怖電影貞子纏身、咒怨現(xiàn)在希望根據(jù)電影分類查詢關(guān)聯(lián)的影片集合,如何實(shí)現(xiàn)?存儲(chǔ)方式如何選擇?元素個(gè)數(shù)不確定使用集合類通過(guò)key(電影分類)獲得value(電影集合)HashMap是Map接口的實(shí)現(xiàn)類,把各個(gè)Object映射起來(lái),實(shí)現(xiàn)了“鍵/值(key/value)”對(duì)應(yīng)的快速存取。5.2.4Comparable接口TreeMap中是根據(jù)鍵(Key)進(jìn)行排序的。而如果我們要使用TreeMap來(lái)進(jìn)行正常的排序的話,Key中存放的對(duì)象必須實(shí)現(xiàn)Comparable接口。在java.lang包中,Comparable接口適用于一個(gè)類有自然順序的時(shí)候。假定對(duì)象集合是同一類型,該接口允許您把集合排序成自然順序。它只有一個(gè)方法:compareTo()方法,用來(lái)比較當(dāng)前實(shí)例和作為參數(shù)傳入的元素。如果排序過(guò)程中當(dāng)前實(shí)例出現(xiàn)在參數(shù)前(當(dāng)前實(shí)例比參數(shù)大),就返回某個(gè)負(fù)值。如果當(dāng)前實(shí)例出現(xiàn)在參數(shù)后(當(dāng)前實(shí)例比參數(shù)?。?,則返回正值。否則,返回零。如果這里不要求零返回值表示元素相等。零返回值可以只是表示兩個(gè)對(duì)象在排序的時(shí)候排在同一個(gè)位置。5.2.5Comparator接口Java.util包中提供的一個(gè)對(duì)某個(gè)對(duì)象集合進(jìn)行整體排序的比較接口提供了compare的比較方法來(lái)比較對(duì)象使用方法:定義實(shí)現(xiàn)該接口的類,重寫(xiě)compare方法;實(shí)例化該類的對(duì)象;把該對(duì)象作為Collections.sort()方法的參數(shù)。5.2.5Comparator接口//實(shí)現(xiàn)Comparator接口,比較DVD的價(jià)格publicclasspareimplementsComparat
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 吸引小學(xué)生的英語(yǔ)課件
- 法制培訓(xùn)課件名稱
- 生產(chǎn)安全宣講課件
- 小學(xué)生美術(shù)課件制作視頻
- 消防教學(xué)培訓(xùn)課件
- 七年級(jí)科學(xué)上冊(cè)9.2家庭用電9.2.4家庭用電的安全措施學(xué)案無(wú)答案牛津上海版
- 三年級(jí)數(shù)學(xué)上冊(cè)第3單元圖形的運(yùn)動(dòng)一3.4有趣的剪紙課時(shí)練冀教版
- 三年級(jí)科學(xué)上冊(cè)第二單元我們?cè)趺粗赖谄哒n它是什么教案青島版
- 道路安全生產(chǎn)課件講義
- 上半年大一學(xué)生會(huì)工作參考計(jì)劃范文
- 冷庫(kù)安全操作規(guī)程培訓(xùn)
- 省級(jí)非急救醫(yī)療轉(zhuǎn)運(yùn)管理規(guī)范
- 課程設(shè)計(jì)DLP4-13型鍋爐中硫煙煤煙氣袋式除塵濕式脫硫系統(tǒng)設(shè)計(jì)
- 煤泥綜合利用的可行性研究報(bào)告
- 三年級(jí)《剪窗花》課件
- 學(xué)前兒童發(fā)展心理學(xué)(高職)全套教學(xué)課件
- 四川省自貢市2022-2023學(xué)年八年級(jí)上學(xué)期期末語(yǔ)文試題
- 中國(guó)各省省會(huì)-地級(jí)市-縣級(jí)市明細(xì)表-
- 變曲率雙向可調(diào)收縫式翻升模板施工工法
- 教你炒紅爐火版00纏論大概
- 消防管道施工合同
評(píng)論
0/150
提交評(píng)論