




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
JAVA語言程序設計11.1Set和Map11.2集合案例本章小結第十一章目錄教學目標:在程序設計中,常常需要同時存儲多個數據,如果存儲的數據是同一種數據類型,使用數組這種數據結構就可以實現;如果存儲不同數據類型的多個數據,數組就無能為力,這時可以選擇JAVA的集合類。本章將介紹JAVA中常見的集合,結合實例介紹各種集合的使用,并通過綜合案例展示集合的靈活應用。教學重點:了解JAVA中不同的集合名稱及定義方法。掌握Set和Map兩種常用集合的語法規則。掌握Set和Map兩種常用集合的使用方法。第十一章JAVA提供了多種集合的定義方式,主要有Set和Map兩個接口,每個接口又包括自己的子接口,實現具體的邏輯功能。11.1Set和MapSet集合里面存放的對象是無序且不允許重復的,集合中的對象不按照特定的排序方式存放,只是將用戶要添加的對象加入集合。Set常用的子接口有兩個,下面分別進行介紹。1.HashSetHashSet基于HashMap來完成功能,是對HashMap進行了重定義,并且在HashSet中僅僅使用了HashMap中的key來實現各種應用,并不像HashMap那樣,value必須跟key成對出現。HashSet的key不允許重復(HashMap的key也不允許重復,如果重復就會覆蓋),允許有null值。11.1.1Set集合HashSet集合的常用方法TreeSet基于TreeMap來完成功能。TreeSet集合是根據存入的元素進行排序或根據創建集合時提供的比較器進行排序,具體排序規則取決于定義TreeSet時使用的構造方法。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】創建一個長度為3的字符串數組,依次存入3個字符串并將這3個字符串輸出,再用Set集合來改寫此功能改用Set集合實現的程序如下: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】創建一個長度為3的字符串數組,依次存入3個字符串并將這3個字符串輸出,再用Set集合來改寫此功能也可以用Set和for循環遍歷來實現上述功能:for(Stringstr:arr){System.out.println(str);}【例11-1】創建一個長度為3的字符串數組,依次存入3個字符串并將這3個字符串輸出,再用Set集合來改寫此功能Map集合里面存放的是鍵值對(key-value),鍵不能重復,而值可以重復。對Map的訪問是通過對鍵的遍歷來找到對應的值,而上一小節所介紹的Set集合,就是直接遍歷,Map集合多了對鍵的遍歷。其實,對Map集合的遍歷,就是對Set集合的遍歷,然后得到鍵所對應的值。Map集合的子集有4個,下面分別進行介紹。11.1.2Map
集合HashMap是以數組方式進行數據存儲的,允許key或value中的一個或兩個為null。key不可以重復而value可以重復。這里要強調的是,雖然null可以作為key來使用,但是由于其唯一性的要求,所以不能在一個集合里有兩個null作為key。1.HashMapHashMap集合的常用方法2.HashTableHashTable與HashMap類似,它支持線程的同步,即任一時刻只能有一個線程能寫入HashTable,這也導致了HashTable在寫入時會比較慢。HashTable繼承自Dictionary類,與HashMap不同的是,它不允許記錄的key或value為null,同時效率較低。LinkedHashMap保存了記錄的插入順序,在用iterator遍歷LinkedHashMap時,先得到的記錄先插入,在遍歷時也會比HashMap慢,擁有HashMap的全部功能及特性。3.LinkedHashMapTreeMap基于紅黑二叉樹實現,不允許有null值,key不可以重復,value
允許重復。存入TreeMap的元素應當實現Comparable接口或Comparator接口。TreeMap存入元素時對元素進行自動排序,迭代輸出的時候就按排序順序輸出。4.TreeMap將Map中所有的鍵存入Set集合。因為Set具備迭代器,所以具有迭代器功能。所有可以通過迭代方式取出的鍵值,都可利用get()方法獲取每一個鍵值對應的value。keySet():被操作對象在經過迭代處理后,就只能通過get()方法來獲取key。取到的結果會亂序,是因為取得數據行主鍵的時候,使用了keySet()方法,而這個方法返回的Set結果,其里面的數據是亂序排放的。【例11-2】用3種方法,實現Map集合的遍歷輸出【例11-2】用3種方法,實現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】在這個例題中我們可以用第二種方法即Collection的values()獲取所有的值Set<Map.Entry<K,V>>entrySet()方法返回此映射中包含的映射關系Set視圖。(一個關系就是一個鍵-值對),把(key-value)作為一個整體一對一對地存放到Set集合當中。Map.Entry表示映射關系。entrySet()表示迭代后可以用e.getKey()以及e.getValue()兩種方法來取key和value,返回的是Entry接口。建議使用第三種遍歷方法,因為這種方法的效率最高。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對象的Set集合Map.Entry包含了key和value對象Set<Map.Entry<IntegerString>>set=arr.entrySet();Iterator<Map.Entry<IntegerString>>it=set.iterator();while(it.hasNext()){//返回的是封裝了key和value對象的Map.Entry對象Map.Entry<IntegerString>en=it.next();//獲取Map.Entry對象中封裝的key和value對象Integerkey=en.getKey();Stringvalue=en.getValue();System.out.println("key="+key+"?value="+value);}}}
List也是一種早期常常使用的一種結合方式,List里存放的對象是有序的,可以重復的,List關注的是索引,擁有一系列和索引相關的方法,查詢速度快。但是向List集合里插入或刪除數據時,會伴隨著后面數據的移動,所有插入刪除數據速度比較慢。List集合常用的子集合有兩個。(1)ArrayListArrayList是基于數組的,在初始化ArrayList時,會構建空數組(Object[]elementData={})。ArrayList是一個無序的,它是按照添加的先后順序排列。(2)LinkedListLinkedList是基于鏈表的,它是一個雙向鏈表,每個節點維護了一個prev和next指針。同時對于這個鏈表,維護了first和last指針,first指向第一個元素,last指向最后一個元素。LinkedList是一個無序的鏈表,按照插入的先后順序排序,不提供sort方法對內部元素排序。11.1.4集合總結11.1.3其他集合11.1.4集合總結常見的三大類集合,各有優缺點,在實際使用時,建議采用這樣的原則:某個集合的優點可以滿足需求而缺點又不影響需求的實現,就選擇這個集合;而當需求跟任何一個集合都不沖突時,建議優先選擇效率高、占用資源少的集合。各集合的對比生產企業根據對大數據的處理分析,指導企業的生產和銷售。以一個羽絨服企業“雙11”的羽絨服銷售為例:在每年6月份根據去年羽絨服的銷量先生產10%,在9月份會根據網上瀏覽量再生產30%,在11月初根據用戶加購量和收藏量再生產30%,在11月11日后根據用戶的購買量生產剩余的30%。大數據對企業的生產引導模式,使企業更好地為客戶服務。高科技為人們帶來了優質生活,作為未來的計算機從業人員,我們不能只享受前人帶來的便捷,更要努力學好知識,用我們的本領讓國家變得更強大。課后思考:大數據是怎樣指導企業生產的?11.2.1網絡聊天工具在第10章中,雖然實現了在數據庫中判斷用戶名和密碼,但是無法實現同步功能,即當有用戶登錄時,其他已登錄的用戶應該知道這個用戶已登錄。本節利用集合的知識,實現同步功能。1.設計思路(1)在數據庫中保存用戶名和密碼。(2)利用集合的知識,實現登錄后聊天界面下拉列表框的用戶名同步,且這兩個人的聊天內容不會發給其他用戶。(3)其他幾個界面的程序不需要改變。11.2集合案例2.遇到的問題如何用集合實現兩個用戶的消息同步?【解決問題】利用集合的特點,即可以保存不同的數據類型,來分別保存服務器通信的用戶名、留言及使用的端口,當服務器檢測到有用戶登錄時,就會向其他用戶的下拉列表框同步剛剛登錄的這個用戶的用戶名。而當一個用戶向另一個用戶發送消息時,服務器會向聊天的雙方而不是其他人,發送剛剛收到的消息。以上兩種情況,都可以通過集合來完成,我們新增以下代碼://------------服務器程序中加入代碼------------//服務器監聽和接收客戶端信息及獲取客戶端的端口信息HashMap<String?Socket>hm=newHashMap<String?Socket>();//判斷當前有多少個客戶端已經登錄到服務器ArrayList<Socket>userList=newArrayList<Socket>();
11.2集合案例到這里我們用了5個章節的內容,完成了一個聊天室的程序的編寫,實現了群聊天的功能。有了前面的知識,現在我們就來升級我們的聊天室程序。群成員登錄界面、注冊界面、“我是群主”的群聊天界面、“游來游去的小魚”的群聊天界面、“游來游去的小魚”發送信息后的群聊天界面、注冊成功后的界面及Dream用戶注冊后的群聊天界面分別如下圖所示。11.2.2中國夢聊天室到這里我們用了5個章節的內容,完成了一個聊天室的程序的編寫,實現了群聊天的功能。有了前面的知識,現在我們就來升級我們的聊天室程序。群成員登錄界面、注冊界面、“我是群主”的群聊天界面、“游來游去的小魚”的群聊天界面、“游來游去的小魚”發送信息后的群聊天界面、注冊成功后的界面及Dream用戶注冊后的群聊天界面分別如下圖所示。11.2.2中國夢聊天室11.2.2中國夢聊天室圖
11-5
群成員登錄界面圖
11-6
注冊界面11.2.2中國夢聊天室圖
11-7
“
我是群主”的群聊天界面圖
11-8
“
游來游去的小魚”的群聊天界面11.2.2中國夢聊天室圖
11-10
注冊成功后的界面圖
11-11
Dream
用戶注冊后的群聊天界面圖
11-9
“
游來游去的小魚”
發送消息后的群聊天界面1.設計思路(1)在10.4小節的程序上進行修改。(2)運用集合保存服務器及群成員的通信信息。(3)服務器根據集合存儲的進程分發群成員的聊天信息。(4)新用戶注冊時應實時地在群成員中顯示新成員昵稱。2.遇到的問題(1)服務器如何知道都有哪些客戶端連接進來?(2)何時分發群成員的聊天信息?
(3)如何實現向進群的所有用戶分發統一消息?(4)如何實現當新用戶注冊時,實時地在群成員中顯示新成員昵稱。11.2.2中國夢聊天室【解決問題1】通過在客戶端程序中設置“開始聊天”這個標志,來記錄連接到服務器的客戶端。【解決問題2】當有群用戶向群里發送消息時,在把消息存入數據庫的同時,實時向群里的其他成員分發聊天信息。【解決問題3】群成員登錄時,就會在服務器記錄其用戶名及登錄信息(Socket信息),當有群成員向群里發送消息時,就向保存的所有用戶(消息發布者除外)發送同一個消息。【解決問題4】可以利用解決問題3的方法來解決此問題。4.知識擴展(1)如何在成員昵稱的后面加上登錄賬號?(2)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 生態園藝項目的可行性分析試題及答案
- 監理員應聘筆試題及答案
- 學生素質拓展與輔導員引導方式試題及答案
- 輔導員招聘面試自我調節能力試題及答案
- 高校輔導員與家長溝通技巧試題及答案
- 2024年農藝師考試的應對挑戰技巧試題及答案
- 農業經理人考試復習策略的有效性分析試題及答案
- 理論結合實踐2024年農藝師考試的技巧試題及答案
- 2024年福建事業單位考試備考中常見的錯誤試題及答案
- 農業職業經理人考試經典案例試題及答案
- 青春期生殖保健知識講座
- 紀檢辦案培訓課件
- 核事故現場處置和救援方案
- 機房吸音墻施工方案范本
- 高考語文小說專題閱讀(9)2019年新高考I卷《理水》原文+真題+答案+解析
- 第7課《大雁歸來》課件(共14張)語文八年級下冊
- 江蘇省蘇州市蘇州地區校2024屆中考一模數學試題含解析
- 基本醫療保險關系轉移接續申請表、聯系函、信息表
- 讀書分享讀書交流會《人生海海》
- 車棚施工方案
- 汽車罐車常壓容器檢驗合格證
評論
0/150
提交評論