版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章集合框架《Java面向对象程序设计案例教程(第2版)》目录/Contents8.18.28.3集合概述Collection接口Map接口8.4
Set接口8.5
集合遍历8.6
泛型思政要点/Point创新思维
1.鼓励学生探索不同集合的特点和应用场景,培养他们的创新思维能力。社会责任
2.在软件开发过程中,合理使用集合框架可以帮助优化程序性能,减少资源消耗科学态度
3.在学习过程中保持严谨的态度,认真对待每一个概念和细节,培养科学的研究方法。集合概述8.1
为了在程序中保存数目不确定的对象,Java提供了一系列特殊的类,这些类可以存储任意类型的对象,并且长度可变,这些类统称为集合。集合类都位于java.util包中,使用时必须导包。集合按照其存储结构可以分为两大类,即单列集合Collection和双列集合Map,这两种集合的特点具体如下。8.1集合概述图8-1集合类的继承系Collection接口8.28.1Collection接口类描述LinkedList对一个集合的扩展与适应必须是简单的,因此整个集合框架围绕一组标准接口而设计。可以直接使用这些接口的标准实现集合框架,如LinkedList类、HashSet类与TreeSet类等。除此之外,可以通过这些接口实现用户自定义的集合ArrayList该类实现了List接口,且实现了可变大小的数组,随机访问与遍历元素时,该类能够提供更好的性能。该类也是非同步的,在多线程的情况下不能使用该类。ArrayList数据增加时,增长率为当前长度的50%,且该类的插入及删除效率低HashSet该类实现了Set接口,不允许出现重复元素,不保证集合中元素的顺序,允许包含值为null的元素,但最多只能包含一个值为null的元素TreeSet该类实现了Set接口,可以实现排序等功能HashMapHashMap是一个散列表,它存储的内容是键值对映射。该类实现了Map接口,其根据键的HashCode值存储数据,具有很快的访问速度,最多允许一条记录的键为null,不支持线程同步TreeMap该类继承了AbstractMap抽象类,AbstractMap实现了大部分的Map接口。TreeMap的实现使用红黑树的数据结构表8-1Collection接口的实现类List接口8.38.3List接口
List接口继承自Collection接口,是单列集合的一个重要分支。List集合允许出现重复的元素,所有的元素是以一种线性方式进行存储的,在程序中可以通过索引访问List集合中的指定元素。另外,List集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致。
List作为Collection集合的子接口,不但继承了Collection接口中的全部方法,还增加了一些根据元素索引操作集合的特有方法。其主要的实现类是ArrayList与LinkedList。8.3.1ArrayList集合
ArrayList是List接口的一个实现类,它是程序中最常见的一种集合。在rrayList内部封装了一个长度变的数组对象,当存人的元素超过数组长度时,ArrayList会在内存中分配一个更大的数组来存储这些元素,因此可以将ArrayList集合看作一个长度可变的数组。ArrayList集合中大部分方法都是从父类Collection和List继承过来的,其中add()方法和get()方法分别用于实现元素的存人和取出。下面通过一个案例学习ArrayList集合的元素存取。8.3.1ArrayList集合importjava.util.*;publicclassExample01{publicstaticvoidmain(String[]args){ArrayListlist=newArrayList();//创建ArrayList集合list.add("张三"); //向集合中添加元素 list.add("李四"); list.add("王五");list.add("赵六"); //获取集合中元素的个数 System.out.println("集合的长度:"+list.size()); //取出并打印指定位置的元素 System.out.println("第2个元素是:"+list.get(1)); } }示例代码8.3.2LinkedList集合
LinkedList与ArrayList都是List接口的实现类,所以它们的添加、删除与遍历的操作方式基本相同,但是它们也有一些区别。从名称上来看,ArrayList是Array(动态数组)数据结构,LinkedList是Link(链表)数据结构。此外,它们两个都是对List接口的实现。前者是数组队列,相当于动态数组;后者是双向链表结构,也可用作堆栈、队列、双端队列。当随机访问List接口(使用get或set方法)时,ArrayList比LinkedList的效率更高。因为LinkedList是线性的数据存储方式,其需要移动指针从前往后依次进行查找。总结ArrayList与LinkedList的区别如下。1.ArrayList是List接口的一种实现,它是使用数组来实现的。LinkedList是List接口的一种实现,它是使用链表来实现的。2.AmrayList遍历与查找元素较快,LinkedList遍历与查找元素较慢。3.ArrayList添加、删除元素较慢,LinkedList添加、删除元素较快。Map接口8.48.4Map接口方法声明功能描述voidput(Objectkey,Objectvalue)将指定的值与此映射中的指定健关联(可选操作)Objectget(Objectkey)返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回nullVremove(Objectkey)根据键删除对应的值,返回被删除的值intsize()返回集合中的键值对的个数booleancontainsKey(Objectkey)如果此映射包含指定键的映射关系,则返回truebooleancontainsValue(Objectvalue)如果此映射将一个或多个键映射到指定值,则返回trueSetkeySet()返回此映射中包含的键的Set视图Collection<V>values()返回此映射中包含的值的Collection视图Set<Map.Entry<K,V>>entrySet()返回此映射中包含的映射关系的Set视图表8-2Map接口的实现类8.4.1HashMap集合
HashMap是最常用的Map实现类,其特点为保存元素时先进后出,元素是无序的;查询效率比较高;键值对可以为null,但最多只能有一个null;不支持线程同步,即如果有多个线程同时写HashMap,可能会导致数据不一致,如果数据需要同步,则可以使用Collection接口的synchronizedMap方法。8.4.1HashMap集合importjava.util.*;publicclassExample02{publicstaticvoidmain(String[]args){HashMapmap=newHashMap();//存储键和值//创建Map对象map.put("1","张三");map.put("2","李四");map.put("3","王五");System.out.println("1:"+map.get("1")); //根据键获取值 System.out.println("2:"+map.get("2"));System.out.println("3:"+map.get("3"));}}示例代码8.4.1HashMap集合在程序开发中,经常需要取出Map中所有的键和值,那么如何遍历Map中所有的键值对呢?有两种方式可以实现,第一种方式就是先遍历Map集合中所有的键,再根据键获取相应的值。下面通过一个案例来演示先遍历Map集合中所有的键,再根据键获取相应的值。8.4.1HashMap集合importjava.util.*;publicclassExample03{publicstaticvoidmain(String[]args){HashMapmap=newHashMap();//创建Map集合map.put("1","张三");//存储键和值map.put("2","李四");map.put("3","王五");SetkeySet=map.keySet(); //获取键的集合 Iteratorit=keySet.iterator(); //迭代键的集合 while(it.hasNext()){Objectkey=it.next();Objectvalue=map.get(key);//获取每个键所对应的值System.out.println(key+":"+value);}}}示例代码8.4.1HashMap集合在上面代码中,首先调用Map对象的KeySet()方法,获得存储Map中所有键的Set集合,然后通过Iterator迭代Set集合的每一个元素,即每一个键,最后通过调用get(Stringkey)方法,根据键获取对应的值。Map集合的另外一种遍历方式是先获取集合中的所有的映射关系,然后从映射关系中取出键和值。下面通过一个案例演示这种遍历方式。8.4.1HashMap集合importjava.util.*;publicclassExample04{publicstaticvoidmain(String[]args){HashMapmap=newHashMap(); //创建Map集合 map.put("1","张三"); //存储键和值 map.put("2","李四");map.put("3","王五");//获取Iterator对象SetentrySet=map.entrySet(); Iteratorit=entrySet.iterator();while(it.hasNext()){//获取集合中键值对映射关系Map.Entryentry=(Map.Entry)(it.next());Objectkey=entry.getKey();//获取Entry中的键Objectvalue=entry.getValue();//获取Entry中的值System.out.println(key+":"+value);}}}
示例代码8.4.2LinkedHashMap集合LinkedHashMap内部是双向链表结构,其保存了元素插入的顺序,支持线程同步。LinkedHashMap是HashMap的子类,因此其put、get等常用方法与HashMap一致,示例代码如下。importjava.util.*;publicclassExample05{publicstaticvoidmain(String[]args){LinkedHashMapmap=newLinkedHashMap(); //创建Map集合 map.put("3","李四");//存储键和值map.put("2","王五");map.put("4","赵六");SetkeySet=map.keySet();Iteratorit=keySet.iterator();while(it.hasNext()){Objectkey=it.next();Objectvalue=map.get(key);//获取每个键所对应的值System.out.println(key+":"+value);}}}8.4.3TreeMap集合importjava.util.Iterator;importjava.util.Set;importjava.util.TreeMap;publicclassExample06{publicstaticvoidmain(String[]args){TreeMapmap=newTreeMap(); //创建Map集合 map.put(3,"李四");//存储键和值map.put(2,"王五");map.put(4,"赵六");map.put(3,"张三");SetkeySet=map.keySet();Iteratorit=keySet.iterator();while(it.hasNext()){Objectkey=it.next();Objectvalue=map.get(key);//获取每个键所对应的值System.out.println(key+":"+value);}}}
示例代码Set接口8.58.5Set接口Set接口与List接口一样继承自Collection接口,因此其操作方式与List基本一致,但是其不允许存储重复元素,并且由于St集合是无序集合,所以元素存储顺序与取出顺序不同。一个Set中最多包含一个空元素。Set接口主要有HashSet和TreeSet两大实现类。8.5.1HashSet接口HashSet类直接实现了Set接口,其底层是通过包装一个HashMap实现的。HashSet采用HashCode算法存取集合中的元素,因此具有较好的读取与查找性能。HashSet不但无法保证元素插入的顺序,而且集合中元素的顺序中也可能发生变化,HashSet终端元素顺序由HashCode存储对象(元素)决定,因而对象变化可能会导致HashCode变化。HashSet是非线程安全的,因此跨线程使用可能会影响最终的结果。HashSet元素值可以为空。8.5.1HashSet接口importjava.util.*;publicclassExample07{publicstaticvoidmain(String[]args){HashSetset=newHashSet(); //创建HashSet集合 set.add("张三"); //向该Set集合中添加字符串 set.add("李四");set.add("王五");set.add("李四"); //向该Set集合中添加重复元素 Iteratorit=set.iterator(); //获取Iterator对象 while(it.hasNext()){ //通过while循环,判断集合中是否有元素Objectobj=it.next(); //如果有元素,就通过迭代器的next()方法获取元素 System.out.println(obj);}}}
示例代码8.5.2TreeSet接口importjava.util.*;publicclassExample07{publicstaticvoidmain(String[]args){HashSetset=newHashSet(); //创建HashSet集合 set.add("张三"); //向该Set集合中添加字符串 set.add("李四");set.add("王五");set.add("李四"); //向该Set集合中添加重复元素 Iteratorit=set.iterator(); //获取Iterator对象 while(it.hasNext()){ //通过while循环,判断集合中是否有元素Objectobj=it.next(); //如果有元素,就通过迭代器的next()方法获取元素 System.out.println(obj);}}}
示例代码8.5.2TreeSet接口importjava.util.TreeSet;publicclassExample08{publicstaticvoidmain(String[]args){TreeSetts=newTreeSet();ts.add(3);ts.add(1);ts.add(1);ts.add(2);ts.add(3);System.out.println(ts);}}
示例代码集合遍历8.68.6.1Iterator遍历集合可以利用Collection中的Iterator来遍历集合中的元素。Iterator主要用于迭代访问Collection中的元素,Iterator对象也被称为迭代器。使用Iterator遍历集合的主要过程如下。(1)利用集合的iterator()方法获得迭代器对象。集合遍历(2)使用迭代器对象的hasNext()方法循环判断集合中是否存在下一个元素,如果存在,则调用其next()方法将元素取出,否则说明已经到达了集合末尾,停止遍历集合。下面通过一个案例演示利用Iterator遍历List集合和Set集合。8.6.1Iterator遍历集合importjava.util.ArrayList;importjava.util.Iterator;importjava.util.TreeSet;publicclassExample09{publicstaticvoidmain(String[]args){ArrayListlist=newArrayList();list.add(4);list.add(3);list.add(1);list.add(5);System.out.println("ArrayList集合中元素:"+list);System.out.print("利用lterator遍历ArrayList:");Iteratoriterator=list.iterator(); //获取迭代器对象 //循环判断集合中是否存在下一个元素while(iterator.hasNext()){Objectobj=iterator.next(); //取出集合中的下一个元素 System.out.print(obj+"");}示例代码System.out.println();TreeSetts=newTreeSet();ts.add(3);ts.add(2);ts.add(5);System.out.println("TreeSet集合中元素:"+ts);System.out.print("利用lterator遍历TreeSet:");Iteratoriterator2=ts.iterator(); //获取迭代器对象 //循环判断集合中是否存在下一个元素while(iterator2.hasNext()){Objectobj=iterator2.next();//取出集合中的下一个元素System.out.print(obj+"");}}}8.6.2forEach遍历集合importjava.util.ArrayList;importjava.util.TreeMap;importjava.util.TreeSet;publicclassExample12{publicstaticvoidmain(String[]args){ArrayListlist=newArrayList();list.add(3);list.add(2);list.add(5);System.out.println("ArrayLis集合中元素:"+list);System.out.print("forEach遍历ArrayList集合:");list.forEach(obj->System.out.print(obj+""));System.out.println();TreeSetts=newTreeSet();ts.add(3);ts.add(2);ts.add(5);示例代码System.out.println("TreeSet集合中元素:"+ts);System.out.print("forEach遍历TreeSet集合:");ts.forEach(obj->System.out.print(obj+""));System.out.println();TreeMaptm=newTreeMap();tm.put(3,"lilly");tm.put(2,"tom");tm.put(4,"rose");System.out.println("TreeMap集合中元素:"+tm);System.out.println("forEach遍历TreeMap集合:");tm.forEach((key,value)->System.out.println(key+":"+value));}}8.6.3for循环遍历集合importjava.util.ArrayList;importjava.util.LinkedList;publicclassExample13{publicstaticvoidmain(String[]args){ArrayListal=newArrayList();al.add(3);al.add(2);al.add(4);System.out.println("ArrayList集合中元素:"+al);System.out.print("for循环遍历ArrayList集合:");for(inti=0;i<al.size();i++){System.out.print(al.get(i)+"");}示例代码System.out.println();LinkedListll=newLinkedList();ll.add(30);ll.add(20);ll.add(40);System.out.println("LinkedList集合中元素:");System.out.print("for循环遍历LinkedList集合:");for(inti=0;i<ll.size();i++){System.out.print(ll.get(i)+"");}}}泛型8.78.7泛型importjava.util.Arr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高校学生资助政策的精准识别机制-基于家庭经济困难学生认定指导意见
- 2025四川绵阳市盐亭发展投资集团有限公司招聘职能部门及所属子公司人员7人考试备考题库及答案解析
- 2026辽宁本溪市教育系统冬季名校优生引进急需紧缺人才4人(本溪市第一中学)考试备考题库及答案解析
- 2025重庆联交所集团所属单位招聘1人模拟笔试试题及答案解析
- 《平行四边形面积》数学课件教案
- 2025宁夏沙湖旅游股份有限公司招聘6人(第二批)参考考试题库及答案解析
- 2025四川港荣数字科技有限公司第一批项目制员工招聘3人模拟笔试试题及答案解析
- 2025广东东莞市南城第一初级中学招聘1人参考笔试题库附答案解析
- 2025年西安高新区第十一初级中学教师招聘参考考试题库及答案解析
- 2025青海西宁湟源县青少年活动中心教师招聘1人参考考试题库及答案解析
- 数据资产会计核算的现状与问题研究
- 监理履约考核管理办法
- 艾梅乙培训课件
- 货物运输安全管理制度
- 《电子工业全光网络工程技术规范》
- 3 面粉码垛机器人的结构设计
- 肝癌介入免疫联合-洞察及研究
- 卫生毒理学课程教学大纲
- 涂氟及窝沟封闭的治疗
- 脑梗塞所致精神障碍病人护理
- 露天煤矿安全用电培训
评论
0/150
提交评论