版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026年重庆市驾驶理论模拟试卷
- 2026年重庆市人教版部编版高一数学必修第一册单元测试卷
- 2025-2026年四川省人教版四年级英语下册第7单元课时作业
- 2026年江苏省苏教版高中化学必修第一册第4章元素周期律测试题
- 2025-2026年浙江省人教版初中物理下册第8章同步练习题
- 2025-2026年人教版高中生物高二年级下册细胞结构与功能习题
- 2025-2026年交通安全法规与驾驶行为测试卷
- 2025-2026年吉林省北师大版高二语文现代文阅读强化试卷
- Z世代审美变迁驱动刻花玻璃杯产品迭代策略研究
- ESG评级体系下全棉农业端社会责任投资的财务转化路径
- 2026年武汉市武昌区新七年级语文入学分班摸底卷(含阅读解析作文范文与评分标准)
- 2026年高考生物真题完全解读(河北卷)
- 2026年保卫管理员三级考试真题及答案
- 防火门施工方案及流程
- 2026年固原市法院员额法官遴选考试经典试题及答案
- 围堰施工方案(完整版)
- 人教版八年级体育与健康第一章第一节体育与健康理论知识体育课中的运动损伤和处理课件(共23张)
- SLT 336-2025水土保持工程全套表格
- 《血管内导管相关性血流感染预防与诊治指南(2025)》解读
- 新教材部编版小学一年级上册语文核心素养教学全册教案(教学设计)完整版(表格版)
- 门诊病历书写培训课件
评论
0/150
提交评论