第08章集合框架_第1頁
第08章集合框架_第2頁
第08章集合框架_第3頁
第08章集合框架_第4頁
第08章集合框架_第5頁
已閱讀5頁,還剩77頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第八章集合框架授課講師:顏鵬飛本章概述集合也稱容器,是裝在一組對象的容器,集合框架用來表示和操作集合的一組接口與類。如數(shù)組、列表和隊列等。集合框架中的常用接口1.java.util.Collection:Collection表示一組對象,這些對象也稱為collection的元素。一些collection允許有重復(fù)的元素,而另一些則不允許。一些collection是有序的,而另一些則是無序的。JDK不提供此接口的任何直接實現(xiàn):它提供更具體的子接口(如Set和List)實現(xiàn)。;2.java.util.List:繼承Collection,允許重復(fù),以元素安插的次序來放置元素(以元素安插的次序來放置元素:放進去什么樣,里邊的結(jié)構(gòu)就是什么樣),不會重新排列;3.java.util.Set:繼承Collcetion,但是不允許重復(fù),使用自己內(nèi)部的一個排列機制。4.Map:是一組成對的鍵--值對象,既所持有的是Key-value對。Map中不能有重復(fù)的Key,擁有自己的內(nèi)部排列機制學(xué)習(xí)集合框架的思路:如何添加元素、如何獲得元素、如何刪除元素、如何遍歷元素。本章目標(biāo)對象數(shù)組集合集合框架(Collection接口,Map接口)Arrays類集合框架接口實現(xiàn)泛型1對象數(shù)組在Java提供的存儲及隨機訪問對象序列的各種方法中,數(shù)組是效率最高的一種。對象數(shù)組數(shù)組元素是類的對象所有元素具有相同的類型每個元素都是一個對象的引用1.1對象數(shù)組初始化1.靜態(tài)初始化:在聲明和定義數(shù)組的同時對數(shù)組元素進行初始化,例如:BankAccount[]accounts={newBankAccount(“Zhang",100.00),newBankAccount(“Li",2380.00),newBankAccount(“Wang",500.00),newBankAccount(“Liu",175.56),newBankAccount(“Ma",924.02)};2.動態(tài)初始化:使用運算符new,需要經(jīng)過兩步:首先給數(shù)組分配空間typearrayName[]=newtype[arraySize];然后給每一個數(shù)組元素分配空間arrayName[0]=newtype(paramList);1.2示例:對象數(shù)組(一)示例:使用數(shù)組存儲一個班的學(xué)生信息及考試成績。學(xué)生信息包括學(xué)號、姓名、二門課(日語、Java)的成績及總成績。分析:1.聲明學(xué)生類Student屬性包括學(xué)號(id),姓名(name),日語成績(japScore),java成績(javaScore),總成績(sum)方法包括構(gòu)造方法,get方法,set方法,toString方法,equals方法,compare方法(比較兩個學(xué)生的總成績,結(jié)果分大于,小于,等于),sumScore方法(計算總成績)1.2示例:對象數(shù)組(二)2.聲明學(xué)生班級類StudentClass屬性包括班級名稱(name),容量(capacity),學(xué)生(students),實際人數(shù)(size)。方法包括構(gòu)造方法,get方法,set方法,toString方法。1.2.1示例:學(xué)生類Student(一)publicclassStudent{ privateStringid; privateStringname; privateintjapScore;//日語成績 privateintjavaScore;//java成績 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(三)//重寫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示例:班級類StudentClass(一)publicclassStudentClass{ privateStringname;//班級名稱 privateintcapacity=40;//班級容量 privateStudentstudents[];//學(xué)生 privateintsize;//實際人數(shù)

publicStudentClass(Stringname,intsize){ =name; this.size=size; students=newStudent[capacity]; }1.2.2示例:班級類StudentClass(二)publicvoidsetName(Stringname){ =name;}publicStringgetName(){ returnname;}publicvoidsetStudent(Student[]students){ for(inti=0;i<size;i++){ this.students[i]=students[i]; }}…………..1.2.2示例:班級類StudentClass(三)publicStringtoString(){ Stringresult; result="班級:"+name+"\t"+"容量:"+capacity+"\t"+"實際人數(shù):"+size+"\n\n"; result+="學(xué)號"+"\t"+"姓名"+"\t"+"日語成績"+"\t"+"Java成績"+"\t"+"總成績"+"\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示例:測試類(一)publicstaticvoidmain(String[]args){ Studentstudents[]; StudentClasssClass=newStudentClass("對日軟件開發(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示例:測試類(二)publicstaticStudentgetStudent(inti){ Scannerscanner=newScanner(System.in); Studentstudent; System.out.println("輸入第"+i+"個學(xué)生信息"); System.out.println("學(xué)號:"); Stringid=scanner.nextLine();//讀取鍵盤輸入的一行(以回車換行為結(jié)束輸入) System.out.println("姓名:"); Stringname=scanner.nextLine(); System.out.println("日語成績:"); intjapScore=scanner.nextInt(); System.out.println("Java成績:"); intjavaScore=scanner.nextInt(); student=newStudent(id,name,japScore,javaScore); returnstudent; }1.3.1對象數(shù)組--查找方法查找也稱為檢索,就是從一組數(shù)據(jù)中找出所需的具有某種特征的數(shù)據(jù)項。順序查找對所存儲的數(shù)據(jù)從第一項開始(也可以從最后一項開始),依次與所要查找的數(shù)據(jù)進行比較,直到找到該數(shù)據(jù)或?qū)⑷吭囟颊彝赀€沒有找到該數(shù)據(jù)為止。示例:已知學(xué)生的學(xué)號,查找此學(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對象數(shù)組--增加方法在數(shù)組的末尾增加一個學(xué)生對象。增加之前需先判斷數(shù)組中是否還有空間,并且在數(shù)組中查找將要增加的學(xué)號是否已經(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對象數(shù)組—刪除方法(一)1.已知一個Student對象,將此對象從數(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對象數(shù)組—刪除方法(二)2.已知學(xué)號,刪除一個學(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對象數(shù)組—排序1.用選擇排序方法按總成績從高到低排序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對象數(shù)組—排序排序前:班級:對日軟件開發(fā)班容量:40實際人數(shù):5學(xué)號姓名日語成績Java成績總成績001張三8790177002李四7865143003王五8664150004趙六9080170005田七4980129排序后:學(xué)號 姓名 日語成績Java成績 總成績001 張三 87 90 177004 趙六 90 80 170006 King 78 89 167003 王五 86 64 150002 李四 78 65 143005 田七 49 80 1292集合集合把具有相同性質(zhì)的一類東西,匯聚成一個整體。在Java2中有很多與集合有關(guān)的接口及類。它們被組織在以Collection及Map接口為根的層次結(jié)構(gòu)中,稱為集合框架。在Java2之前,在Java1.0/1.1中,沒有完整的集合框架。只有一些簡單的可以自擴展的容器類VectorHashtable2.1為什么使用集合數(shù)組的優(yōu)點是Java提供的隨機訪問對象序列的最有效方法。是一個簡單的線性序列,訪問元素的速度較快。數(shù)組的缺點大小自創(chuàng)建以后就固定了,在其整個生存期內(nèi)其大小不可改變。數(shù)組元素只能是同一類型。集合可動態(tài)改變其大小??稍谛蛄兄写鎯Σ煌愋偷臄?shù)據(jù)。3Java集合框架集合框架(JavaCollectionsFramework)為表示和操作集合而規(guī)定的一種統(tǒng)一的標(biāo)準(zhǔn)的體系結(jié)構(gòu)。提供了一些現(xiàn)成的數(shù)據(jù)結(jié)構(gòu)可供使用,程序員可以利用集合框架快速編寫代碼,并獲得優(yōu)良性能。包含三大塊內(nèi)容對外的接口:表示集合的抽象數(shù)據(jù)類型,使集合的操作與表示分開。接口的實現(xiàn):指實現(xiàn)集合接口的Java類,是可重用的數(shù)據(jù)結(jié)構(gòu)。對集合運算的算法:是指執(zhí)行運算的方法,例如在集合上進行查找和排序。3.1Java集合框架(續(xù))——對外的接口集合框架接口聲明了對各種集合類型執(zhí)行的一般操作。包括Collection、Set、List、SortedSet、Map、SortedMap?;窘Y(jié)構(gòu)如圖:3.2Java集合框架——Collection接口包括4個接口、4個抽象類及6個具體類CollectionAbstractCollectionVectorArrayListStackListSetSortedSetAbstractSetAbstractListAbstractSequentialListHashSetTreeSetLinkedList3.2.1Java集合框架——Collection接口1.Collection接口聲明了一組操作成批對象的抽象方法:查詢方法、修改方法。查詢方法intsize()–返回集合對象中包含的元素個數(shù)。booleanisEmpty()–判斷集合對象中是否還包含元素,如果沒有任何元素,則返回true。booleancontains(Objectobj)–判斷對象是否在集合中。booleancontainsAll(Collectionc)–判斷方法的接收者對象是否包含集合中的所有元素。3.2.1Java集合框架——Collection接口(續(xù))修改方法包括booleanadd(Objectobj)–向集合中增加對象。booleanaddAll(Collectionc)–將參數(shù)集合中的所有元素增加到接收者集合中。booleanremove(Objectobj)–從集合中刪除對象。booleanremoveAll(Collectionc)-將參數(shù)集合中的所有元素從接收者集合中刪除。booleanretainAll(Collectionc)–在接收者集合中保留參數(shù)集合中的所有元素,其它元素都刪除。voidclear()–刪除集合中的所有元素。3.2.3Java集合框架——List接口2.List接口擴展了Collection可包含重復(fù)元素。元素是有順序的,每個元素都有一個index值(從0開始)標(biāo)明元素在列表中的位置。實現(xiàn)List接口的四個主要類是:Vector。ArrayList:一種類似數(shù)組的形式進行存儲,因此它的隨機訪問速度極快。LinkedList:內(nèi)部實現(xiàn)是鏈表,適合于在鏈表中間需要頻繁進行插入和刪除操作。棧Stack。3.2.2Java集合框架——Set、SortedSet接口3.Set接口擴展了Collection。禁止重復(fù)的元素,是數(shù)學(xué)中“集合”的抽象。對equals和hashCode操作有了更強的約定,如果兩個Set對象包含同樣的元素,二者便是相等的。實現(xiàn)它的兩個主要類是哈希集合(HashSet)及樹集合(TreeSet)。4.SortedSet接口一種特殊的Set。其中的元素是升序排列的,還增加了與次序相關(guān)的操作。通常用于存放詞匯表這樣的內(nèi)容。3.2.4Java集合框架——Map、SortedMap接口1.Map接口不是Collection接口的繼承。用于維護鍵/值對(key/valuepairs)。描述了從不重復(fù)的鍵到值的映射,是一個從關(guān)鍵字到值的映射對象。其中不能有重復(fù)的關(guān)鍵字,每個關(guān)鍵字最多能夠映射到一個值。2.SortedMap接口一種特殊的Map,其中的關(guān)鍵字是升序排列的。與SortedSet對等的Map,通常用于詞典和電話目錄等。3.2.5Java集合框架——接口實現(xiàn)類接口實現(xiàn)歷史集合類SetHashSetTreeSetListArrayListVectorLinkedListStackMapHashMapHashtableTreeMapProperties4.1Arrays類Arrays類Java集合框架提供了一套專門用于操作數(shù)組的實用方法,它們作為靜態(tài)方法存在該類中。常用方法fill(type[]a,typeval):給數(shù)組填充,就是簡單地把一個數(shù)組全部或者某段數(shù)據(jù)填成一個特殊的值。equals(type[]a,type[]b):實現(xiàn)兩個數(shù)組的比較,相等時返回true。sort(type[]a):對數(shù)組排序。binarySearch(

):對數(shù)組元素進行二分法查找。Arrays.asList(Object[]a):實現(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集合框架接口實現(xiàn)接口的實現(xiàn)Collection沒有直接的實現(xiàn),除Collection以外,其余五個接口都有實現(xiàn)。主要的實現(xiàn)有ListVector/ArrayList/LinkedListSetHashSetSortedSetTreeSetMapHashMapSortedMapTreeMap5.1Java集合框架--List接口實現(xiàn)List接口實現(xiàn)類:Vector/ArrayList/LinkedList能夠存儲任意對象,但通常情況下,這些不同類型的對象都具有相同的父類或接口。不能存儲基本類型(primitive)的數(shù)據(jù),除非將這些數(shù)據(jù)包裹在包裝類中。其容量能夠根據(jù)空間需要自動擴充。增加元素方法的效率較高,除非空間已滿,在這種情況下,在增加之前需要先擴充容量??梢栽贚ist中間插入和刪除元素。Vector:方法是同步的,線程安全。ArrayList/LinkedList:方法是非同步的,效率較高。5.1Java集合框架--List接口實現(xiàn)簡述實現(xiàn)操作特性List提供基于索引的對成員的隨機訪問ArrayList提供快速的基于索引的成員訪問,對尾部成員的增加和刪除支持較好LinkedList對列表中任何位置的成員的增加和刪除支持較好,但對基于索引的成員訪問支持性能較差5.1.1ArrayList類1.ArrayList類:動態(tài)數(shù)組,允許快速訪問元素,但是從中間插入和刪除元素的速度很慢。ArrayList的構(gòu)造方法ArrayListmyList=newArrayList();ArrayListmyList=newArrayList(intcap);ArrayListmyList=newArrayList(Collectioncol);5.1.1ArrayList類的方法(一)ArrayList類常用方法:(1).voidadd(Objectobj)——添加一個對象,如ArrayListteamList=newArrayList();teamList.add("ZhangWei");teamList.add("LiHong");(2).booleanaddAll(Collectioncol)——添加整個集合,如果接收者對象的結(jié)果有變化,則返回true,如ArrayListteamList=newArrayList();teamList.add("ZhangWei");teamList.add("LiHong");ArrayListlist=newArrayList();list.addAll(teamList);5.1.1ArrayList類的方法(二)(3).intsize()——返回元素的個數(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ù)對象替換指定位置的對象,如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)——去除給定對象的第一次出現(xiàn),如果找到了對象,則返回true。去除一個對象后,其后面的所有對象都依次向前移動。如ArrayListteamList=newArrayList();

teamList.add("ZhangWei");

teamList.add("LiHong");teamList.add("YuHongshu");teamList.remove("LiHong");teamList.remove("WangHong");//不做任何事,也不出現(xiàn)錯誤System.out.println(teamList);//顯示[ZhangWei,YuHongshu]5.1.1ArrayList類的方法(五)(8).Objectremove(intpos)——去除給定位置的元素,并返回被去除的對象。如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)——從接收者對象中去除所有在參數(shù)對象中出現(xiàn)的元素,如果接收者對象的結(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)——返回是否包含指定的對象,如果包含則返回true;否則,返回false(12).booleancontainsAll(Collectioncol)——返回是否包含參數(shù)col中的所有對象(13).intindexOf(Objectobj)——返回給定對象在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中的元素時,返回的類型都是Object類型。ArrayList的使用者需要記住存入對象的具體類型,當(dāng)使用get()方法取出后,再塑型成其本來的類型。使用get()方法將Customer對象從ArrayList中取出后,需要再塑型成Customer類。代碼如下:for(inti=0;i<v.size();i++){

Customerc=(Customer)v.get(i);

System.out.println(c.getName());}5.1.1Iterator迭代器迭代器(Iterator)本身就是一個對象,它的工作就是遍歷并選擇集合序列中的對象,而客戶端的程序員不必知道或關(guān)心該序列底層的結(jié)構(gòu)。此外,迭代器通常被稱為.輕量級.對象,創(chuàng)建它的代價小。Iterator接口(1.2版,替代Enumeration)是一個遍歷集合元素的工具,是對Enumeration接口的改進,因此在遍歷集合元素時,優(yōu)先選用Iterator接口。與Enumeration不同,具有從正在遍歷的集合中去除對象的能力。具有如下三個實例方法,可見相對于Enumeration接口簡化了方法名:hasNext()

——判斷是否還有元素next()

——取得下一個元素remove()——去除一個元素。注意是從集合中去除最后調(diào)用next()返回的元素,而不是從Iterator類中去除5.1.1ListIterator迭代器ListIterator接口繼承Iterator接口以支持添加或更改底層集合中的元素,還支持雙向訪問。方法:hasNext()

——判斷后邊是否還有元素next()

——取得下一個元素remove()——去除一個元素。注意是從集合中去除最后調(diào)用next()返回的元素,而不是從Iterator類中去除add()——向List中添加對象set()——實現(xiàn)對象的修改hasPrevious()——判斷前邊是否還有元素5.1.1Iterator與ListIterator區(qū)別區(qū)別:1.ListIterator有add()方法,可以向List中添加對象,而Iterator不能。2.ListIterator和Iterator都有hasNext()和next()方法,可以實現(xiàn)順序向后遍歷,但是ListIterator有hasPrevious()和previous()方法,可以實現(xiàn)逆向(順序向前)遍歷。Iterator就不可以。3.ListIterator可以定位當(dāng)前的索引位置,nextIndex()和previousIndex()可以實現(xiàn)。Iterator沒有此功能。4.都可實現(xiàn)刪除對象,但是ListIterator可以實現(xiàn)對象的修改,set()方法可以實現(xiàn)。Iierator僅能遍歷,不能修改。因為ListIterator的這些功能,可以實現(xiàn)對LinkedList等List數(shù)據(jù)結(jié)構(gòu)的操作。一般情況下,我們使用Iterator就可以了,如果你需要進行記錄的前后反復(fù)檢索的話,你就可以使用ListIterator來擴展你的功能5.1.1案例:使用ArrayList類案例:電影DVD在線銷售系統(tǒng),它需要完成如下功能:1.能夠添加n個電影DVD對象,數(shù)量不確定,并且能夠、修改、刪除、查詢電影DVD信息。2.能夠獲取電影DVD對象的總數(shù)。3.能夠取出電影DVD對象并且逐條打印它的名稱。ArrayList類遍歷元素的效率比較高存儲方式如何選擇?元素個數(shù)不確定使用集合類需要遍歷元素存儲對象如何確定?類型:電影DVD對象屬性:電影ID、電影名稱、電影定價使用ArrayList類(一)第一步:確定集合中要存放的對象。publicclassMovie{privateintmovieId;//電影IdprivateStringmovieName;//電影名稱

privatedoubleprice;//電影定價

//構(gòu)造方法初始化對象

publicMovie(intmovieId,StringmovieName,doubleprice){ this.movieId=movieId; this.movieName=movieName; this.price=price;}//getter、setter方法……… }使用ArrayList類(二)第二步:操作集合中存放的對象。//顯示電影DVD列表publicstaticvoidshowMovieDvdList(){}//添加電影DVD信息publicstaticvoidaddMovieDvd(){}//修改電影DVD信息publicstaticvoideditMovieDvd(){}//修改電影DVD信息publicstaticvoiddeleteMovieDvd(){}//查詢電影DVD信息publicstaticvoidqueryMovieDvd(){}5.1.2LinkedList類LinkedList類是List接口的一個具體實現(xiàn)類。LinkedList類用于創(chuàng)建鏈表數(shù)據(jù)結(jié)構(gòu)。插入或者刪除元素時,它提供更好的性能。addFirst方法添加銷售冠軍電影DVD對象addLast方法添加銷售最后一名的電影DVD對象getFirst方法獲取銷售冠軍電影DVD對象getLast方法獲取銷售最后一名的電影DVD對象removeFirst方法刪除銷售冠軍電影DVDremoveLast方法刪除銷售最后一名的電影DVD案例:使用LinkedList類繼續(xù)分析案例:電影DVD在線銷售系統(tǒng)需要增加新的功能,如下:能夠添加銷售冠軍電影DVD對象能夠刪除銷售最后一名的電影DVD對象存儲方式如何選擇?元素個數(shù)不確定使用集合類需要在列表的頭或尾添加、刪除元素LinkedList提供額外的方法在列表的首部或尾部添加或刪除元素。案例:使用LinkedList類addFirst方法添加銷售冠軍電影DVD對象addLast方法添加銷售最后一名的電影DVD對象getFirst方法獲取銷售冠軍電影DVD對象getLast方法獲取銷售最后一名的電影DVD對象removeFirst方法刪除銷售冠軍電影DVDremoveLast方法刪除銷售最后一名的電影DVD5.2Java集合框架--Map接口實現(xiàn)Map接口以該接口為根的集合類,用于存儲“關(guān)鍵字”(key)和“值”(value)的元素對,其中每個關(guān)鍵字映射到一個值。當(dāng)需要通過關(guān)鍵字實現(xiàn)對值的快速存取時使用。聲明的抽象方法主要有查詢方法修改方法兩個主要實現(xiàn)類HashTable(1.0)HashMap(1.2)5.2Java集合框架--Map接口實現(xiàn)簡述實現(xiàn)操作特性成員要求Map保存鍵值對成員,基于鍵找值操作,使用compareTo或compare方法對鍵進行排序HashMap能滿足用戶對Map的通用需求鍵成員可為任意Object子類的對象,但如果覆蓋了equals方法,同時注意修改hashCode方法。TreeMap支持對鍵有序地遍歷,使用時建議先用HashMap增加和刪除成員,最后從HashMap生成TreeMap;附加實現(xiàn)SortedMap接口,支持子Map等要求順序的操作鍵成員要求實現(xiàn)Comparable接口,或者使用Comparator構(gòu)造TreeMap鍵成員一般為同一類型。LinkedHashMap保留鍵的插入順序,用equals方法檢查鍵和值的相等性成員可為任意Object子類的對象,但如果覆蓋了equals方法,同時注意修hashCode方法。5.2.1Java集合框架--查詢方法查詢方法intsize()——返回Map中的元素個數(shù)booleanisEmpty()——返回Map中是否包含元素,如不包括任何元素,則返回truebooleancontainsKey(Objectkey)——判斷給定的參數(shù)是否是Map中的一個關(guān)鍵字(key)booleancontainsValue(Objectval)——判斷給定的參數(shù)是否是Map中的一個值(value)Objectget(Objectkey)——返回Map中與給定關(guān)鍵字相關(guān)聯(lián)的值(value)Collectionvalues()——返回包含Map中所有值(value)的Collection對象SetkeySet()——返回包含Map中所有關(guān)鍵字(key)的Set對象SetentrySet()——返回包含Map中所有項的Set對象5.2.2Java集合框架--修改方法修改方法Objectput(Objectkey,Objectval)——將給定的關(guān)鍵字(key)/值(value)對加入到Map對象中。其中關(guān)鍵字(key)必須唯一,否則,新加入的值會取代Map對象中已有的值。voidputAll(Mapm)——將給定的參數(shù)Map中的所有項加入到接收者Map對象中。Objectremove(Objectkey)——將關(guān)鍵字為給定參數(shù)的項從Map對象中刪除。voidclear()——從Map對象中刪除所有的項。5.2.3Java集合框架Map接口實現(xiàn)

–HashTable,HashMap哈希表也稱為散列表,是用來存儲群體對象的集合類結(jié)構(gòu),其兩個常用的類是HashTable及HashMap。哈希表存儲對象的方式與前面所講的數(shù)組,Vector及ArrayList不同。數(shù)組,Vector及ArrayList中對象的存儲位置是隨機的,即對象本身與其存儲位置之間沒有必然的聯(lián)系。因此查找一個對象時,只能以某種順序(如順序查找,二分查找)與各個元素進行比較,如果數(shù)組或向量中的元素數(shù)量很龐大時,查找的效率必然降低。哈希表中,對象的存儲位置和對象的關(guān)鍵屬性k之間有一個特定的對應(yīng)關(guān)系f,我們稱之為哈希(Hash)函數(shù)。它使每個對象與一個唯一的存儲位置相對應(yīng)。因而在查找時,只要根據(jù)待查對象的關(guān)鍵屬性k,計算f(k)的值即可知其存儲位置。5.2.3Java集合框架Map接口實現(xiàn)

–HashTable,HashMap哈希表相關(guān)的一些主要概念容量(capacity)——哈希表的容量不是固定的,隨對象的加入,其容量可以自動擴充。關(guān)鍵字/鍵(key)——每個存儲的對象都需要有一個關(guān)鍵字key,key可以是對象本身,也可以是對象的一部分(如對象的某一個屬性)。哈希碼(hashcode)——要將對象存儲到HashTable,就需要將其關(guān)鍵字key映射到一個整型數(shù)據(jù),稱為key的哈希碼(hashcode)。哈希函數(shù)(hashfunction)——返回對象的哈希碼。項(item)——哈希表中的每一項都有兩個域:關(guān)鍵字域key及值域value(即存儲的對象)。key及value都可以是任意的Object類型的對象,但不能為空(null),HashTable中的所有關(guān)鍵字都是唯一的。裝填因子(loadfactor)——(表中填入的項數(shù))/(表的容量)。5.2.3Java集合框架Map接口實現(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)——將鍵/值對從表中去除,并返回從表中去除的值,如果不存在,則返回null。如Hashtable

aPhoneBook=newHashtable();aPhoneBook.put("ZhuYongqin","");aPhoneBook.put("LiuNa","");aPhoneBook.remove("ZhuYongqin");aPhoneBook.remove("");//不出錯,但返回nullSystem.out.println(aPhoneBook);//顯示{LiuNa=}5.2.3Java集合框架Map接口實現(xiàn)

–HashTable,HashMapbooleanisEmpty()——判斷哈希表是否為空。booleancontainsKey(Objectkey)——判斷給定的關(guān)鍵字是否在哈希表中。booleancontains(Objectvalue)——判斷給定的值是否在哈希表中。booleancontainsValue(Objectvalue)——判斷給定的值是否在哈希表中。voidclear()——將哈希表清空。Enumerationelements()——返回包含值的Enumeration對象。SetkeySet():返回所有的鍵(key),并使用Set容器存放。SetentrySet():返回一個實現(xiàn)Map.Entry接口的元素Set。Collectionvalues():返回所有的值。HashMap類與HashTable類很相似,只是HashTable類不允許有空的關(guān)鍵字,而HashMap類允許。5.2.3Java集合框架Map接口實現(xiàn)

–HashTable與HashMap區(qū)別HashTable的應(yīng)用非常廣泛,HashMap是新框架中用來代替HashTable的類,也就是說建議使用HashMap,不要使用HashTable。1.HashTable的方法是同步的,HashMap未經(jīng)同步,所以在多線程場合要手動同步HashMap這個區(qū)別就像Vector和ArrayList一樣。2.HashTable不允許null值(key和value都不可以),HashMap允許null值(key和value都可以)。3.HashTable有一個contains(Objectvalue),功能和containsValue(Objectvalue)功能一樣。4.HashTable使用Enumeration,HashMap使用Iterator。5.2.3Java集合框架Map接口實現(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)中,每一部電影都會屬于一種電影分類,一種電影分類包含N部電影??苹秒娪鞍⒎策_、暮光之城恐怖電影貞子纏身、咒怨現(xiàn)在希望根據(jù)電影分類查詢關(guān)聯(lián)的影片集合,如何實現(xiàn)?存儲方式如何選擇?元素個數(shù)不確定使用集合類通過key(電影分類)獲得value(電影集合)HashMap是Map接口的實現(xiàn)類,把各個Object映射起來,實現(xiàn)了“鍵/值(key/value)”對應(yīng)的快速存取。5.2.4Comparable接口TreeMap中是根據(jù)鍵(Key)進行排序的。而如果我們要使用TreeMap來進行正常的排序的話,Key中存放的對象必須實現(xiàn)Comparable接口。在java.lang包中,Comparable接口適用于一個類有自然順序的時候。假定對象集合是同一類型,該接口允許您把集合排序成自然順序。它只有一個方法:compareTo()方法,用來比較當(dāng)前實例和作為參數(shù)傳入的元素。如果排序過程中當(dāng)前實例出現(xiàn)在參數(shù)前(當(dāng)前實例比參數(shù)大),就返回某個負值。如果當(dāng)前實例出現(xiàn)在參數(shù)后(當(dāng)前實例比參數(shù)?。?,則返回正值。否則,返回零。如果這里不要求零返回值表示元素相等。零返回值可以只是表示兩個對象在排序的時候排在同一個位置。5.2.5Comparator接口Java.util包中提供的一個對某個對象集合進行整體排序的比較接口提供了compare的比較方法來比較對象使用方法:定義實現(xiàn)該接口的類,重寫compare方法;實例化該類的對象;把該對象作為Collections.sort()方法的參數(shù)。5.2.5Comparator接口//實現(xiàn)Comparator接口,比較DVD的價格publicclasspareimplementsComparat

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論