




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
JAVA語(yǔ)言程序設(shè)計(jì)11.1Set和Map11.2集合案例本章小結(jié)第十一章目錄教學(xué)目標(biāo):在程序設(shè)計(jì)中,常常需要同時(shí)存儲(chǔ)多個(gè)數(shù)據(jù),如果存儲(chǔ)的數(shù)據(jù)是同一種數(shù)據(jù)類(lèi)型,使用數(shù)組這種數(shù)據(jù)結(jié)構(gòu)就可以實(shí)現(xiàn);如果存儲(chǔ)不同數(shù)據(jù)類(lèi)型的多個(gè)數(shù)據(jù),數(shù)組就無(wú)能為力,這時(shí)可以選擇JAVA的集合類(lèi)。本章將介紹JAVA中常見(jiàn)的集合,結(jié)合實(shí)例介紹各種集合的使用,并通過(guò)綜合案例展示集合的靈活應(yīng)用。教學(xué)重點(diǎn):了解JAVA中不同的集合名稱及定義方法。掌握Set和Map兩種常用集合的語(yǔ)法規(guī)則。掌握Set和Map兩種常用集合的使用方法。第十一章JAVA提供了多種集合的定義方式,主要有Set和Map兩個(gè)接口,每個(gè)接口又包括自己的子接口,實(shí)現(xiàn)具體的邏輯功能。11.1Set和MapSet集合里面存放的對(duì)象是無(wú)序且不允許重復(fù)的,集合中的對(duì)象不按照特定的排序方式存放,只是將用戶要添加的對(duì)象加入集合。Set常用的子接口有兩個(gè),下面分別進(jìn)行介紹。1.HashSetHashSet基于HashMap來(lái)完成功能,是對(duì)HashMap進(jìn)行了重定義,并且在HashSet中僅僅使用了HashMap中的key來(lái)實(shí)現(xiàn)各種應(yīng)用,并不像HashMap那樣,value必須跟key成對(duì)出現(xiàn)。HashSet的key不允許重復(fù)(HashMap的key也不允許重復(fù),如果重復(fù)就會(huì)覆蓋),允許有null值。11.1.1Set集合HashSet集合的常用方法TreeSet基于TreeMap來(lái)完成功能。TreeSet集合是根據(jù)存入的元素進(jìn)行排序或根據(jù)創(chuàng)建集合時(shí)提供的比較器進(jìn)行排序,具體排序規(guī)則取決于定義TreeSet時(shí)使用的構(gòu)造方法。2TreeSetpackagep1;publicclassExample11_1{publicstaticvoidmain(String[]args){String[]array=newString[3];array[0]="aa";array[1]="bb";array[2]="cc";for(inti=0;i<3;i++)System.out.println(array[i]);}}【例11-1】創(chuàng)建一個(gè)長(zhǎng)度為3的字符串?dāng)?shù)組,依次存入3個(gè)字符串并將這3個(gè)字符串輸出,再用Set集合來(lái)改寫(xiě)此功能改用Set集合實(shí)現(xiàn)的程序如下:Set<String>arr=newHashSet<String>();arr.add("aa");arr.add("bb");arr.add("cc");Iterator<String>it=arr.iterator();while(it.hasNext()){Stringstr=it.next();System.out.println(str);}【例11-1】創(chuàng)建一個(gè)長(zhǎng)度為3的字符串?dāng)?shù)組,依次存入3個(gè)字符串并將這3個(gè)字符串輸出,再用Set集合來(lái)改寫(xiě)此功能也可以用Set和for循環(huán)遍歷來(lái)實(shí)現(xiàn)上述功能:for(Stringstr:arr){System.out.println(str);}【例11-1】創(chuàng)建一個(gè)長(zhǎng)度為3的字符串?dāng)?shù)組,依次存入3個(gè)字符串并將這3個(gè)字符串輸出,再用Set集合來(lái)改寫(xiě)此功能Map集合里面存放的是鍵值對(duì)(key-value),鍵不能重復(fù),而值可以重復(fù)。對(duì)Map的訪問(wèn)是通過(guò)對(duì)鍵的遍歷來(lái)找到對(duì)應(yīng)的值,而上一小節(jié)所介紹的Set集合,就是直接遍歷,Map集合多了對(duì)鍵的遍歷。其實(shí),對(duì)Map集合的遍歷,就是對(duì)Set集合的遍歷,然后得到鍵所對(duì)應(yīng)的值。Map集合的子集有4個(gè),下面分別進(jìn)行介紹。11.1.2Map
集合HashMap是以數(shù)組方式進(jìn)行數(shù)據(jù)存儲(chǔ)的,允許key或value中的一個(gè)或兩個(gè)為null。key不可以重復(fù)而value可以重復(fù)。這里要強(qiáng)調(diào)的是,雖然null可以作為key來(lái)使用,但是由于其唯一性的要求,所以不能在一個(gè)集合里有兩個(gè)null作為key。1.HashMapHashMap集合的常用方法2.HashTableHashTable與HashMap類(lèi)似,它支持線程的同步,即任一時(shí)刻只能有一個(gè)線程能寫(xiě)入HashTable,這也導(dǎo)致了HashTable在寫(xiě)入時(shí)會(huì)比較慢。HashTable繼承自Dictionary類(lèi),與HashMap不同的是,它不允許記錄的key或value為null,同時(shí)效率較低。LinkedHashMap保存了記錄的插入順序,在用iterator遍歷LinkedHashMap時(shí),先得到的記錄先插入,在遍歷時(shí)也會(huì)比HashMap慢,擁有HashMap的全部功能及特性。3.LinkedHashMapTreeMap基于紅黑二叉樹(shù)實(shí)現(xiàn),不允許有null值,key不可以重復(fù),value
允許重復(fù)。存入TreeMap的元素應(yīng)當(dāng)實(shí)現(xiàn)Comparable接口或Comparator接口。TreeMap存入元素時(shí)對(duì)元素進(jìn)行自動(dòng)排序,迭代輸出的時(shí)候就按排序順序輸出。4.TreeMap將Map中所有的鍵存入Set集合。因?yàn)镾et具備迭代器,所以具有迭代器功能。所有可以通過(guò)迭代方式取出的鍵值,都可利用get()方法獲取每一個(gè)鍵值對(duì)應(yīng)的value。keySet():被操作對(duì)象在經(jīng)過(guò)迭代處理后,就只能通過(guò)get()方法來(lái)獲取key。取到的結(jié)果會(huì)亂序,是因?yàn)槿〉脭?shù)據(jù)行主鍵的時(shí)候,使用了keySet()方法,而這個(gè)方法返回的Set結(jié)果,其里面的數(shù)據(jù)是亂序排放的?!纠?1-2】用3種方法,實(shí)現(xiàn)Map集合的遍歷輸出【例11-2】用3種方法,實(shí)現(xiàn)Map集合的遍歷輸出packagep1;importjava.util.*;publicclassExample11_2{@SuppressWarnings("unchecked")publicstaticvoidmain(String[]args){Maparr=newHashMap();arr.put("1","aa");arr.put("2","bb");arr.put("3","cc");//先獲取Map集合中所有鍵的Set集合Iteratorit=arr.keySet().iterator();//獲取迭代器while(it.hasNext()){Objectkey=it.next();System.out.println(arr.get(key));}}}packagep1;importjava.util.*;publicclassExample11_3{@SuppressWarnings("unchecked")publicstaticvoidmain(String[]args){Maparr=newHashMap();arr.put("1","aa");arr.put("2","bb");arr.put("3","cc");Collection<String>vs=arr.values();Iterator<String>it=vs.iterator();while(it.hasNext()){Stringvalue=it.next();System.out.println(value);}}}【例11-3】在這個(gè)例題中我們可以用第二種方法即Collection的values()獲取所有的值Set<Map.Entry<K,V>>entrySet()方法返回此映射中包含的映射關(guān)系Set視圖。(一個(gè)關(guān)系就是一個(gè)鍵-值對(duì)),把(key-value)作為一個(gè)整體一對(duì)一對(duì)地存放到Set集合當(dāng)中。Map.Entry表示映射關(guān)系。entrySet()表示迭代后可以用e.getKey()以及e.getValue()兩種方法來(lái)取key和value,返回的是Entry接口。建議使用第三種遍歷方法,因?yàn)檫@種方法的效率最高。packagep1;importjava.util.*;publicclassExample11_4{@SuppressWarnings("unchecked")publicstaticvoidmain(String[]args){Maparr=newHashMap();arr.put(1,"aa");arr.put(2,"bb");arr.put(3,"cc");//返回的Map.Entry對(duì)象的Set集合Map.Entry包含了key和value對(duì)象Set<Map.Entry<IntegerString>>set=arr.entrySet();Iterator<Map.Entry<IntegerString>>it=set.iterator();while(it.hasNext()){//返回的是封裝了key和value對(duì)象的Map.Entry對(duì)象Map.Entry<IntegerString>en=it.next();//獲取Map.Entry對(duì)象中封裝的key和value對(duì)象Integerkey=en.getKey();Stringvalue=en.getValue();System.out.println("key="+key+"?value="+value);}}}
List也是一種早期常常使用的一種結(jié)合方式,List里存放的對(duì)象是有序的,可以重復(fù)的,List關(guān)注的是索引,擁有一系列和索引相關(guān)的方法,查詢速度快。但是向List集合里插入或刪除數(shù)據(jù)時(shí),會(huì)伴隨著后面數(shù)據(jù)的移動(dòng),所有插入刪除數(shù)據(jù)速度比較慢。List集合常用的子集合有兩個(gè)。(1)ArrayListArrayList是基于數(shù)組的,在初始化ArrayList時(shí),會(huì)構(gòu)建空數(shù)組(Object[]elementData={})。ArrayList是一個(gè)無(wú)序的,它是按照添加的先后順序排列。(2)LinkedListLinkedList是基于鏈表的,它是一個(gè)雙向鏈表,每個(gè)節(jié)點(diǎn)維護(hù)了一個(gè)prev和next指針。同時(shí)對(duì)于這個(gè)鏈表,維護(hù)了first和last指針,first指向第一個(gè)元素,last指向最后一個(gè)元素。LinkedList是一個(gè)無(wú)序的鏈表,按照插入的先后順序排序,不提供sort方法對(duì)內(nèi)部元素排序。11.1.4集合總結(jié)11.1.3其他集合11.1.4集合總結(jié)常見(jiàn)的三大類(lèi)集合,各有優(yōu)缺點(diǎn),在實(shí)際使用時(shí),建議采用這樣的原則:某個(gè)集合的優(yōu)點(diǎn)可以滿足需求而缺點(diǎn)又不影響需求的實(shí)現(xiàn),就選擇這個(gè)集合;而當(dāng)需求跟任何一個(gè)集合都不沖突時(shí),建議優(yōu)先選擇效率高、占用資源少的集合。各集合的對(duì)比生產(chǎn)企業(yè)根據(jù)對(duì)大數(shù)據(jù)的處理分析,指導(dǎo)企業(yè)的生產(chǎn)和銷(xiāo)售。以一個(gè)羽絨服企業(yè)“雙11”的羽絨服銷(xiāo)售為例:在每年6月份根據(jù)去年羽絨服的銷(xiāo)量先生產(chǎn)10%,在9月份會(huì)根據(jù)網(wǎng)上瀏覽量再生產(chǎn)30%,在11月初根據(jù)用戶加購(gòu)量和收藏量再生產(chǎn)30%,在11月11日后根據(jù)用戶的購(gòu)買(mǎi)量生產(chǎn)剩余的30%。大數(shù)據(jù)對(duì)企業(yè)的生產(chǎn)引導(dǎo)模式,使企業(yè)更好地為客戶服務(wù)。高科技為人們帶來(lái)了優(yōu)質(zhì)生活,作為未來(lái)的計(jì)算機(jī)從業(yè)人員,我們不能只享受前人帶來(lái)的便捷,更要努力學(xué)好知識(shí),用我們的本領(lǐng)讓國(guó)家變得更強(qiáng)大。課后思考:大數(shù)據(jù)是怎樣指導(dǎo)企業(yè)生產(chǎn)的?11.2.1網(wǎng)絡(luò)聊天工具在第10章中,雖然實(shí)現(xiàn)了在數(shù)據(jù)庫(kù)中判斷用戶名和密碼,但是無(wú)法實(shí)現(xiàn)同步功能,即當(dāng)有用戶登錄時(shí),其他已登錄的用戶應(yīng)該知道這個(gè)用戶已登錄。本節(jié)利用集合的知識(shí),實(shí)現(xiàn)同步功能。1.設(shè)計(jì)思路(1)在數(shù)據(jù)庫(kù)中保存用戶名和密碼。(2)利用集合的知識(shí),實(shí)現(xiàn)登錄后聊天界面下拉列表框的用戶名同步,且這兩個(gè)人的聊天內(nèi)容不會(huì)發(fā)給其他用戶。(3)其他幾個(gè)界面的程序不需要改變。11.2集合案例2.遇到的問(wèn)題如何用集合實(shí)現(xiàn)兩個(gè)用戶的消息同步?【解決問(wèn)題】利用集合的特點(diǎn),即可以保存不同的數(shù)據(jù)類(lèi)型,來(lái)分別保存服務(wù)器通信的用戶名、留言及使用的端口,當(dāng)服務(wù)器檢測(cè)到有用戶登錄時(shí),就會(huì)向其他用戶的下拉列表框同步剛剛登錄的這個(gè)用戶的用戶名。而當(dāng)一個(gè)用戶向另一個(gè)用戶發(fā)送消息時(shí),服務(wù)器會(huì)向聊天的雙方而不是其他人,發(fā)送剛剛收到的消息。以上兩種情況,都可以通過(guò)集合來(lái)完成,我們新增以下代碼://------------服務(wù)器程序中加入代碼------------//服務(wù)器監(jiān)聽(tīng)和接收客戶端信息及獲取客戶端的端口信息HashMap<String?Socket>hm=newHashMap<String?Socket>();//判斷當(dāng)前有多少個(gè)客戶端已經(jīng)登錄到服務(wù)器ArrayList<Socket>userList=newArrayList<Socket>();
11.2集合案例到這里我們用了5個(gè)章節(jié)的內(nèi)容,完成了一個(gè)聊天室的程序的編寫(xiě),實(shí)現(xiàn)了群聊天的功能。有了前面的知識(shí),現(xiàn)在我們就來(lái)升級(jí)我們的聊天室程序。群成員登錄界面、注冊(cè)界面、“我是群主”的群聊天界面、“游來(lái)游去的小魚(yú)”的群聊天界面、“游來(lái)游去的小魚(yú)”發(fā)送信息后的群聊天界面、注冊(cè)成功后的界面及Dream用戶注冊(cè)后的群聊天界面分別如下圖所示。11.2.2中國(guó)夢(mèng)聊天室到這里我們用了5個(gè)章節(jié)的內(nèi)容,完成了一個(gè)聊天室的程序的編寫(xiě),實(shí)現(xiàn)了群聊天的功能。有了前面的知識(shí),現(xiàn)在我們就來(lái)升級(jí)我們的聊天室程序。群成員登錄界面、注冊(cè)界面、“我是群主”的群聊天界面、“游來(lái)游去的小魚(yú)”的群聊天界面、“游來(lái)游去的小魚(yú)”發(fā)送信息后的群聊天界面、注冊(cè)成功后的界面及Dream用戶注冊(cè)后的群聊天界面分別如下圖所示。11.2.2中國(guó)夢(mèng)聊天室11.2.2中國(guó)夢(mèng)聊天室圖
11-5
群成員登錄界面圖
11-6
注冊(cè)界面11.2.2中國(guó)夢(mèng)聊天室圖
11-7
“
我是群主”的群聊天界面圖
11-8
“
游來(lái)游去的小魚(yú)”的群聊天界面11.2.2中國(guó)夢(mèng)聊天室圖
11-10
注冊(cè)成功后的界面圖
11-11
Dream
用戶注冊(cè)后的群聊天界面圖
11-9
“
游來(lái)游去的小魚(yú)”
發(fā)送消息后的群聊天界面1.設(shè)計(jì)思路(1)在10.4小節(jié)的程序上進(jìn)行修改。(2)運(yùn)用集合保存服務(wù)器及群成員的通信信息。(3)服務(wù)器根據(jù)集合存儲(chǔ)的進(jìn)程分發(fā)群成員的聊天信息。(4)新用戶注冊(cè)時(shí)應(yīng)實(shí)時(shí)地在群成員中顯示新成員昵稱。2.遇到的問(wèn)題(1)服務(wù)器如何知道都有哪些客戶端連接進(jìn)來(lái)?(2)何時(shí)分發(fā)群成員的聊天信息?
(3)如何實(shí)現(xiàn)向進(jìn)群的所有用戶分發(fā)統(tǒng)一消息?(4)如何實(shí)現(xiàn)當(dāng)新用戶注冊(cè)時(shí),實(shí)時(shí)地在群成員中顯示新成員昵稱。11.2.2中國(guó)夢(mèng)聊天室【解決問(wèn)題1】通過(guò)在客戶端程序中設(shè)置“開(kāi)始聊天”這個(gè)標(biāo)志,來(lái)記錄連接到服務(wù)器的客戶端?!窘鉀Q問(wèn)題2】當(dāng)有群用戶向群里發(fā)送消息時(shí),在把消息存入數(shù)據(jù)庫(kù)的同時(shí),實(shí)時(shí)向群里的其他成員分發(fā)聊天信息?!窘鉀Q問(wèn)題3】群成員登錄時(shí),就會(huì)在服務(wù)器記錄其用戶名及登錄信息(Socket信息),當(dāng)有群成員向群里發(fā)送消息時(shí),就向保存的所有用戶(消息發(fā)布者除外)發(fā)送同一個(gè)消息?!窘鉀Q問(wèn)題4】可以利用解決問(wèn)題3的方法來(lái)解決此問(wèn)題。4.知識(shí)擴(kuò)展(1)如何在成員昵稱的后面加上登錄賬號(hào)?(2)
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- CPSM聯(lián)考整體規(guī)劃試題及答案
- 新型物流商業(yè)模式探討試題及答案
- 采購(gòu)項(xiàng)目的經(jīng)濟(jì)效益分析試題及答案
- 倉(cāng)儲(chǔ)管理中的文化建設(shè)與影響試題及答案
- 健康活動(dòng)視頻防溺水課件
- 2025年乳味飲品合作協(xié)議書(shū)
- 假期防欺凌課件
- 2024年國(guó)際物流師考試復(fù)習(xí)指南試題及答案
- 學(xué)習(xí)反饋:2024年CPMM試題及答案
- 2024年CPSM考試的考點(diǎn)總結(jié)及試題與答案
- 2025年遼陽(yáng)職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)必考題
- 2025年廣東省佛山市南海區(qū)中考一模英語(yǔ)試題(原卷版+解析版)
- 防治傳染病知識(shí)培訓(xùn)課件
- 2025年高考英語(yǔ)二輪備考策略講座
- 2025江蘇中煙工業(yè)招聘128人高頻重點(diǎn)模擬試卷提升(共500題附帶答案詳解)
- 牡丹江鍋爐耐火磚施工方案
- 屋面光伏工程施工組織設(shè)計(jì)
- 新風(fēng)培訓(xùn)資料
- 危險(xiǎn)化學(xué)品目錄(2024版)
- GB/T 31586.2-2015防護(hù)涂料體系對(duì)鋼結(jié)構(gòu)的防腐蝕保護(hù)涂層附著力/內(nèi)聚力(破壞強(qiáng)度)的評(píng)定和驗(yàn)收準(zhǔn)則第2部分:劃格試驗(yàn)和劃叉試驗(yàn)
- 廣外英本畢業(yè)水平考試真題
評(píng)論
0/150
提交評(píng)論