第6章 集合与泛型_第1页
第6章 集合与泛型_第2页
第6章 集合与泛型_第3页
第6章 集合与泛型_第4页
第6章 集合与泛型_第5页
已阅读5页,还剩136页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章集合与泛型《Java基础案例教程》(第3版)学习目标/Target熟悉集合,能够简述集合的特点和Java集合框架的继承体系熟悉List集合的作用,能够简述List集合常用的方法以及常用实现类的特点Collection集合的作用,能够简述Collection集合的常用方法熟悉Set集合的作用,能够简述Set集合常用实现类的特点学习目标/Target掌握集合的遍历,能够使用Iterator迭代器和增强for循环遍历集合掌握泛型的使用方法,能够使用泛型指定集合中元素的类型掌握ArrayList集合和LinkedList集合的使用方法,能够使用ArrayList集合和LinkedList集合的方法实现数据的增删改查掌握Map集合的作用,能够简述Map集合常用的方法以及常用实现类的特点学习目标/Target掌握HashMap集合和TreeMap集合的使用,能够使用HashMap集合和TreeMap集合的方法实现数据的增删改查熟悉Stream流的使用,能够使用Stream流对集合进行各种操作掌握HashSet集合和TreeSet集合的使用,能够使用HashSet集合和TreeSet集合的方法实现数据的增删改查章节概述/

Summary在Java程序中可以通过数组来保存数据,但有时无法确定需要保存数据的数量,因为数组的长度不可变,此时再使用数组存储数据则不太合适。这种情况可以使用集合,Java中的集合就像一个可以存储任意类型的对象并且长度可变的容器。Java中提供了多种具有不同特性的集合类,为了让集合在使用时更加安全,还提供了泛型。本章将对Java中的集合和泛型进行讲解。目录/Contents0102集合概述Collection集合0304List集合集合的遍历目录/Contents0506泛型Set集合0708Map集合Stream流集合概述6.16.1集合概述熟悉集合概述,能够简述集合的特点和Java集合框架的继承体系

先定一个小目标!6.1集合概述Java中的集合是指Java提供的一系列接口和实现类,通过这些接口和实现类可以很方便地存储和管理对象,Java中的集合位于java.util包中,其按照存储结构可以分为单列集合Collection和双列集合Map两大类,单列集合中每个元素是一个独立的单一数据,而双列集合中每个元素由两个数据组成。6.1集合概述Collection集合单列集合类的根接口,它有两个重要的子接口,分别为List和Set。其中,List中存放的元素有序且可重复,常用的实现类有ArrayList和LinkedList;Set存放的元素无序且不允许有重复元素,常用的实现类有HashSet和TreeSet。Map集合双列集合类的根接口,用于存储具有键(Key)和值(Value)映射关系的键值对。其中,键是用于唯一标识一个元素的对象,值是与该键相关联的对象,在使用Map集合时可以通过指定的键找到对应的值。Map集合的主要实现类有HashMap和TreeMap。6.1集合概述集合类的继承体系。虚线框是接口,实线框是实现类。Vector类和HashTable类是线程安全类,但不考虑多线程时,效率相对低一些,非多线程程序中建议使用ArrayList代替Vector,HashMap代替HashTable。Collection集合6.26.2Collection集合熟悉Collection集合的作用,能够简述Collection集合的常用方法

先定一个小目标!6.2Collection集合Collection集合是所有单列集合的根接口,Collection集合常用的方法。方法声明功能描述booleanadd(Ee)向集合中添加一个元素,E是所添加元素的数据类型booleanaddAll(Collectionc)将指定集合c中的所有元素添加到当前集合中voidclear()删除集合中的所有元素booleanremove(Objecto)删除集合中的指定元素o,当集合中包含了多个元素o时,只删除第1个符合条件的元素booleanremoveAll(Collectionc)删除当前集合中在集合c中存在的所有元素booleanisEmpty()判断集合是否为空booleancontains(Objecto)判断集合中是否存在指定元素obooleancontainsAll(Collectionc)判断集合中是否存在指定集合c中的所有元素Iteratoriterator()返回集合的迭代器(Iterator),迭代器用于遍历当前集合的所有元素intsize()获取集合中元素的个数List集合6.36.3List集合List集合是继承自Collection集合的一个接口,是单列集合的一个重要分支,下面对List集合的相关知识进行讲解。6.3.1List集合简介熟悉List集合的作用,能够简述List集合常用的方法以及常用实现类的特点

先定一个小目标!6.3.1List集合简介List集合是一个有序集合,允许存储重复的元素。List集合中的元素按照插入的顺序进行存储,并且可以通过索引访问和操作其中的元素。6.3.1List集合简介List集合不但继承了Collection集合中的全部方法,还提供了一些根据元素索引操作集合的特有方法。方法声明功能描述voidadd(intindex,Objectelement)将对象element插入List集合的index索引处booleanaddAll(intindex,Collectionc)将集合c中的所有元素插入到List集合的index索引处Objectget(intindex)返回集合中索引位置为index的元素Objectremove(int

index)删除集合中索引位置为index的元素Objectset(int

index,Object

element)将索引位置为index的元素替换成element对象,并将替换后的对象返回intindexOf(Object

o)返回对象o在List集合中第一次出现的索引位置intlastIndexOf(Object

o)返回对象o在List集合中最后一次出现的索引位置ListsubList(int

fromIndex,int

toIndex)返回从索引fromIndex(包括)到

toIndex(不包括)的所有元素组成的子集合6.3.2ArrayList集合掌握ArrayList集合的使用,能够使用ArrayList实现数据的增删改查

先定一个小目标!6.3.2ArrayList集合ArrayList集合是List集合的一个实现类,其内部封装了一个长度可变的数组对象,当存入的元素超过数组长度时,ArrayList会分配一个更大的数组来存储这些元素,因此可以将ArrayList集合看作一个长度可变的数组。ArrayList具有数组的特点,即读取元素效率较高,插入和删除元素时,可能需要移动其他元素的位置,导致效率相对低一些。6.3.2ArrayList集合ArrayList集合的构造方法。方法声明功能描述ArrayList()创建一个初始容量为10的空ArrayList对象ArrayList(intinitialCapacity)创建一个指定初始容量的空ArrayList对象ArrayList(Collection<?extendsE>c)创建一个包含指定Collection元素的ArrayList对象6.3.2ArrayList集合ArrayList集合提供了三种构造方法。方法声明功能描述ArrayList()创建一个初始容量为10的空ArrayList集合ArrayList(intinitialCapacity)创建一个指定初始容量的空ArrayList集合ArrayList(Collection<?extendsE>c)创建一个包含指定Collection元素的ArrayList集合6.3.2ArrayList集合通过一个案例演示ArrayList集合的基本操作。案例演示Example01.java源代码6.3.2ArrayList集合案例的运行结果如下图所示。案例演示6.3.3LinkedList集合掌握LinkedList集合的使用,能够使用LinkedList实现数据的增删改查

先定一个小目标!6.3.3LinkedList集合ArrayList集合在查询元素时速度很快,但在增删元素时效率相对低一些。如果需要频繁向集合中插入和删除元素,可以使用List集合的另一个实现类LinkedList。6.3.3LinkedList集合LinkedList底层结构:双向循环链表。链表中每个节点都通过引用的方式记录它前一个或后一个节点,从而将所有节点连接在一起。LinkedList集合插入和删除元素的过程如下图所示。6.3.3LinkedList集合LinkedList集合除了包含从List集合继承过来的方法,还定义了一些自身特有的方法。方法声明功能描述voidaddFirst(Object

o)将指定元素o插入集合的开头voidaddLast(Object

o)将指定元素o添加到集合的结尾Object

getFirst()返回集合的第一个元素Object

getLast()返回集合的最后一个元素Object

removeFirst()移出并返回集合的第一个元素Object

removeLast()移出并返回集合的最后一个元素6.3.3LinkedList集合下面通过一个案例演示LinkedList常用方法的使用。案例演示Example02.java源代码6.3.3LinkedList集合案例的运行结果如下图所示。案例演示集合的遍历6.46.4集合的遍历掌握集合的遍历,能够使用Iterator迭代器和增强for循环遍历集合

先定一个小目标!6.4集合的遍历在开发中,对集合进行遍历是非常常见的操作。Java提供了一个接口Iterator,用于遍历Collection集合中的元素。同时,Java还提供了增强for循环,也称为for-each循环,增强for循环在遍历数组或者实现了Iterable接口的集合对象时非常方便,它会自动迭代集合中的每个元素,无须手动管理索引值。6.4集合的遍历1.使用Iterator迭代器遍历集合使用Iterator迭代器访问集合中的元素的常用方法。方法声明功能描述booleanhasNext()判断集合中是否还有下一个元素可以访问Objectnext()返回集合中的下一个元素,并将迭代指针移到下一个位置voidremove()从集合中移除通过next()方法获取到的元素6.4集合的遍历1.使用Iterator迭代器遍历集合下面通过一个案例演示如何使用Iterator接口的方法对集合进行遍历。Example03.java源代码6.4集合的遍历1.使用Iterator迭代器遍历集合案例的运行结果如下图所示。6.4集合的遍历1.使用Iterator迭代器遍历集合Iterator迭代器迭代元素的过程。6.4集合的遍历脚下留心:并发修改异常在使用Iterator遍历集合时,如果在遍历过程中使用集合对象的remove()方法删除元素,会出现并发修改异常。这是Iterator用于检测并发修改的一种机制,当集合在遍历过程中发生结构性修改(例如添加元素,删除元素),迭代器的内部计数器发生变化,从而抛出并发修改异常(ConcurrentModificationException)。6.4集合的遍历脚下留心:并发修改异常下面通过一个案例演示并发修改异常。Example04.java源代码6.4集合的遍历脚下留心:并发修改异常案例的运行结果如下图所示。6.4集合的遍历脚下留心:并发修改异常如果想要安全地删除集合中的元素,可以使用Iterator接口提供的remove()方法,它会在删除元素后通知迭代器集合结构发生了改变,避免出现并发修改异常。下面把Example04.java文件中第13~15行代码修改为如下代码。int[]arr; //声明一个int[]类型的变量arr=newint[3]; //为arr分配3个数组元素的空间修改后再次运行案例,结果如右图所示。6.4集合的遍历2.使用增强for循环遍历集合从JDK5开始,Java提供了增强for循环,简化了Iterator接口遍历的书写。在遍历集合时,增强for循环语法上是在编译时被转换成Iterator迭代器的while循环实现的,因此它适用于实现了Iterator接口的集合类。6.4集合的遍历2.使用增强for循环遍历集合下面通过一个案例演示使用增强for循环遍历集合的方式。Example05.java源代码6.4集合的遍历2.使用增强for循环遍历集合案例的运行效果如下图所示。泛型6.56.5泛型掌握泛型的使用,能够使用泛型指定集合中元素的类型

先定一个小目标!6.5泛型默认情况下把一个对象存入集合后,再次取出该对象时,该对象的编译类型就变成了Object类型。集合设计成这样,提高了通用性,但是也带来了一些类型不安全的问题。例如,集合可以存储任意类型的对象,所以在取出对象时通常需要进行强制类型转换。如果不知道实际参数类型,就无法进行强制类型转换。6.5泛型案例演示下面通过一个案例演示集合存储数据后,可能导致的类型不安全问题。Example06.java源代码6.5泛型案例演示案例的运行结果如下图所示。6.5泛型为了避免进行强制类型转换,同时提高类型的安全性,Java引入了“参数化类型(parameterizedtype)”的概念,也就是泛型。泛型就是指给类型指定一个参数,在使用时再指定此参数的具体值,这样一来就可以根据不同的需求操作不同类型的数据,使得代码更加灵活和可扩展。集合引入泛型之后,会在使用或者调用时传入具体的类型以确定最终的数据类型,所以集合需要存储什么类型的数据,在创建集合时传入对应的类型即可。6.5泛型定义泛型时,类型参数由一对尖括号(<>)包含在中间。下面使用泛型优化文件Example06.java,将第5行代码修改为如下代码。List<Integer>list=newArrayList<>();上述代码指定了List集合中元素的类型为Integer,这样编译器在编译期就会做类型检查,从而限制List集合中只能存储Integer类型的元素。如果在集合中添加其他类型的元素,编译器会提示错误。如下图所示。6.5泛型案例演示下面修改文件Example06.java,将List集合中原来的String类型的元素改为Integer类型,并在遍历List集合时将元素的类型由Object改为Integer。修改后的Example06.java源代码6.5泛型案例演示修改后的案例运行结果如下图所示。6.5泛型除了集合类等一些Java提供的类增加了泛型支持外,还可以根据需要自定义泛型类。例如,当一个类的行为和功能需要适用于多个不同类型的数据时,可以将这个类定义为泛型类。定义泛型类的语法格式如下:多学一招:自定义泛型类[修饰符]class类名<类型形参1,类型形参2,…,类型形参n>{//类的成员变量和成员方法}对上述语法格式的解释:(1)类名<类型形参>:是一个整体的数据类型,通常称为泛型类型。6.5泛型多学一招:自定义泛型类(2)类型形参没有特定的意义,可以用任意一个大写字母表示,但是为了提高可读性,一般会使用有意义的字母表示。E:Element(元素),常在JavaCollection里使用,如List<E>,Iterator<E>,Set<E>。

K,V:Key,Value(Map的键值对)。N:Number(数字)。T:Type(类型),如String,Integer等。在泛型类中,类型形参可以用于指定成员变量的类型,成员方法的形参类型,以及成员方法的返回值类型。6.5泛型多学一招:自定义泛型类除了可以在类中使用泛型,还可以在接口和方法中使用泛型。声明泛型接口的语法格式与泛型类的类似,具体如下:声明泛型方法的格式如下:[修饰符]interface接口名<类型形参1,类型形参2,…,类型形参n>{}[修饰符]<类型形参1,类型形参2,…>返回值类型方法名称(类型形参1形参变量1,类型形参2形参变量2,…){}6.5泛型多学一招:自定义泛型类在泛型类、泛型接口和泛型方法中,泛型类型一旦确定就不能更改。然而,在有些情况下需要指定可以操作的类型为某个类的父类或子类,这时候可以使用限定通配符来限制可操作类型的范围。Java中的限定通配符分为两种,具体如下所示。<?extendsT>,上界通配符。表示限定传入的类型必须为T类型或T类的子类型。<?superT>,下界通配符。表示限定传入的类型必须为T类型或T类的父类型。使用限定通配符后,泛型类型必须用限定内的类型来进行初始化,否则会编译错误。此外,Java中还提供了<?>表示非限定通配符,可以匹配任意类型,用于在泛型类、泛型接口和泛型方法中指定不确定的类型。【案例6-1】社团成员管理案例描述某校创立了一个书法社团,目前正在面向全校学生招募社团成员。本案例要求为该社团做一个社团成员的管理系统,实现对社团成员的添加、移除、修改和查询功能。社团成员管理的具体要求如下。系统首页:用于显示社团成员管理系统的所有功能,并根据用户的选择进行对应的操作。添加功能:添加成员时需要输入成员的编号、姓名、年龄和年级。每个成员的成员编号唯一,若添加的编号已被占用,则提示用户重新输入。【案例6-1】社团成员管理案例描述修改功能:修改功能只支持修改成员的年龄和年级两个信息。修改成员信息时需要输入成员的编号,若成员编号存在,则提示输入修改后的年龄和年级;否则提示成员编号不存在的相关提示。查询功能:查询功能支持查询所有成员和按年级查询某个年级的所有成员。按年级查询成员信息时需要输入指定的年级,若社团中存在该年级的成员,则显示查询到的成员信息;否则,提示社团中没有该年级的成员。移除功能:移除成员时需要输入成员的编号,若成员编号存在,则进行删除并提示删除成功;否则提示成员编号不存在的相关警告。【案例6-1】社团成员管理案例效果【案例6-1】社团成员管理案例效果Set集合6.66.6Set集合Set集合是继承自Collection集合的一个接口,与List集合不同的是,Set集合中存储的元素无序且不允许重复,并且没有索引,因此无法使用普通for循环进行遍历。Set集合中的方法与Collection集合基本一致,常用的实现类有HashSet和TreeSet,下面将对这两个集合进行讲解。6.6.1HashSet集合掌握HashSet集合的使用,能够使用HashSet实现数据的增删改查

先定一个小目标!6.6.1HashSet集合案例演示HashSet集合作为Set集合的一个实现类,它所存储的元素是无序且不可重复的。下面先通过一个案例演示HashSet集合在使用上的特点。Example07.java源代码6.6.1HashSet集合案例演示案例的运行结果如下图所示。6.6.1HashSet集合HashSet集合为什么能确保元素不重复呢6.6.1HashSet集合HashSet集合之所以能确保不出现重复的元素,是因为它在添加元素时做了很多工作。当调用HashSet集合的add()方法添加元素时,首先会调用当前存入对象的hashCode()方法查找哈希值,然后根据哈希值计算该元素在集合中的位置,如果该位置上没有元素,则直接添加元素。如果该位置上有元素存在,则会调用equals()方法让当前存入的元素和该位置上的元素比较,如果返回的结果为false,就将该元素添加到集合,如果返回的结果为true,则说明有重复元素,则将该元素舍弃。6.6.1HashSet集合HashSet集合存储元素的流程。6.6.1HashSet集合案例演示下面通过一个案例演示将自定义学生类Student作为HashSet的元素存入集合。Example08.java源代码6.6.1HashSet集合案例演示案例的运行结果如下图所示。6.6.1HashSet集合需要注意的是,Example08.java的运行结果输出了相同信息的对象,是因为在定义Student类时没有重写hashCode()和equals()方法,对象的比较会使用对象的内存地址进行判断,即两个对象只有在内存中的地址完全相同才会被认为是相同对象。6.6.1HashSet集合下面将学号看作学生的唯一标识,修改文件Example08.java,在Student类中添加重写的hashCode()方法和equals()方法,具体代码如下所示。publicinthashCode(){returnstuId.hashCode();//获取stuId的哈希值}publicbooleanequals(Objectobj){if(this==obj){returntrue;}if(obj==null||!(objinstanceofStudent)){returnfalse;}Studentstudent=(Student)obj;returnthis.stuId.equals(student.stuId);}6.6.1HashSet集合修改后再次运行文件Example08.java,运行结果如下图所示。6.6.1HashSet集合HashSet类有一个子类LinkedHashSet,它的底层也是哈希表的结构,但是还额外增加了双向链表来维护内部元素的存取顺序,因此LinkedHashSet内部元素的存取顺序相同。6.6.1HashSet集合案例演示下面修改文件Example08.java,演示LinkedHashSet的使用。Example09.java源代码6.6.1HashSet集合案例演示案例的运行结果如下图所示。6.6.2TreeSet集合掌握TreeSet集合的使用,能够使用TreeSet实现数据的增删改查

先定一个小目标!6.6.2TreeSet集合TreeSet集合是Set集合的一个实现类,它是一种基于平衡二叉树实现的有序集合。所谓二叉树就是由节点组成的树形数据结构,每个节点最多有两个子节点,分别为左子节点和右子节点。每个节点及其子节点组成的树被称为子树,通常左侧节点组成的树称为左子树,右侧节点组成的树被称为右子树。其中,左子树上的元素小于它的根节点,而右子树上的元素大于它的根节点。6.6.2TreeSet集合TreeSet集合是Set集合的一个实现类,它是一种基于平衡二叉树实现的有序集合。所谓二叉树就是由节点组成的树形数据结构,每个节点最多有两个子节点,分别为左子节点和右子节点。每个节点及其子节点组成的树被称为子树,通常左侧节点组成的树称为左子树,右侧节点组成的树被称为右子树。其中,左子树上的元素小于它的根节点,而右子树上的元素大于它的根节点。平衡二叉树则是在二叉树的基础上增加了平衡限制,控制每个节点的左右子树高度差不大于1,使得二叉树的高度不会太高,提高了插入、查找和删除操作的效率。6.6.2TreeSet集合二叉树中元素的存储结构。6.6.2TreeSet集合TreeSet集合采用二叉树结构存储元素的特殊性质,使得集合中的元素可以根据某种规则进行排序。对于包含String、Integer等Java提供的基本数据类型的元素,它们已经具备默认的排序规则,因此可以直接排序。6.6.2TreeSet集合案例演示下面通过一个案例演示在TreeSet集合中存储Integer类型的数据。Example10.java源代码6.6.2TreeSet集合案例演示案例的运行结果如下图所示。6.6.2TreeSet集合TreeSet集合为什么能对Integer类型的元素排序呢6.6.2TreeSet集合TreeSet集合之所以能够对Integer类型的数据进行排序,是因为Integer类、String类以及其他基本类型的包装类都实现了Comparable接口。在比较元素大小时,TreeSet会调用其重写Comparable接口的compareTo()方法,根据元素类型和实际情况比较元素的大小,实现对集合的整体排序,这种排序称为类的自然排序。6.6.2TreeSet集合通常,compareTo()方法签名的格式如下。publicintcompareTo(Tother){}T表示与当前对象进行比较的对象类型。compareTo()方法会返回一个int类型的整数值来表示对象之间的大小关系。如果当前对象小于other对象,则返回一个负整数。果当前对象大于other对象,则返回一个正整数。如果两个对象相等,则返回0。6.6.2TreeSet集合如果想让自定义对象也能排序,则可以让自定义类实现Comparable接口,并在重写的comparaTo()方法中定义自定义对象之间的比较规则。例如,根据对象的特定属性或者其他需要比较的标准,来确定对象的大小关系。6.6.2TreeSet集合案例演示下面通过一个案例演示在TreeSet集合中存储自定义对象,案例要求存储学生对象并根据学生的年龄升序排序,当年龄相同时按照姓名的升序排序。Example11.java源代码6.6.2TreeSet集合案例演示案例的运行结果如下图所示。6.6.2TreeSet集合除了前面介绍的自然排序外,TreeSet集合还有另一种实现排序的方式,即让TreeSet集合实现Comparator接口,并重写compare()方法,这种排序方式称为自定义排序。compare()方法的返回值规则与compareTo()方法相同。6.6.2TreeSet集合案例演示下面修改文件Example11.java,通过自定义排序的方式实现相同的功能。首先定义学生类Student。Student.java源代码6.6.2TreeSet集合案例演示下面定义测试类,将学生对象通过自定义排序的方式存入TreeSet集合。Example12.java源代码6.6.2TreeSet集合案例演示案例的运行结果如下图所示。【案例6-2】国庆抽奖活动案例描述为了引流促销,某商场在国庆期间开展抽奖活动,活动期间每5名顾客参与就会启动一次抽奖,并在5名顾客中随机抽取3名顾客作为幸运顾客赠送商场消费券,抽奖的其他要求如下。参与的顾客需要填写姓名和手机号作为抽奖凭证。已参与的顾客不得重复参与抽奖活动。幸运顾客按照姓名升序排序,姓名相同的幸运顾客则继续根据手机尾号升序排序。顾客参与抽奖时,唯一识别顾客身份的是顾客的姓名和微信号。【案例6-2】国庆抽奖活动案例效果Map集合6.76.7Map集合现实生活中,每个人都有唯一的身份证号,通过身份证号可以快速查找到这个人的信息,这两者是一对一的关系。在Java程序中,如果想要存储这种具有对应关系的数据,可以使用Map集合,Map集合常用的实现类有HashMap集合和TreeMap集合,下面对Map集合的相关内容进行讲解。6.7.1Map集合简介掌握Map集合的作用,能够简述Map集合常用的方法以及常用实现类的特点

先定一个小目标!6.7.1Map集合简介Map集合是Java中用于存储和操作键值对的数据结构,其中的每个元素都包含一个键对象key和一个值对象value,它们之间是一对一的映射关系。Map集合中的键不允许重复,而值可以重复。6.7.1Map集合简介Map集合定义了很多双列集合通用的集合操作方法,包括添加、删除和判断元素等一些基本方法,还针对双列集合的特殊结构提供了基于键和值的获取方法。常用方法如下所示。方法声明功能描述Vput(Kkey,Vvalue)向Map集合中添加元素(键值对),如果当前Map集合中已有一个键值对中的键与key相等,则新的键值对会覆盖原来的键值对Vremove(Objectkey)从Map集合中删除键为key的键值对,并返回key对应的value;如果该key不存在,则返回nullvoidclear()移除Map集合中所有键值对元素booleancontainsKey(Objectkey)查询Map集合中是否包含指定key的键值对,如果包含则返回true6.7.1Map集合简介接上页表格。方法声明功能描述booleancontainsValue(Objectvalue)查询Map集合中是否包含指定value的键值对,如果包含则返回truebooleanisEmpty()判断Map集合是否为空intsize()返回集合中元素的数量Vget(Objectkey)返回Map集合中指定键所映射的值,V表示值的数据类型。如果不包含则返回nullSet<K>keySet()返回Map集合中所有键对象的Set集合Collection<V>values()返回Map集合中所有值对象组成的Collection集合Set<Map.Entry<K,V>>entrySet()返回Map集合中所有键值对的Set集合6.7.2HashMap集合掌握HashMap集合的使用,能够使用HashMap实现数据的增删改查

先定一个小目标!6.7.2HashMap集合案例演示HashMap集合的底层结构与HashSet类似,也是采用哈希表来存储元素。HashMap集合中的大部方法都是Map集合方法的实现,下面先通过一个获取文具价格的案学习HashMap集合的使用。Example13.java源代码6.7.2HashMap集合案例演示案例的运行结果如下图所示。6.7.2HashMap集合在程序开发中,对于Map集合的遍历操作也是非常常见的需求,通常有以下两种遍历方式。第一种是先通过keySet()方法获取到Map集合中所有键的集合,再通过get()方法获取每个键所对应的值。第二种是将每个键值对看作一个对象,通过entrySet()方法获取Map集合中所有键值对对象的Set集合,再遍历Set集合。6.7.2HashMap集合案例演示下面通过一个案例演示前面讲解的两种遍历Map集合的方式。Example14.java源代码6.7.2HashMap集合案例演示案例的运行结果如下图所示。6.7.2HashMap集合HashMap集合中元素的存取顺序不一致,如果想要元素的添加顺序和输出顺序一致,可以使用LinkedHashMap类,它是HashMap的一个子类,其原理与LinkedHashSet相同,通过在内部使用双向链表来维护元素的添加顺序。6.7.2HashMap集合案例演示下面使用LinkedHashMap集合存储数据并进行遍历。Example15.java源代码6.7.2HashMap集合案例演示案例的运行结果如下图所示。6.7.3TreeMap集合掌握TreeMap集合的使用,能够使用TreeMap实现数据的增删改查

先定一个小目标!6.7.3TreeMap集合TreeMap是Map集合的一个实现类,它的底层与TreeSet集合类似,采用平衡二叉树的结构存储数据,并通过二叉树的特性保证集合中键的唯一性。TreeMap集合同样可以依赖自然排序或者自定义排序对集合中的键进行排序。6.7.3TreeMap集合案例演示下面通过一个案例来演示TreeMap集合的用法。案例要求在TreeMap集合中存储学生类对象为键,学生的班级为对应的值的键值对集合,学生对象包含姓名和成绩两个属性,要求遍历Map集合并根据成绩降序排序,其次根据姓名升序排序。首先定义学生类Student.java。Student.java源代码6.7.3TreeMap集合案例演示下面定义测试类,将学生对象和学生的班级以键值对的方式存入TreeMap集合中。Example16.java源代码6.7.3TreeMap集合案例演示案例的运行结果如下图所示。【案例6-3】英汉互译案例描述本案例要求编写一个程序,模拟英汉互译的操作。首先程序会初始化n组对应的中英文翻译数据,每个英文单词有1个或多个中文翻译,一个中文词语也可能有多个英文翻译。用户输入英文单词或中文词语后,程序输出该单词或词语所有对应的中文翻译或英文翻译,若未搜索到该单词或词语,则给出相应的提示。【案例6-3】英汉互译案例效果【案例6-4】益智棋牌游戏案例描述棋牌游戏相信许多人都玩过。本案例要求编写一个程序模拟棋牌游戏洗牌发牌的过程。该游戏使用一副54张的扑克牌,牌面由花色和数字(字母)组成,花色有四种,分别表示黑桃、红桃、方片和梅花,小☺和大☻分别表示小王和大王。该游戏共有3位玩家参与,首先将这54张牌的顺序打乱每人轮流摸一次牌,剩余3张留作底牌,然后在控制台打印3位玩家的牌和3张底牌。【案例6-4】益智棋牌游戏案例描述本案例中洗牌的步骤需要把54张牌的顺序打乱,可以使用一个方法shuffle(),它可以用来打乱集合中元素的顺序。该方法是在java.utils.Collections类中定义的,具体用法如下。上述方法的参数表示要打乱的集合,该方法没有返回值。打乱操作会在原始集合上进行。Collections.shuffle(Listlist);【案例6-4】益智棋牌游戏案例效果Stream流6.86.8Stream流熟悉Stream流的使用,能够使用Stream流对集合进行各种操作

先定一个小目标!6.8Stream流Stream流又称StreamAPI,是JDK8开始提供的用于处理数据的API,它将待处理的数据视为流,在管道中传输。使用Stream流可以轻松地对数组和集合进行操作,简化集合和数组的遍历、筛选、过滤等操作。此外,Stream流的操作会产生结果,但不会修改数据源,这使得数据的处理更加安全可靠。6.8Stream流使用Stream流处理集合一般需要经过三个步骤,分别是获取Stream流、使用中间方法对流进行处理、使用终结方法获取处理结果。下面对这三个步骤进行说明。6.8Stream流1.获取Stream流获取Stream流指的是从数据源中获取Stream流的引用,让开发者能够对数据源进行流式处理。在Java中,对于所有的单列集合,Collection集合提供了一个stream()方法,用于获取对应集合的Stream流对象。对于Java中的双列集合,无法直接使用Stream流进行处理。但是可以通过keySet()方法或entrySet()方法将双列集合转为单列集合,然后调用stream()方法获取Stream流。6.8Stream流2.Stream流的中间方法获取到集合的Stream流后,就可以对流中的数据进行操作了。Stream流提供了一系列方法,用于对数据流进行过滤、排序、去重等中间操作,这些方法被称为中间方法。中间方法是对Stream流中的元素执行处理操作的方法,不会立即返回最终的结果流,它们在终结方法被调用时才会执行。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论