版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
關(guān)于對象群體的組織2目錄7.1對象數(shù)組7.3集合(Collection,Map)7.4本章小結(jié)第2頁,共108頁,2024年2月25日,星期天37.1對象數(shù)組數(shù)組在Java提供的存儲(chǔ)及隨機(jī)訪問對象序列的各種方法中,數(shù)組是效率最高的一種類型檢查邊界檢查優(yōu)點(diǎn)數(shù)組知道其元素的類型編譯時(shí)的類型檢查大小已知代價(jià)數(shù)組對象的大小是固定的,在生存期內(nèi)大小不可變第3頁,共108頁,2024年2月25日,星期天4對象數(shù)組數(shù)組元素是類的對象所有元素具有相同的類型每個(gè)元素都是一個(gè)對象的引用對象數(shù)組7.1對象數(shù)組(續(xù))第4頁,共108頁,2024年2月25日,星期天5靜態(tài)初始化:在聲明和定義數(shù)組的同時(shí)對數(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)};動(dòng)態(tài)初始化:使用運(yùn)算符new,需要經(jīng)過兩步:首先給數(shù)組分配空間typearrayName[]=newtype[arraySize];然后給每一個(gè)數(shù)組元素分配空間arrayName[0]=newtype(paramList);…arrayName[arraySize-1]=newtype(paramList);7.1.1用數(shù)組存儲(chǔ)對象(續(xù))
——對象數(shù)組的初始化對象數(shù)組第5頁,共108頁,2024年2月25日,星期天6使用數(shù)組存儲(chǔ)一個(gè)班的學(xué)生信息及考試成績。學(xué)生信息包括學(xué)號(hào)、姓名、三門課(英語、數(shù)學(xué)、計(jì)算機(jī))的成績及總成績。首先聲明學(xué)生類Student屬性包括學(xué)號(hào)(id),姓名(name),英語成績(eng),數(shù)學(xué)成績(math),計(jì)算機(jī)成績(comp),總成績(sum)方法包括構(gòu)造方法,get方法,set方法,toString方法,equals方法,compare方法(比較兩個(gè)學(xué)生的總成績,結(jié)果分大于,小于,等于),sum方法(計(jì)算總成績)實(shí)現(xiàn)Serializable接口,以便對象持久化,7.1.1用數(shù)組存儲(chǔ)對象(續(xù))
——例7_1對象數(shù)組第6頁,共108頁,2024年2月25日,星期天7importjava.io.*;publicclassStudentimplementsSerializable{ privateStringid; //學(xué)號(hào)
privateStringname; //姓名
privateinteng; //英語成績
privateintmath; //數(shù)學(xué)成績
privateintcomp;//計(jì)算機(jī)成績
privateintsum; //總成績
publicStudent(Stringid,Stringname,inteng,intmath,intcomp){ this.id=id; =name; this.eng=eng; this.math=math; p=comp; sum();//計(jì)算總成績 }
7.1.1用數(shù)組存儲(chǔ)對象(續(xù))
——例7_1對象數(shù)組第7頁,共108頁,2024年2月25日,星期天8 publicStudent(Students){ this.id=s.id; =newString(); this.eng=s.eng; this.math=s.math; p=p; sum();//計(jì)算總成績 }
publicvoidsetId(Stringid){ this.id=id; } publicvoidsetName(Stringname){ =name; }
7.1.1用數(shù)組存儲(chǔ)對象(續(xù))
——例7_1對象數(shù)組第8頁,共108頁,2024年2月25日,星期天9 publicvoidsetEng(inteng){ this.eng=eng; sum();//計(jì)算總成績 }
publicvoidsetMath(intmath){ this.math=math; sum();//計(jì)算總成績 }
publicvoidsetComp(intcomp){ p=comp; sum();//計(jì)算總成績 }
publicStringgetId(){ returnid; }
7.1.1用數(shù)組存儲(chǔ)對象(續(xù))
——例7_1對象數(shù)組第9頁,共108頁,2024年2月25日,星期天10 publicStringgetName(){ returnname; } publicintgetEng(){ returneng; } publicintgetMath(){ returnmath; } publicintgetComp(){ returncomp; } publicintgetSum(){ returnsum; }
voidsum(){ this.sum=eng+math+comp; }
7.1.1用數(shù)組存儲(chǔ)對象(續(xù))
——例7_1對象數(shù)組第10頁,共108頁,2024年2月25日,星期天11 publicStringtoString(){ returngetId()+"\t"+getName()+"\t"+getEng()+ "\t"+getMath()+"\t"+getComp()+"\t"+getSum(); } publicbooleanequals(Objectx){ if(this.getClass()!=x.getClass())returnfalse; Studentb=(Student)x; return(this.getId().equals(b.getId())); } //比較成績大小,當(dāng)前對象成績比參數(shù)對象成績大時(shí)返回1,相等時(shí)返回0,其它返回-1.
publicintcompare(StudentA){ if(this.getSum()>A.getSum())return1; elseif(this.getSum()==A.getSum())return0; elsereturn-1; } }7.1.1用數(shù)組存儲(chǔ)對象(續(xù))
——例7_1對象數(shù)組第11頁,共108頁,2024年2月25日,星期天12下面聲明班級類StudentClass:屬性包括班級名稱(name),容量(capacity),學(xué)生(students),實(shí)際人數(shù)(size)。方法包括構(gòu)造方法,get方法,set方法,toString方法。publicclassStudentClass{ privateStringname;//班級名稱
staticintcapacity=40;//最大容量
privateStudentstudents[];//學(xué)生
privateintsize;//實(shí)際人數(shù)
7.1.1用數(shù)組存儲(chǔ)對象(續(xù))
——例7_1對象數(shù)組第12頁,共108頁,2024年2月25日,星期天13
publicStudentClass(Stringname,intsize){ =name; this.size=size; students=newStudent[capacity]; } publicStringgetName(){ returnname; }publicintgetCapacity(){ returncapacity; } publicStudent[]getStudents(){ returnstudents; } 7.1.1用數(shù)組存儲(chǔ)對象(續(xù))
——例7_1對象數(shù)組第13頁,共108頁,2024年2月25日,星期天14 publicintgetSize(){ returnsize; } publicvoidsetName(Stringname){ =name; }publicvoidsetCapacity(intcapacity){ this.capacity=capacity; } publicvoidsetSize(intsize){ this.size=size; } publicvoidsetStudents(Student[]students){ for(inti=0;i<size;i++) this.students[i]=newStudent(students[i]); }
7.1.1用數(shù)組存儲(chǔ)對象(續(xù))
——例7_1對象數(shù)組第14頁,共108頁,2024年2月25日,星期天15 publicStringtoString(){ Strings; s="班級:"+name+"\t"+"容量:"+capacity+"\t"+ "實(shí)際人數(shù):"+size+"\n\n"; s=s+“學(xué)號(hào)”+“\t”+“姓名”+“\t”+“英語”+“\t”+“數(shù)學(xué)”+“\t” +“計(jì)算機(jī)”+"\t"+"總成績\n"; for(inti=0;i<size;i++) s=s+students[i].getId()+"\t"+students[i].getName()+"\t" +students[i].getEng()+"\t"+students[i].getMath()+"\t" +students[i].getComp()+"\t"+students[i].getSum()+"\n"; returns; }}7.1.1用數(shù)組存儲(chǔ)對象(續(xù))
——例7_1對象數(shù)組第15頁,共108頁,2024年2月25日,星期天16下面聲明測試類Tester1(其中Keyboard類的聲明見第3章例3-12),為測試簡單,僅生成具有5名學(xué)生的班級,5名學(xué)生的信息從鍵盤輸入,為了避免以后再重復(fù)輸入,可將輸入的學(xué)生信息保存到文件中importjava.io.*;publicclassTester1{ publicstaticvoidmain(Stringargs[]){ Studentstudents[]; StudentClassaClass=newStudentClass("軟件0201",5); students=newStudent[5]; for(inti=0;i<5;i++) students[i]=newStudent(getAStudent(i+1)); aClass.setStudents(students); System.out.println(aClass);
7.1.1用數(shù)組存儲(chǔ)對象(續(xù))
——例7_1對象數(shù)組第16頁,共108頁,2024年2月25日,星期天17 //將學(xué)生信息保存到文件stu.ser中。
try{ FileOutputStreamfo=newFileOutputStream("stu.ser");ObjectOutputStreamso=newObjectOutputStream(fo);for(inti=0;i<5;i++)so.writeObject(students[i]);so.close();}catch(Exceptione){System.out.println(e);} }
7.1.1用數(shù)組存儲(chǔ)對象(續(xù))
——例7_1對象數(shù)組第17頁,共108頁,2024年2月25日,星期天18 publicstaticStudentgetAStudent(inti){ Studentstudenti; System.out.println("輸入第"+i+"個(gè)學(xué)生的信息:");
System.out.print("學(xué)號(hào):");
Stringid=Keyboard.getString(); System.out.print("姓名:");
Stringname=Keyboard.getString(); System.out.print("英語成績:");
inteng=Keyboard.getInteger(); System.out.print("數(shù)學(xué)成績:");
intmath=Keyboard.getInteger(); System.out.print("計(jì)算機(jī)成績:");
intcomp=Keyboard.getInteger(); studenti=newStudent(id,name,eng,math,comp); returnstudenti; }}7.1.1用數(shù)組存儲(chǔ)對象(續(xù))
——例7_1對象數(shù)組第18頁,共108頁,2024年2月25日,星期天19運(yùn)行結(jié)果如下(其中學(xué)生信息的輸入只顯示一部分):輸入第1個(gè)學(xué)生的信息:學(xué)號(hào):250201姓名:李紅英語成績:88數(shù)學(xué)成績:76計(jì)算機(jī)成績:60輸入第2個(gè)學(xué)生的信息:……班級:軟件0201容量:40實(shí)際人數(shù):5學(xué)號(hào)姓名英語數(shù)學(xué)計(jì)算機(jī)總成績250201李紅887660224250202張林786780225250203董玉梅868075241250204張力706875213250205何為8090782487.1.1用數(shù)組存儲(chǔ)對象(續(xù))
——例7_1運(yùn)行結(jié)果對象數(shù)組第19頁,共108頁,2024年2月25日,星期天20查找也稱為檢索,就是從一組數(shù)據(jù)中找出所需的具有某種特征的數(shù)據(jù)項(xiàng)順序查找對所存儲(chǔ)的數(shù)據(jù)從第一項(xiàng)開始(也可以從最后一項(xiàng)開始),依次與所要查找的數(shù)據(jù)進(jìn)行比較,直到找到該數(shù)據(jù)或?qū)⑷吭囟颊彝赀€沒有找到該數(shù)據(jù)為止7.1.1用數(shù)組存儲(chǔ)對象(續(xù))
——為班級類添加查找方法對象數(shù)組第20頁,共108頁,2024年2月25日,星期天21已知學(xué)生的學(xué)號(hào),查找此學(xué)生是否存在。如果存在,返回其在數(shù)組中的下標(biāo)位置;如果不存在,返回-1。順序查找方法的代碼如下publicintfind(Stringid){ for(inti=0;i<size;i++) if(students[i].getId().equals(id))returni; return-1;}7.1.1用數(shù)組存儲(chǔ)對象(續(xù))
——為班級類添加查找方法對象數(shù)組第21頁,共108頁,2024年2月25日,星期天22在數(shù)組的末尾增加一個(gè)學(xué)生對象增加之前需先判斷數(shù)組中是否還有空間,并且在數(shù)組中查找將要增加的學(xué)號(hào)是否已經(jīng)存在增加成功,返回true;否則,返回false
publicbooleanadd(StudentaStudent){ if(size==capacity)returnfalse;if(find(aStudent.getId())>=0)returnfalse;this.students[size]=newStudent(newString(aStudent.getId()),newString(aStudent.getName()),aStudent.getEng(),aStudent.getMath(),aStudent.getComp()); size++; returntrue; }7.1.1用數(shù)組存儲(chǔ)對象(續(xù))
——為班級類添加增加方法對象數(shù)組第22頁,共108頁,2024年2月25日,星期天23已知一個(gè)Student對象,將此對象從數(shù)組中刪除
publicbooleandel(StudentaStudent){ intpos=find(aStudent.getId()); if(pos==-1)returnfalse; for(inti=pos+1;i<size;i++) students[i-1]=students[i]; size--; returntrue; } 7.1.1用數(shù)組存儲(chǔ)對象(續(xù))
——為班級類編寫刪除方法對象數(shù)組第23頁,共108頁,2024年2月25日,星期天24已知學(xué)號(hào),刪除一個(gè)學(xué)生
publicbooleandel(Stringid){ intpos=find(id); if(pos==-1)returnfalse; for(inti=pos+1;i<size;i++) students[i-1]=students[i]; size--; returntrue; } 7.1.1用數(shù)組存儲(chǔ)對象(續(xù))
——為班級類添加刪除方法對象數(shù)組第24頁,共108頁,2024年2月25日,星期天257.1.2對數(shù)組元素進(jìn)行排序排序按照預(yù)先規(guī)定的準(zhǔn)則(如升序或降序等),把數(shù)據(jù)有次序地排列起來已經(jīng)設(shè)計(jì)出許多排序算法,常用的排序算法有選擇排序插入排序交換排序以降序?yàn)槔M(jìn)行介紹對象數(shù)組第25頁,共108頁,2024年2月25日,星期天26選擇排序的基本思想先在未排序序列中選一個(gè)最小元素,作為已排序子序列然后再重復(fù)地從未排序子序列中選取一個(gè)最小元素,把它加到已經(jīng)排序的序列中,作為已排序子序列的最后一個(gè)元素直到把未排序子序列中的元素處理完為止7.1.2對數(shù)組元素進(jìn)行排序(續(xù))
——選擇排序?qū)ο髷?shù)組第26頁,共108頁,2024年2月25日,星期天27用選擇排序方法將例7-1中生成的文件stu.ser中的班級學(xué)生按總成績從高到低排序在例7-1中的StudentClass類中增加選擇排序方法selectionSort,代碼如下publicvoidselectionSort(){ Studenttemp; for(inti=0;i<size-1;i++) for(intj=i+1;j<size;j++) if(students[j].compare(students[i])>0){ temp=students[i]; students[i]=students[j]; students[j]=temp; }}7.1.2對數(shù)組元素進(jìn)行排序(續(xù))
——例7_2對象數(shù)組第27頁,共108頁,2024年2月25日,星期天28測試類代碼如下importjava.io.*;publicclassSortTester{ publicstaticvoidmain(Stringargs[]){ Studentstudents[]=newStudent[5]; //從文件stu.ser中讀出學(xué)生信息
try{ FileInputStreamfi=newFileInputStream("stu.ser");ObjectInputStreamsi=newObjectInputStream(fi);for(inti=0;i<5;i++) students[i]=(Student)si.readObject();si.close();} catch(Exceptione){ System.out.println(e); }
7.1.2對數(shù)組元素進(jìn)行排序(續(xù))
——例7_2對象數(shù)組第28頁,共108頁,2024年2月25日,星期天29 StudentClassaClass=newStudentClass("軟件0201",5);
aClass.setStudents(students); System.out.println(aClass); //選擇排序
aClass.selectionSort(); System.out.println("選擇排序后的結(jié)果:\n"); System.out.println(aClass); }}7.1.2對數(shù)組元素進(jìn)行排序(續(xù))
——例7_2對象數(shù)組第29頁,共108頁,2024年2月25日,星期天30運(yùn)行結(jié)果班級:軟件0201容量:40實(shí)際人數(shù):5學(xué)號(hào)姓名英語數(shù)學(xué)計(jì)算機(jī)總成績250201李紅887660224250202張林786780225250203董玉梅868075241250204張力706875213250205何為809078248選擇排序后的結(jié)果:班級:軟件0201容量:40實(shí)際人數(shù):5學(xué)號(hào)姓名英語數(shù)學(xué)計(jì)算機(jī)總成績250205何為809078248250203董玉梅868075241250202張林786780225250201李紅887660224250204張力7068752137.1.2對數(shù)組元素進(jìn)行排序(續(xù))
——例7_2運(yùn)行結(jié)果對象數(shù)組第30頁,共108頁,2024年2月25日,星期天31插入排序?qū)⒋判虻臄?shù)據(jù)按一定的規(guī)則逐一插入到已排序序列中的合適位置處,直到將全部數(shù)據(jù)都插入為止插入的規(guī)則不同,便形成了不同的插入排序方法。其中,算法最簡單的為直接插入排序方法直接插入排序方法先以未排序序列的第一個(gè)元素作為已排序子序列,然后從原來的第二個(gè)元素起,將各元素逐一插入到已排序子序列中合適的位置,直到把全部元素都插入為止。7.1.2對數(shù)組元素進(jìn)行排序(續(xù))
——插入排序?qū)ο髷?shù)組第31頁,共108頁,2024年2月25日,星期天32直接插入排序的步驟假設(shè)數(shù)組a中有n個(gè)元素a[0]、a[1]、……、a[n-1]首先要把a(bǔ)[0]作為已排序子序列。然后逐一將a[1]、a[2]、……、a[n-1]插入到已排序子序列中。每插入一個(gè)元素a[i]都要執(zhí)行如下兩步操作:第一步,在已排序子序列中找一個(gè)合適位置j,使a[j]>a[i]>a[j+1]。第二步,將a[i]插入到a[j]之后。在插入之前,需要先保存a[i]的值,之后將a[j+1]、……、a[n-1]依次向后移一位(后移操作也可在第一步的查找過程中進(jìn)行)7.1.2對數(shù)組元素進(jìn)行排序(續(xù))
——直接插入排序?qū)ο髷?shù)組第32頁,共108頁,2024年2月25日,星期天33在StudentClass中增加直接插入排序方法insertSort,代碼如下publicvoidinsertSort(){ Studenttemp; for(inti=1;i<size;i++){ temp=students[i]; intj=i-1; while(j>-1&&pare(students[j])>0){ students[j+1]=students[j]; j--; } students[j+1]=temp; } }7.1.2對數(shù)組元素進(jìn)行排序(續(xù))
——例7_3對象數(shù)組第33頁,共108頁,2024年2月25日,星期天347.1.3在已排序的數(shù)組中查找一批Integer類型的數(shù)據(jù)已按升序排列好,a1<a2<…<an,存儲(chǔ)在數(shù)組a[0]、a[1]、……、a[n-1]中,現(xiàn)在要對該數(shù)組進(jìn)行查找,看給定的數(shù)據(jù)x是否在此數(shù)組中順序查找方法按從左向右的順序查找,當(dāng)x小于a[i]時(shí)就應(yīng)該停止查找publicintseqSearch(intx){for(inti=0;(i<n)&&(x>=a[i].intValue());i++)if(a[i].intValue()==x)returni;return-1;}二分查找。在0到n-1中間選一個(gè)正整數(shù)k,用k把原來的有序序列分為三個(gè)有序子序列:a[0],a[1],…,a[k-1]a[k]a[k+1],a[k+2],…,a[n-1]對象數(shù)組第34頁,共108頁,2024年2月25日,星期天35具有排序數(shù)組的類SortedIntArraysearch方法運(yùn)用二分查找算法:在給定的數(shù)組范圍內(nèi)查找某一元素,如果存在,返回元素所在的下標(biāo)位置,如果不存在,則返回元素應(yīng)該在的位置(如果要將此元素插入到數(shù)組中,且保持?jǐn)?shù)組仍然有序的位置)將此功能與插入功能相結(jié)合,可實(shí)現(xiàn)對數(shù)組元素進(jìn)行排序publicclassSortedIntArray{ privateintcapacity; privateInteger[]rep; privateintsize;
publicSortedIntArray(intn){ capacity=n; rep=newInteger[capacity]; }
7.1.3在已排序的數(shù)組中查找(續(xù))
——例7_4對象數(shù)組第35頁,共108頁,2024年2月25日,星期天36publicSortedIntArray(){this(100);}privateintsearch(inti,intlower,intupper){ intindex=lower; if(upper>=lower) { intmiddle=(upper+lower)/2; intcurrent=rep[middle].intValue(); if(current==i){ index=middle; } elseif(current<i){ index=search(i,middle+1,upper); } else{index=search(i,lower,middle-1);} } returnindex;}7.1.3在已排序的數(shù)組中查找(續(xù))
——例7_4對象數(shù)組第36頁,共108頁,2024年2月25日,星期天37publicintsearch(inti) { returnsearch(i,0,size-1);}publicSortedIntArrayinsert(inti){ Intindex=search(i); for(intj=size;j>index;--j){rep[j]=rep[j-1];} rep[index]=newInteger(i); ++size; returnthis;}publicSortedIntArrayremove(inti){ intindex=search(i); if(rep[index].intValue()==i){ --size; for(intj=index;j<size;++j){rep[j]=rep[j+1];} } returnthis;}7.1.3在已排序的數(shù)組中查找(續(xù))
——例7_4對象數(shù)組第37頁,共108頁,2024年2月25日,星期天38 publicStringtoString(){ StringtoReturn=""; for(inti=0;i<size;++i){toReturn+=rep[i].toString()+",";} returntoReturn; } staticpublicvoidmain(String[]args){ SortedIntArrayanArray=newSortedIntArray(); anArray.insert(4).insert(9).insert(7).insert(1).insert(3).insert(2).insert(8).insert(7); System.out.println(anArray); anArray.remove(1).remove(8).remove(7).remove(3); System.out.println(anArray); }}7.1.3在已排序的數(shù)組中查找(續(xù))
——例7_4對象數(shù)組第38頁,共108頁,2024年2月25日,星期天39運(yùn)行結(jié)果1,2,3,4,7,7,8,9,2,4,7,9,7.1.3在已排序的數(shù)組中查找(續(xù))
——例7_4運(yùn)行結(jié)果對象數(shù)組第39頁,共108頁,2024年2月25日,星期天407.3集合數(shù)組的優(yōu)點(diǎn)是Java提供的隨機(jī)訪問對象序列的最有效方法是一個(gè)簡單的線性序列,訪問元素的速度較快數(shù)組的缺點(diǎn)大小自創(chuàng)建以后就固定了,在其整個(gè)生存期內(nèi)其大小不可改變數(shù)組元素只能是同一類型集合可動(dòng)態(tài)改變其大小可在序列中存儲(chǔ)不同類型的數(shù)據(jù)第40頁,共108頁,2024年2月25日,星期天41集合把具有相同性質(zhì)的一類東西,匯聚成一個(gè)整體在Java2中有很多與集合有關(guān)的接口及類它們被組織在以Collection及Map接口為根的層次結(jié)構(gòu)中,稱為集合框架在Java2之前,在Java1.0/1.1中,沒有完整的集合框架。只有一些簡單的可以自擴(kuò)展的容器類VectorHashtable7.3集合(續(xù))集合第41頁,共108頁,2024年2月25日,星期天427.3.1Java集合框架集合框架(JavaCollectionsFramework)為表示和操作集合而規(guī)定的一種統(tǒng)一的標(biāo)準(zhǔn)的體系結(jié)構(gòu)提供了一些現(xiàn)成的數(shù)據(jù)結(jié)構(gòu)可供使用,程序員可以利用集合框架快速編寫代碼,并獲得優(yōu)良性能包含三大塊內(nèi)容對外的接口:表示集合的抽象數(shù)據(jù)類型,使集合的操作與表示分開接口的實(shí)現(xiàn):指實(shí)現(xiàn)集合接口的Java類,是可重用的數(shù)據(jù)結(jié)構(gòu)對集合運(yùn)算的算法:是指執(zhí)行運(yùn)算的方法,例如在集合上進(jìn)行查找和排序集合第42頁,共108頁,2024年2月25日,星期天43集合框架接口聲明了對各種集合類型執(zhí)行的一般操作包括Collection、Set、List、SortedSet、Map、SortedMap基本結(jié)構(gòu)如圖7.3.1Java集合框架(續(xù))
——對外的接口集合第43頁,共108頁,2024年2月25日,星期天44類層次如圖,包括4個(gè)接口、4個(gè)抽象類及6個(gè)具體類7.3.1Java集合框架(續(xù))
——Collection接口CollectionAbstractCollectionVectorArrayListStackListSetSortedSetAbstractSetAbstractListAbstractSequentialListHashSetTreeSetLinkedList集合第44頁,共108頁,2024年2月25日,星期天45Collection接口聲明了一組操作成批對象的抽象方法:查詢方法、修改方法查詢方法intsize()–返回集合對象中包含的元素個(gè)數(shù)booleanisEmpty()–判斷集合對象中是否還包含元素,如果沒有任何元素,則返回truebooleancontains(Objectobj)–判斷對象是否在集合中booleancontainsAll(Collectionc)–判斷方法的接收者對象是否包含集合中的所有元素7.3.1Java集合框架(續(xù))
——Collection接口集合第45頁,共108頁,2024年2月25日,星期天46修改方法包括booleanadd(Objectobj)–向集合中增加對象booleanaddAll(Collectionc)–將參數(shù)集合中的所有元素增加到接收者集合中booleanremove(Objectobj)–從集合中刪除對象booleanremoveAll(Collectionc)-將參數(shù)集合中的所有元素從接收者集合中刪除booleanretainAll(Collectionc)–在接收者集合中保留參數(shù)集合中的所有元素,其它元素都刪除voidclear()–刪除集合中的所有元素7.3.1Java集合框架(續(xù))
——Collection接口集合第46頁,共108頁,2024年2月25日,星期天47Set接口擴(kuò)展了Collection禁止重復(fù)的元素,是數(shù)學(xué)中“集合”的抽象對equals和hashCode操作有了更強(qiáng)的約定,如果兩個(gè)Set對象包含同樣的元素,二者便是相等的實(shí)現(xiàn)它的兩個(gè)主要類是哈希集合(HashSet)及樹集合(TreeSet)SortedSet接口一種特殊的Set其中的元素是升序排列的,還增加了與次序相關(guān)的操作通常用于存放詞匯表這樣的內(nèi)容7.3.1Java集合框架(續(xù))
——Set、SortedSet接口集合第47頁,共108頁,2024年2月25日,星期天48List接口擴(kuò)展了Collection可包含重復(fù)元素元素是有順序的,每個(gè)元素都有一個(gè)index值(從0開始)標(biāo)明元素在列表中的位置實(shí)現(xiàn)它的四個(gè)主要類是VectorArrayList:一種類似數(shù)組的形式進(jìn)行存儲(chǔ),因此它的隨機(jī)訪問速度極快LinkedList:內(nèi)部實(shí)現(xiàn)是鏈表,適合于在鏈表中間需要頻繁進(jìn)行插入和刪除操作棧Stack7.3.1Java集合框架(續(xù))
——List接口集合第48頁,共108頁,2024年2月25日,星期天49Map接口不是Collection接口的繼承用于維護(hù)鍵/值對(key/valuepairs)描述了從不重復(fù)的鍵到值的映射,是一個(gè)從關(guān)鍵字到值的映射對象其中不能有重復(fù)的關(guān)鍵字,每個(gè)關(guān)鍵字最多能夠映射到一個(gè)值SortedMap接口一種特殊的Map,其中的關(guān)鍵字是升序排列的與SortedSet對等的Map,通常用于詞典和電話目錄等
7.3.1Java集合框架(續(xù))
——Map、SortedMap接口集合第49頁,共108頁,2024年2月25日,星期天50接口的實(shí)現(xiàn)Collection沒有直接的實(shí)現(xiàn),只是作為其他集合接口的最小公分母除Collection以外,其余五個(gè)接口都有實(shí)現(xiàn)主要的實(shí)現(xiàn)有Set
HashSetSortedSet
TreeSetListVector/ArrayList/LinkedListMap
HashMapSortedMap
TreeMap7.3.1Java集合框架(續(xù))
——接口的實(shí)現(xiàn)集合第50頁,共108頁,2024年2月25日,星期天51對集合運(yùn)算的算法大多數(shù)算法都是用于操作List對象有兩個(gè)(min和max)可用于任意集合對象排序算法sort對List重新排序,使其中的元素按照某種次序關(guān)系升序排列有兩種形式簡單形式只是將元素按照自然次序排列第二種形式需要一個(gè)附加的Comparator對象作為參數(shù),用于規(guī)定比較規(guī)則,可用于實(shí)現(xiàn)反序或特殊次序排序7.3.1Java集合框架(續(xù))
——對集合運(yùn)算的算法集合第51頁,共108頁,2024年2月25日,星期天52洗牌算法shuffle其作用與排序算法恰好相反,它打亂List中的任何次序。也就是說以隨機(jī)方式重排元素,任何次序出現(xiàn)的幾率都是相等的在實(shí)現(xiàn)偶然性游戲的時(shí)候,這個(gè)算法很有用,例如洗牌常規(guī)數(shù)據(jù)處理算法reverse::將一個(gè)List中的元素反向排列fill:用指定的值覆寫List中的每一個(gè)元素,這個(gè)操作在重新初始化List時(shí)有用copy::接受兩個(gè)參數(shù),目標(biāo)List和源List,將源中的元素復(fù)制到目標(biāo),覆寫其中的內(nèi)容。目標(biāo)List必須至少與源一樣長,如果更長,則多余的部分內(nèi)容不受影響7.3.1Java集合框架(續(xù))
——對集合運(yùn)算的算法集合第52頁,共108頁,2024年2月25日,星期天53查找算法binarySearch使用二分法在一個(gè)有序的List中查找指定元素有兩種形式第一種形式假定List是按照自然順序升序排列的第二種形式需要增加一個(gè)Comparator對象,表示比較規(guī)則,并假定List是按照這種規(guī)則排序的。尋找最值——用于任何集合對象min和max算法返回指定集合中的最小值和最大值這兩個(gè)算法分別都有兩種形式簡單形式按照元素的自然順序返回最值另一種形式需要附加一個(gè)Comparator對象作為參數(shù),并按照Comparator對象指定的比較規(guī)則返回最值7.3.1Java集合框架(續(xù))
——對集合運(yùn)算的算法集合第53頁,共108頁,2024年2月25日,星期天54Arrays類Java集合框架提供了一套專門用于操作數(shù)組的實(shí)用方法,它們作為靜態(tài)方法存在該類中還包括可以將數(shù)組視為列表(List)的靜態(tài)工廠常用方法fill(type[]a,typeval):給數(shù)組填充,就是簡單地把一個(gè)數(shù)組全部或者某段數(shù)據(jù)填成一個(gè)特殊的值equals(type[]a,type[]b):實(shí)現(xiàn)兩個(gè)數(shù)組的比較,相等時(shí)返回truesort(type[]a):對數(shù)組排序binarySearch(
):對數(shù)組元素進(jìn)行二分法查找Arrays.asList(Object[]a):實(shí)現(xiàn)數(shù)組到ArrayList的轉(zhuǎn)換7.3.1Java集合框架(續(xù))
——數(shù)組實(shí)用方法集合第54頁,共108頁,2024年2月25日,星期天55數(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);}}JDK1.5,可使用Arrays.toString函數(shù)方便的顯示出數(shù)組的內(nèi)容7.3.1Java集合框架(續(xù))
——數(shù)組實(shí)用方法集合第55頁,共108頁,2024年2月25日,星期天56數(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 }}7.3.1Java集合框架(續(xù))
——數(shù)組實(shí)用方法集合第56頁,共108頁,2024年2月25日,星期天577.3.2向量(Vector,ArrayList)Vector/ArrayList實(shí)現(xiàn)了Collection接口的具體類能夠存儲(chǔ)任意對象,但通常情況下,這些不同類型的對象都具有相同的父類或接口不能存儲(chǔ)基本類型(primitive)的數(shù)據(jù),除非將這些數(shù)據(jù)包裹在包裹類中其容量能夠根據(jù)空間需要自動(dòng)擴(kuò)充增加元素方法的效率較高,除非空間已滿,在這種情況下,在增加之前需要先擴(kuò)充容量Vector方法是同步的,線程安全ArrayList方法是非同步的,效率較高集合第57頁,共108頁,2024年2月25日,星期天58Vector類的構(gòu)造方法VectormyVector=newVector();//初始容量為10VectormyVector=newVector(intcap);VectormyVector=newVector(Collectioncol);以參數(shù)col中的元素進(jìn)行初始化也可用數(shù)組元素生成,但需先將數(shù)組轉(zhuǎn)換成List對象,如String[]num={"one","two","three","four","five"};VectoraVector=newVector(java.util.Arrays.asList(num));ArrayList的構(gòu)造方法與Vector類似ArrayListmyList=newArrayList();ArrayListmyList=newArrayList(intcap);ArrayListmyList=newArrayList(Collectioncol);7.3.2向量(Vector,ArrayList)(續(xù))
——構(gòu)造方法集合第58頁,共108頁,2024年2月25日,星期天59本節(jié)所有常用方法如無特殊說明,為Vector,ArrayList類共有之方法voidadd(Objectobj)——添加一個(gè)對象,如VectorteamList=newVector();teamList.add("ZhangWei");teamList.add("LiHong");booleanaddAll(Collectioncol)——添加整個(gè)集合,如果接收者對象的結(jié)果有變化,則返回true,如VectorteamList=newVector();teamList.add("ZhangWei");teamList.add("LiHong");VectoryourList=newVector();yourList.addAll(teamList);
7.3.2向量(Vector,ArrayList)(續(xù))
——常用方法1集合第59頁,共108頁,2024年2月25日,星期天60intsize()——返回元素的個(gè)數(shù)。booleanisEmpty()——如果不含元素,則返回trueObjectget(intpos)——返回指定位置的元素,如VectorteamList=newVector();teamList.add("ZhangWei");teamList.add("LiHong");teamList.add("YuHongshu");teamList.get(1);//返回"LiHong"teamList.get(3);//產(chǎn)生例外ArrayIndexOutOfBoundsException集合7.3.2向量(Vector,ArrayList)(續(xù))
——常用方法2第60頁,共108頁,2024年2月25日,星期天61voidset(intpos,Objectobj)——用參數(shù)對象替換指定位置的對象,如VectorteamList=newVector();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)生例外ArrayIndexOutOfBoundsException集合7.3.2向量(Vector,ArrayList)(續(xù))
——常用方法3第61頁,共108頁,2024年2月25日,星期天62booleanremove(Objectobj)——去除給定對象的第一次出現(xiàn),如果找到了對象,則返回true。去除一個(gè)對象后,其后面的所有對象都依次向前移動(dòng)。如VectorteamList=newVector();
teamList.add("ZhangWei");
teamList.add("LiHong");teamList.add("YuHongshu");teamList.remove("LiHong");teamList.remove("WangHong");//不做任何事,也不出現(xiàn)錯(cuò)誤System.out.println(teamList);//顯示[ZhangWei,YuHongshu]集合7.3.2向量(Vector,ArrayList)(續(xù))
——常用方法4第62頁,共108頁,2024年2月25日,星期天63Objectremove(intpos)——去除給定位置的元素,并返回被去除的對象。如VectorteamList=newVector();
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)生例外ArrayIndexOutOfBoundsException集合7.3.2向量(Vector,ArrayList)(續(xù))
——常用方法5第63頁,共108頁,2024年2月25日,星期天64booleanremoveAll(Collectioncol)——從接收者對象中去除所有在參數(shù)對象中出現(xiàn)的元素,如果接收者對象的結(jié)果有變化,則返回true。如VectorteamList=newVector();
teamList.add("ZhangWei");
teamList.add("LiHong");teamList.add("YuHongshu");VectoryourList=newVector();
yourList.add("YuHongshu");
yourList.add("HeLi");yourList.add("ZhangWei");teamList.removeAll(yourList);
System.out.println(teamList);//顯示[LiHong]集合7.3.2向量(Vector,ArrayList)(續(xù))
——常用方法6第64頁,共108頁,2024年2月25日,星期天65voidclear()——去除所有的元素booleancontains(Objectobj)——返回是否包含指定的對象,如果包含則返回true;否則,返回falsebooleancontainsAll(Collectioncol)——返回是否包含參數(shù)col中的所有對象intindexOf(Objectobj)——返回給定對象在Vector/ArrayList中第一次出現(xiàn)的位置,如不存在,則返回-1。如VectorteamList=newVector();
teamList.add("ZhangWei");
teamList.add("LiHong");teamList.indexOf("LiHong");//返回1。teamList.indexOf("ZhangLi");//返回-1。集合7.3.2向量(Vector,ArrayList)(續(xù))
——常用方法7第65頁,共108頁,2024年2月25日,星期天66Enumerationelements()——返回包含Vector中所有元素的Enumeration類對象。該方法只能應(yīng)用于Vector對象,不能應(yīng)用于ArrayList對象。如VectorteamList=newVector();
teamList.add("ZhangWei");
teamList.add("LiHong");teamList.add("YuHongshu");teamList.elements();//返回Enumeration類對象。Iteratoriterator()——返回包含Vector/ArrayList中所有元素的Iterator類對象集合7.3.2向量(Vector,ArrayList)(續(xù))
——常用方法8第66頁,共108頁,2024年2月25日,星期天67當(dāng)使用get()方法取出Vector中的元素時(shí),返回的類型都是Object類型。Vector的使用者需要記住存入對象的具體類型,當(dāng)使用get()方法取出后,再塑型成其本來的類型。例如,創(chuàng)建Customer類對象的Vector如下:String[]
names={"Zhang","Li","Wang","Zhao"};Vectorv=newVector();for(inti=0;i<names.length;i++){
Customerc=newCustomer();
c.setName(names[i]);
v.add(c);}使用get()方法將Customer對象從Vector中取出后,需要再塑型成Customer類。代碼如下:for(inti=0;i<v.size();i++){
Customerc=(Customer)v.get(i);
System.out.println(c.getName());}7.3.2向量(Vector,ArrayList)(續(xù))
——使用Vector存取對象集合第67頁,共108頁,2024年2月25日,星期天68與所有的集合類一樣,Vector不能存儲(chǔ)原始類型(primitive)的數(shù)據(jù),如果要存儲(chǔ),則需要使用包裹類。例如,VectorrateVector=newVector();double[]
rates={36.25,25.4,18.34,35.7,23.78};for(inti=0;i<rates.length;i++)
rateVector.add(newDouble(rates[i]));當(dāng)從Vector中取出時(shí),需要塑型成相應(yīng)的包裹類型,之后再還原為原始類型。代碼如下:doublesum=0.0;for(inti=0;i<rateVector.size();i++)
sum+=((Double)rateVector.get(i)).doubleValue();returnsum;7.3.2向量(Vector,ArrayList)(續(xù))
——使用Vector存取數(shù)據(jù)集合第68頁,共108頁,2024年2月25日,星期天697.3.3Enumeration及Iterator接口集合類對象中每個(gè)元素的遍歷方法for(inti=0;i<v.size();i++){
Customerc=(Customer)v.get(i);
System.out.println(c.getName());}Enumeration/Iterator能夠從集合類對象中提取每一個(gè)元素,并提供了用于遍歷元素的方法Java中的許多方法(如elements())都返回Enumeration類型的對象,而不是返回集合類對象Enumeration接口不能用于ArrayList對
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 福建省南平市武夷山第二中學(xué)2021年高三物理上學(xué)期期末試卷含解析
- 個(gè)人車位買賣協(xié)議書模板
- 2024廣告裝飾工程合作合同典范版B版
- 1假期有收獲 說課稿-2024-2025學(xué)年道德與法治二年級上冊統(tǒng)編版
- 汽車設(shè)計(jì)的創(chuàng)新之路
- 科技驅(qū)動(dòng)的環(huán)保革新
- 外出經(jīng)營合同(2篇)
- 基礎(chǔ)設(shè)施合作投資協(xié)議書(2篇)
- 2024年網(wǎng)絡(luò)平臺(tái)蔬菜水果銷售合同3篇
- 15-1《諫太宗十思疏》說課稿 2023-2024學(xué)年統(tǒng)編版高中語文必修下冊
- 2025年中國AI AGENT(人工智能體)行業(yè)市場動(dòng)態(tài)分析、發(fā)展方向及投資前景分析報(bào)告
- 家居建材行業(yè)綠色材料應(yīng)用及節(jié)能設(shè)計(jì)方
- 大慶市2025屆高三年級第二次教學(xué)質(zhì)量檢測(二模)政治試卷(含答案)
- 2024年中國玩具工程車市場調(diào)查研究報(bào)告
- 2025年內(nèi)蒙古阿拉善額濟(jì)納旗事業(yè)單位引進(jìn)48人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025-2030年中國電動(dòng)三輪車市場發(fā)展現(xiàn)狀及前景趨勢分析報(bào)告
- TCABEE 063-2024 建筑光儲(chǔ)直柔系統(tǒng)變換器 通 用技術(shù)要求
- 【9化期末】合肥市廬陽區(qū)2023-2024學(xué)年九年級上學(xué)期期末化學(xué)試題
- 高一下學(xué)期生物人教版必修二:3.4 基因通常是有遺傳效應(yīng)的DNA片段課件
- 雅禮中學(xué)2024-2025學(xué)年初三創(chuàng)新人才選拔數(shù)學(xué)試題及答案
- 下屬企業(yè)考核報(bào)告范文
評論
0/150
提交評論