第15章、用集合存儲(chǔ)對(duì)象_第1頁(yè)
第15章、用集合存儲(chǔ)對(duì)象_第2頁(yè)
第15章、用集合存儲(chǔ)對(duì)象_第3頁(yè)
第15章、用集合存儲(chǔ)對(duì)象_第4頁(yè)
第15章、用集合存儲(chǔ)對(duì)象_第5頁(yè)
已閱讀5頁(yè),還剩26頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第十五章

-----用集合存儲(chǔ)對(duì)象/掌握J(rèn)ava集合框架的常用接口掌握常用集合類(lèi):VectorArrayListHashMapHashTable學(xué)習(xí)目標(biāo)/為什么需要集合框架學(xué)員1學(xué)員20如何存儲(chǔ)每天的新聞信息?如何存儲(chǔ)課程的編號(hào)與課程信息,能夠通過(guò)編號(hào)方便地獲得課程信息?如果寫(xiě)程序時(shí)并不知道程序運(yùn)行時(shí)會(huì)需要多少對(duì)象,或者,需要更復(fù)雜的方式存儲(chǔ)對(duì)象——那么,可以使用Java集合框架,來(lái)解決這類(lèi)問(wèn)題一維數(shù)組代碼1……代碼N課程1……課程N(yùn)一一對(duì)應(yīng)新聞1……新聞N每天的新聞總數(shù)不確定,顯然無(wú)法再使用數(shù)組保存存儲(chǔ)一個(gè)班的學(xué)員信息,假定一個(gè)班容納20名學(xué)員集合框架層次圖/從上面的圖可以看出java集合類(lèi)主要有以下幾種:List結(jié)構(gòu)的集合類(lèi):ArrayList類(lèi),LinkedList類(lèi),Vector類(lèi),Stack類(lèi)Map結(jié)構(gòu)的集合類(lèi):HashMap類(lèi),Hashtable類(lèi)Set結(jié)構(gòu)的集合類(lèi):HashSet類(lèi),TreeSet類(lèi)Queue結(jié)構(gòu)的集合:Queue接口/Java集合框架,為我們提供了一套性能優(yōu)良、使用方便的接口和類(lèi),我們不必再重新發(fā)明,只需學(xué)會(huì)如何使用它們,就可以處理實(shí)際應(yīng)用中出現(xiàn)的問(wèn)題了Java集合框架位于java.util包中/List接口和ArrayList類(lèi)開(kāi)發(fā)一套小型的新聞管理系統(tǒng),要求如下:可以存儲(chǔ)各類(lèi)新聞標(biāo)題(包含ID、名稱(chēng)、創(chuàng)建者、創(chuàng)建時(shí)間)可以獲取新聞標(biāo)題的總數(shù)可以逐條打印每條新聞標(biāo)題的名稱(chēng)存儲(chǔ)方式如何選擇?元素個(gè)數(shù)不確定使用集合類(lèi)需要遍歷元素存儲(chǔ)對(duì)象如何確定?類(lèi)型:新聞標(biāo)題屬性:ID、名稱(chēng)、創(chuàng)建者、創(chuàng)建時(shí)間/List接口和ArrayList類(lèi)第一步,確定存儲(chǔ)方式

1、ArrayList類(lèi)是List接口的一個(gè)具體實(shí)現(xiàn)類(lèi)2、ArrayList對(duì)象實(shí)現(xiàn)了可變大小的數(shù)組3、隨機(jī)訪問(wèn)和遍歷元素時(shí),它提供更好的性能元素1元素2元素3元素4元素5元素6元素7元素8元素9元素10當(dāng)元素個(gè)數(shù)增加為11個(gè)0129345786元素1元素2元素3元素4元素5元素6元素7元素8元素9元素10元素11創(chuàng)建了一個(gè)新的數(shù)組,把原數(shù)組中元素復(fù)制進(jìn)來(lái)012934578610根據(jù)下標(biāo)位置訪問(wèn)元素/List接口和ArrayList類(lèi)5-3第二步:確定存儲(chǔ)對(duì)象1、創(chuàng)建類(lèi)型:新聞標(biāo)題2、包含屬性:ID、名稱(chēng)、創(chuàng)建者、創(chuàng)建時(shí)間publicclassFirstLevelTitle{privateintid;//IDprivateStringtitleName;//名稱(chēng)privateStringcreater;//創(chuàng)建者privateDatecreateTime;//創(chuàng)建時(shí)間publicFirstLevelTitle(intid,StringtitleName,Stringcreater,DatecreateTime){this.id=id;this.titleName=titleName;this.creater=creater;this.createTime=createTime;}publicStringgetTitleName(){ returntitleName;}publicvoidsetTitleName(StringtitleName){ this.titleName=titleName;}}/List接口和ArrayList類(lèi)5-4第三步:具體實(shí)現(xiàn)1、按照順序依次添加各類(lèi)新聞標(biāo)題2、獲取新聞標(biāo)題的總數(shù)3、根據(jù)位置獲取相應(yīng)新聞標(biāo)題4、逐條打印每條新聞標(biāo)題的名稱(chēng)publicclassFirstLevelTitleDB1{publicstaticvoidmain(String[]args){FirstLevelTitlecar=newFirstLevelTitle(1,"汽車(chē)","管理員",newDate());FirstLevelTitletest=newFirstLevelTitle(2,"高考","管理員",newDate());ListnewsTitleList=newArrayList();newsTitleList.add(car);newsTitleList.add(test); System.out.println("新聞標(biāo)題數(shù)目為:"+newsTitleList.size()+"條");print(newsTitleList);}publicstaticvoidprint(ListnewsList){for(inti=0;i<newsList.size();i++){FirstLevelTitletitle=(FirstLevelTitle)newsList.get(i);System.out.println(i+1+":"+title.getTitleName());}}}123順序添加,位置從0開(kāi)始新聞標(biāo)題數(shù)目為:2條1:汽車(chē)2:高考控制臺(tái)輸出4從集合中取出后為Object類(lèi)型,需要進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換/List接口和ArrayList類(lèi)5-5第三步:具體實(shí)現(xiàn)1、在指定的位置添加新聞標(biāo)題2、判斷是否已經(jīng)存儲(chǔ)了某條新聞標(biāo)題3、刪除指定位置處的某一新聞標(biāo)題publicclassFirstLevelTitleDB2{publicstaticvoidmain(String[]args){FirstLevelTitlecar=newFirstLevelTitle(1,"汽車(chē)","網(wǎng)站管理員",newDate());FirstLevelTitletest=newFirstLevelTitle(2,"高考","網(wǎng)站管理員",newDate());FirstLevelTitlehouse=newFirstLevelTitle(3,"房產(chǎn)","網(wǎng)站管理員",newDate());ListnewsTitleList=newArrayList();newsTitleList.add(car);newsTitleList.add(test);newsTitleList.add(2,house);if(newsTitleList.contains(test)){ System.out.println("有高考的新聞");}else{ System.out.println("沒(méi)有高考的新聞");}newsTitleList.remove(1);System.out.println("新聞標(biāo)題數(shù)目為:"+newsTitleList.size()+"條");}}123在指定的位置添加元素有高考的新聞新聞標(biāo)題數(shù)目為:2條控制臺(tái)輸出刪除指定位置的元素/ArrayList總結(jié)ArrayList就是傳說(shuō)中的動(dòng)態(tài)數(shù)組,它提供了動(dòng)態(tài)的增加和減少元素,實(shí)現(xiàn)了ICollection和IList接口,靈活的設(shè)置數(shù)組的大小等好處,注意的是List也是從0開(kāi)始計(jì)數(shù)的。ArrayList主要方法:booleanadd(Objecto):在列表的末尾順序添加元素intsize():返回列表中的元素個(gè)數(shù)Objectget(intindex):返回指定索引位置處的元素,注意:取出的元素是Object類(lèi)型,使用前需要進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換。voidadd(intindex,Objecto):在指定的索引位置添加元素,注意:索引位置必須介于0和列表中的元素個(gè)數(shù)之間。booleancontains(Objecto):判斷列表中是否存在指定的元素booleanremove(Objecto):從列表中刪除元素Iterator接口Iterator:對(duì)collection進(jìn)行迭代的迭代器。本身就是一個(gè)對(duì)象,它的工作就是遍歷并選擇集合序列中的對(duì)象,而客戶端的程序員不必知道或關(guān)心該序列底層的結(jié)構(gòu)。此外,迭代器通常被稱(chēng)為輕量級(jí)對(duì)象,創(chuàng)建它的代價(jià)小。Iterator接口(1.2版,替代Enumeration)是一個(gè)遍歷集合元素的工具,是對(duì)Enumeration接口的改進(jìn),因此在遍歷集合元素時(shí),優(yōu)先選用Iterator接口。與Enumeration不同,具有從正在遍歷的集合中去除對(duì)象的能力。具有如下三個(gè)實(shí)例方法:hasNext()

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

——取得下一個(gè)元素remove()——去除一個(gè)元素。注意是從集合中去除最后調(diào)用next()返回的元素,而不是從Iterator類(lèi)中去除//小結(jié)1創(chuàng)建一個(gè)類(lèi)Cat包含屬性name,在構(gòu)造方法中進(jìn)行初始化添加一個(gè)方法show(),用以打印name屬性的值創(chuàng)建一個(gè)類(lèi)CatTest,添加main方法,實(shí)現(xiàn)創(chuàng)建一個(gè)ArrayList,向其中添加幾個(gè)Cat對(duì)象遍歷該集合,并且對(duì)每個(gè)Cat對(duì)象調(diào)用show()方法/List接口和LinkedList類(lèi)3-1升級(jí)這套小型的新聞管理系統(tǒng),要求如下:可以添加頭條新聞標(biāo)題可以刪除末條新聞標(biāo)題存儲(chǔ)方式如何選擇?元素個(gè)數(shù)不確定使用集合類(lèi)需要在列表的頭或尾添加、刪除元素/List接口和LinkedList類(lèi)3-2第一步,確定存儲(chǔ)方式1、LinkedList類(lèi)是List接口的一個(gè)具體實(shí)現(xiàn)類(lèi)2、LinkedList類(lèi)用于創(chuàng)建鏈表數(shù)據(jù)結(jié)構(gòu)3、插入或者刪除元素時(shí),它提供更好的性能/List接口和LinkedList類(lèi)3-3第二步:具體實(shí)現(xiàn)1、添加頭條、以及最末條新聞標(biāo)題2、獲取頭條、以及最末條新聞標(biāo)題3、刪除頭條、以及最末條新聞標(biāo)題publicclassFirstLevelTitleDB3{publicstaticvoidmain(String[]args){FirstLevelTitlecar=newFirstLevelTitle(1,"汽車(chē)","管理員",newDate());FirstLevelTitlemedical=newFirstLevelTitle(2,"醫(yī)學(xué)","管理員",newDate());LinkedListnewsTitleList=newLinkedList();newsTitleList.addFirst(car);newsTitleList.addLast(medical);FirstLevelTitlefirst=(FirstLevelTitle)newsTitleList.getFirst();System.out.println("頭條的新聞標(biāo)題為:"+first.getTitleName());FirstLevelTitlelast=(FirstLevelTitle)newsTitleList.getLast();System.out.println("排在最后的新聞標(biāo)題為:"+last.getTitleName());newsTitleList.removeFirst();newsTitleList.removeLast();}}123ArrayList、Vector、LinkedList總結(jié)ArrayList:底層采用的數(shù)據(jù)結(jié)構(gòu)是數(shù)組結(jié)構(gòu)。特點(diǎn):查詢速度快,增刪速度稍慢;線程不同步。容量的增長(zhǎng)比例為自身的50%。Vector:底層采用的數(shù)據(jù)結(jié)構(gòu)是數(shù)組結(jié)構(gòu)。早期版本中使用的一個(gè)容器,基于線程同步。容量的增長(zhǎng)比例為自身的100%?,F(xiàn)被ArrayList替代。LinkedList:底層采用的數(shù)據(jù)結(jié)構(gòu)是鏈表結(jié)構(gòu)。特點(diǎn):增刪速度快,查詢速度慢。線程不同步。提示:在項(xiàng)目的開(kāi)發(fā)過(guò)程中,根據(jù)List集合中實(shí)現(xiàn)類(lèi)的不同的特性進(jìn)行相應(yīng)List的構(gòu)建和使用。//小結(jié)2電影DVD在線銷(xiāo)售系統(tǒng),它需要完成如下功能:1.能夠添加n個(gè)電影DVD對(duì)象,數(shù)量不確定,并且能夠、修改、刪除、查詢電影DVD信息。2.能夠獲取電影DVD對(duì)象的總數(shù)。3.能夠取出電影DVD對(duì)象并且逐條打印它的名稱(chēng)。4.能夠添加銷(xiāo)售冠軍電影DVD對(duì)象5.能夠刪除銷(xiāo)售最后一名的電影DVD對(duì)象/Map接口和HashMap類(lèi)4-1學(xué)員應(yīng)聘至外企工作,每個(gè)學(xué)員都會(huì)有一個(gè)英文名稱(chēng),對(duì)應(yīng)該學(xué)員對(duì)象Jack北京大學(xué)畢業(yè)的李明Rose北京大學(xué)畢業(yè)的劉麗現(xiàn)在希望通過(guò)英文名稱(chēng),獲得該學(xué)員對(duì)象的詳細(xì)信息,如何實(shí)現(xiàn)?存儲(chǔ)方式如何選擇?元素個(gè)數(shù)不確定使用集合類(lèi)通過(guò)key(英文名稱(chēng))獲得value(學(xué)員對(duì)象)存儲(chǔ)對(duì)象如何確定?類(lèi)型:學(xué)員屬性:學(xué)校名稱(chēng)、姓名/Map接口和HashMap類(lèi)4-2第一步,確定存儲(chǔ)方式1、Map接口用于維護(hù)“鍵-值對(duì)”的關(guān)聯(lián)性,可以通過(guò)鍵查找值2、HashMap是Map接口的一個(gè)具體實(shí)現(xiàn)類(lèi)/Map接口和HashMap類(lèi)4-3第二步:確定存儲(chǔ)對(duì)象1、創(chuàng)建類(lèi)型:學(xué)員2、包含屬性:學(xué)校名稱(chēng)、姓名publicclassStudent{privateStringname;//學(xué)員姓名privateStringschool;//學(xué)校名稱(chēng)publicStudent(Stringname,Stringschool){=name;this.school=school;}publicStringtoString(){ returnschool+"畢業(yè)的"+name;}}重寫(xiě)Object的toString()方法,用于輸出調(diào)試和描述信息/Map接口和HashMap類(lèi)4-4第三步:具體實(shí)現(xiàn)1、把英文名稱(chēng)與學(xué)員對(duì)象按照“鍵-值對(duì)”的方式存儲(chǔ)在HashMap中2、分別打印鍵集、值集、以及鍵-值對(duì)集合3、判斷是否存在某個(gè)鍵,如果是,則根據(jù)鍵獲取相應(yīng)的值4、根據(jù)鍵、刪除某條記錄publicclassMapTest{publicstaticvoidmain(String[]args){Studentstudent1=newStudent(“李明”,“北京大學(xué)");Studentstudent2=newStudent(“劉麗”,“清華大學(xué)");Mapstudents=newHashMap();students.put("Jack",student1);students.put("Rose",student2);System.out.println("鍵集:"+students.keySet());System.out.println("值集:"+students.values());System.out.println("鍵-值對(duì)集合:"+students);Stringkey="Jack";if(students.containsKey(key))System.out.println(students.get(key));students.remove(key);System.out.println("鍵-值對(duì)集合:"+students);}}123鍵集:[Jack,Rose]值集:[北京大學(xué)畢業(yè)的李明,清華大學(xué)畢業(yè)的劉麗]鍵-值對(duì)集合:{Jack=北京大學(xué)畢業(yè)的李明,Rose=清華大學(xué)畢業(yè)的劉麗}北京大學(xué)畢業(yè)的李明鍵-值對(duì)集合:{Rose=清華大學(xué)畢業(yè)的劉麗}控制臺(tái)輸出4/HashMapHashMap類(lèi):基于哈希表的Map接口的實(shí)現(xiàn)。此實(shí)現(xiàn)提供所有可選的映射操作,并允許使用null鍵和null值。此類(lèi)不保證映射的順序。此類(lèi)的實(shí)現(xiàn)是基于非同步的。常用方法:Objectput(Objectkey,Objectvalue):以鍵-值對(duì)的方式進(jìn)行存儲(chǔ),注意:鍵必須是唯一的,值可以重復(fù)。如果試圖添加重復(fù)的鍵,那么最后加入的鍵-值對(duì)將替換掉原先的鍵-值對(duì)。SetkeySet():返回鍵的集合Collectionvalues():返回值的集合booleancontainsKey(Objectkey):如果存在由指定的鍵映射的鍵-值對(duì),返回trueObjectget(Objectkey):根據(jù)鍵返回相關(guān)聯(lián)的值,如果不存在指定的鍵,返回nullObjectremove(Objectkey):刪除由指定的鍵映射的鍵-值對(duì)HashtableHashtable類(lèi):此類(lèi)實(shí)現(xiàn)一個(gè)哈希表,該哈希表將鍵映射到相應(yīng)的值。任何非null對(duì)象都可以用作鍵或值,即Hashtable不允許存在null鍵和null值。此類(lèi)基于線程同步。其余特性Hashtable類(lèi)與HashMap大致相同。/HashMap和Hashtable區(qū)別 HashMap和Hashtable都是java的集合類(lèi),都可以用來(lái)存放java對(duì)象,這是他們的相同點(diǎn),但是他們也有區(qū)別: 1.歷史原因 Hashtable是基于陳舊的Dictionary類(lèi)的,HashMap是java1.2引進(jìn)的Map接口的一個(gè)實(shí)現(xiàn)。 2.同步性 Hashtable是同步的。這個(gè)類(lèi)中的一些方法保證了Hashtable中的對(duì)象是線程安全的。而HashMap是異步的,因此HashMap中的對(duì)象并不是線程安全的。因?yàn)橥降囊髸?huì)影響執(zhí)行的效率,所以如果你不需要線程安全的集合那么使用HashMap是一個(gè)很好的選擇,這樣可以避免由于同步帶來(lái)的不必要的性能開(kāi)銷(xiāo),從而提高效率。 3.值 HashMap可以讓你將空值作為一個(gè)表的條目的key或value,但是Hashtable是不能放入空值的(null)。/請(qǐng)給出下面Java代碼的運(yùn)行結(jié)果importJava.util.*;publicclassTestMap{publicstaticvoidmain(String[]args){Studentstudent1=newStudent(“李明”,“北京大學(xué)");Studentstudent2=newStudent(“劉麗”,“清華大學(xué)");Studentstudent3=newStudent(“張娜”,“西安交大");Studentstudent4=student1;Mapstudents=newHashMap();students.put("Jack",student1);students.put("Rose",student2);students.put("Mary",student3);students.put("Rose",student4);System.out.println("鍵集:"+students.keySet());System.out.println("值集:"+students.values());}}鍵集:[Jack,Mary,Rose]值集:[北京大學(xué)畢業(yè)的李明,西安交大畢業(yè)的張娜,北京大學(xué)畢業(yè)的李明]/小結(jié)3創(chuàng)建一個(gè)類(lèi)Book包含屬性:title(標(biāo)題),使用構(gòu)造方法進(jìn)行初始化重寫(xiě)toString()方法,用以返回Title屬性的值創(chuàng)建一個(gè)類(lèi)BookTest,添加main方法,要求:使用HashMap進(jìn)行存儲(chǔ),鍵為Book對(duì)象的編號(hào),值為Book對(duì)象通過(guò)某一個(gè)編號(hào)獲取B

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論