Java程序设计案例教程(第2版)课件 单元6 集合_第1页
Java程序设计案例教程(第2版)课件 单元6 集合_第2页
Java程序设计案例教程(第2版)课件 单元6 集合_第3页
Java程序设计案例教程(第2版)课件 单元6 集合_第4页
Java程序设计案例教程(第2版)课件 单元6 集合_第5页
已阅读5页,还剩127页未读 继续免费阅读

下载本文档

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

文档简介

6.1集合框架概述集合Java语言程序设计Unit66.1集合框架概述

集合

面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就需要对对象进行存储,集合就是存储对象最常用的一种方式。

集合类主要分为两大类:Collection和Map。

集合与数组

数组和集合类同是容器,数组虽然也可以存储对象,但其长度是固定的,而集合的长度是可变的。

此外,数组中可以存储基本数据类型,而集合只能存储对象,并且可以存储不同类型的对象。6.1集合框架概述集合框架体系结构集合框架简要说明Collection接口是可以存储一组可以重复的对象,是集合类的顶级接口。Set接口不允许重复,使用自己内部的一个排列机制。List接口允许重复,以元素安插的次序来放置元素,不会重新排列。Map接口是一组成对的键-值对象,即所持有的是key-valuepairs。Map中不能有重复的key,拥有自己的内部排列机制。默认容器中的元素类型都为Object类型,从容器获取时须转换成原来的类型。MapTreeSetLinkedListCollectionHashTableHashMapArrayListListHashSetSetTreeMapQueueLinkedHashMap浙江经贸职业技术学院集合Java语言程序设计Unit6主讲王昌建6.2.1Collection接口概述6.2.2子接口及其实现类6.2.3Collection中的方法6.2Collectiion接口6.2.1Collection接口概述

Collection接口Collection接口位于java.util包中,是集合类的一个顶级接口,直接继承自Collection接口的子接口有List、Set和Queue。JavaSDK不提供直接继承自Collection的类,Collection接口通常情况下不被直接使用。

构造函数

所有实现Collection接口的类都必须提供两个标准的构造函数:

无参数的构造函数用于创建一个空的Collection;有一个Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。浙江经贸职业技术学院集合Java语言程序设计Unit6主讲王昌建6.2.1Collection接口概述6.2.2子接口及其实现类6.2.3Collection中的方法6.2Collectiion接口6.2.2子接口及其实现类Collection接口的常用子接口有List和Set。List接口的实现类有ArrayList和LinkedList。Set接口的实现类有HashSet和TreeSet。6.2.2子接口及其实现类1List接口List是有序的Collection,使用此接口能够精确地控制每个元素插入的位置。用户能够使用索引(元素在List中的位置)来访问List中的元素,List中允许有相同的元素,这种方式类似于Java的数组。ArrayList类:ArrayList实现了可变大小的数组,它允许所有元素,包括null。每个ArrayList实例都有一个容量,即用于存储元素的数组的大小,这个容量可随着不断添加新元素而自动增加。LinkedList类:LinkedList实现了List接口,允许null元素,提供额外的get、remove、insert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack)、队列(queue)或双向队列(deque)。Vector类:Vector非常类似ArrayList,但是Vector是同步的。Stack类:Stack继承自Vector,实现一个后进先出的堆栈。List接口的实现类6.2.2子接口及其实现类Set是一种不包含重复元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set中最多有一个null元素。HashSet类:HashSet不能保证元素的排列顺序,顺序有可能发生变化,不是同步的,集合元素可以是null,但只能放入一个null。TreeSet类:TreeSet可以确保集合元素处于排序状态,TreeSet支持两种排序方式,自然排序和定制排序。LinkedHashSet类:继承自HashSet类,同样是根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序。2Set接口Set接口的实现类浙江经贸职业技术学院集合Java语言程序设计Unit6主讲王昌建6.2.1Collection接口概述6.2.2子接口及其实现类6.2.3Collection中的方法6.2Collectiion接口6.2.3Collection中的方法Collection接口是集合的顶层接口,通常不能直接使用,但该接口提供了添加元素、删除元素以及一些其他方法。

由于List接口和Set接口等都继承了Collection接口,因此这些方法对List集合和Set集合都是通用的。6.2.3Collection中的方法返回值类型方法名称和参数方法说明booleanadd(Objecto)将对象添加到集合booleanremove(Objecto)

如果集合中有与o相匹配的对象则删除对象ointsize()返回当前集合中元素的数量booleanisEmpty()判断结合中是否有任何元素booleancontains(Objecto)

查找集合中是否含有元素oIteratoriterator()返回一个迭代器用来访问集合中的各个元素booleancontainsAll(Collectionc)查找集合中是否含有集合c中的所有元素booleanaddAll(Collectiionc)将集合c中的所有元素添加给该集合voidclear()删除集合中所有的元素voidremoveAll(Collectionc)从集合中删除集合c中的所有元素voidretainAll(Collectionc)

从集合中删除集合c中不包含的元素Object[]toArray()返回一个内含集合所有元素的数组Object[]toArray(Object[]a),返回一个内含集合所有元素的数组,运行期返回的数组和参数a的类型相同Collection接口的常用方法浙江经贸职业技术学院集合Java语言程序设计Unit6主讲王昌建6.3.1List接口概述6.3.2ArrayList类6.3.3LinkedList类6.3List接口6.3.1List接口概述List接口位于java.util包中,直接继承自Collection接口。List集合代表一个元素有序并且可重复的集合,集合中每个元素都有对应的顺序索引。(1)publicObjectget(intindex)--根据下标返回列表中的元素。(2)publicObjectadd(intindex,Objectelement)--在列表的指定位置插入指定元素,将当前处于该位置的元素(如果有的话)和所有后续元素向右移动。(3)publicObjectset(intindex,Objectelement)--用指定元素替换列表中指定位置的元素。(4)publicObjectremove(intindex)--移除列表中指定位置的元素。List接口新增的常用方法List接口常用的实现类

ArrayList、LinkedList、Vector、Stack等。浙江经贸职业技术学院集合Java语言程序设计Unit6主讲王昌建6.3.1List接口概述6.3.2ArrayList类6.3.3LinkedList类6.3List接口6.3.2ArrayList类优点缺点

允许包含所有元素,包括NULL,使用ArrayList可以根据索引位置对集合进行快速地随机访问。向指定的索引位置插入对象或删除对象的速度较慢,因为向索引位置插入对象时会将指定索引位置及之后的所有对象相应向后移动一位。ArrayList是List接口的直接实现类,实现了可变的数组功能。6.3.2ArrayList类

那么什么时候使用Array(数组),什么时候使用ArrayList呢?答案是:当我们不知道到底有多少个数据元素的时候就可使用ArrayList。如果知道数据集合有多少个元素就使用数组。6.3.2ArrayList类1ArrayList构造方法01Arraylist()

这个构造方法构造了一个空的链表。02ArrayList(Collection<?extendsE>c)

这个构造方法构造了一个包含指定元素集合的链表,注意,这里的字符E是一个标记,用来表示集合中元素的类型。03ArrayList(intinitialCapacity)

这个构造方法构造了一个指定大小但内容为空的链表。initialCapacity参数就是初始容量大小。6.3.2ArrayList类1ArrayList构造方法举例:

如果需要创建一个空的数组链表用来存放String类型的对象举例:

如果你需要创建一个指定初始容量的数组链表可编写的代码:ArrayList<String>list=newArrayList<String>();可编写的代码:ArrayList<Integer>list=newArrayList<Integer>(7);6.3.2ArrayList类2ArrayList常用方法(1)增加元素到链表中booleanadd(Elemente)--增加指定元素到链表尾部。voidadd(intindex,Elemente)--增加指定元素到链表指定位置。(2)从链表中删除元素voidclear()--从链表中删除所有元素。Eremove(intindex)--删除链表中指定位置的元素,E为对应的元素类型。voidremoveRange(intstart,intend)--删除链表中从某一个位置开始到某一个位置结束的元素。(3)获取链表中的元素Eget(intindex)--获取链表中指定位置处的元素,E为对应的元素类型。Object[]toArray()--获取一个数组,数组中所有元素是链表中的元素,即将链表转换为一个数组。6.3.2ArrayList类2ArrayList常用方法(4)修改某个元素Eset(intindex,Eelement)--将链表中指定位置上的元素替换成新元素,E为对应的元素类型。(5)搜索元素booleancontains(Objecto)--如果链表包含指定元素,返回true。intindexOf(Objecto)--返回元素在链表中第一次出现的位置,如果返回-1,表示链表中没有这个元素。intlastIndexOf(Objecto)--返回元素在链表中最后一次出现的位置,如果返回-1,表示链表中没有这个元素。6.3.2ArrayList类2ArrayList常用方法(7)获取链表大小intsize()--返回链表长度(链表包含元素的个数)。(6)检查链表是否为空booleanisEmpty()--返回true表示链表中没有任何元素。6.3.2ArrayList类ArrayList主要用法,包括创建链表、添加元素、查找元素、替换元素、三种遍历方法以及转化为数组等操作。知识应用

按模板方式截图eclipse内的程序,放置于此?6.3.2ArrayList类ArrayList主要用法,包括创建链表、添加元素、查找元素、替换元素、三种遍历方法以及转化为数组等操作。知识应用

按模板方式截图eclipse内的程序,放置于此?6.3.2ArrayList类ArrayList主要用法,包括创建链表、添加元素、查找元素、替换元素、三种遍历方法以及转化为数组等操作。运行结果浙江经贸职业技术学院集合Java语言程序设计Unit6主讲王昌建6.3.1List接口概述6.3.2ArrayList类6.3.3LinkedList类6.3List接口6.3.3LinkedList类优点缺点相对于ArrayList,LinkedList插入是更快的,因为LinkedList不需要改变数组的大小,也不需要在数组装满的时候要将所有的数据重新装入一个新的数组。LinkedList需要更多的内存,因为ArrayList的每个索引的位置是实际的数据,而LinkedList中的每个节点中存储的是实际的数据和前后节点的位置。LinkedeList和ArrayList都实现了List接口。两者之间最主要的区别在于ArrayList是可改变大小的数组,而LinkedList是双向链接串列。6.3.3LinkedList类

虽然很多场景下ArrayList更受欢迎,但是还有些情况下LinkedList更为合适。譬如:(1)当应用不需要随机访问数据时:因为如果你需要LinkedList中的第n个元素的时候,你需要从第一个元素顺序数到第n个数据,然后读取数据,这样的速度比较慢,效率不高。(2)当应用中插入和删除元素操作多,随机读取数据操作少时:因为LinkedList中插入和删除元素不涉及重排数据,所以它要比ArrayList更快。6.3.3LinkedList类LinkedList新增的特有方法(1)添加首尾元素方法部publicvoidaddFirst(Objecte)—-添加元素到首部。publicvoidaddLast(Objecte)—-添加元素到尾部。(2)获取首尾元素方法publicObjectgetFirst()—-获取首部元素。publicObjectgetLast()—-获取尾部元素。(3)删除首尾元素方法publicObjectremoveFirst()—-删除首部元素。publicObjectremoveLast()—-删除尾部元素。6.3.3LinkedList类LinkedList主要用法,包括如何创建列表、添加元素、删除元素、遍历列表等。知识应用

按模板方式截图eclipse内的程序,放置于此?6.3.3LinkedList类LinkedList主要用法,包括如何创建列表、添加元素、删除元素、遍历列表等。运行结果浙江经贸职业技术学院案例

6-1单元6集合就诊时排队叫号案例单元Java语言程序设计主讲王昌建eclipseeclipseeclipse案例

6-1:就诊时排队叫号案例目标

以患者到医院就诊为业务背景,体验取号和排队叫号功能的实现机制。案例解释

就诊时按患者的取号先后顺序依次叫号,通知当前就诊病人的同时提示候诊病人的情况。案例效果案例6-1:就诊时排队叫号实现思路基本步骤按实训要求创建工程并配置环境创建排队叫号业务类(1)在cn.campsg.java.experiment包中创建叫号业务类,

QueueCaller;(2)为QueueCaller类创建患者排队列表属性:ArrayList<String>queue;(3)为QueueCaller类创建0参构造器,其形式如下:(+提示:publicQueueCaller(){})1)在构造器内实例化患者排队列表(queue)。(4)为QueueCaller类创建获取患者数量的方法:(+提示:publicintsize(){})案例效果案例

6-1:就诊时排队叫号实现思路基本步骤创建排队叫号业务类(5)实现size方法的业务逻辑:通过调用queue对象的size方法,获取等待就诊的人数。返回等待就诊的人数。(6)为QueueCaller类创建取号方法fetchNumber:(+提示:publicvoidfetchNumber(Stringpatient){})(7)实现fetchNumber方法的业务逻辑:将患者姓名加入等待队列queue。输出患者排队就诊信息,信息如下:patient+"前面还有

"+(size()-1)+"位在等候就诊。"案例效果案例

6-1:就诊时排队叫号实现思路基本步骤创建排队叫号业务类(8)为QueueCaller类创建显示候诊者信息的方法:(+提示:publicvoidshowPatients(){})(9)实现showPatients方法的业务逻辑:1)判断队列(queue)中是否存在排队等待患者,如没有直接退出。2)如存在排队等待患者,从队列中获取该患者的姓名。3)输出患者信息,内容:患者姓名+"候诊中"。案例效果案例

6-1:就诊时排队叫号实现思路基本步骤创建排队叫号业务类(10)为QueueCaller类创建叫号方法:(+提示:publicvoidcallNumber(){})(11)callNumber方法的业务逻辑如下;1)移除队首(队列第0位成员)患者,并返回患者姓名。2)输出被叫号的患者信息,信息内容:"请患者:"+患者姓名+"到诊室就诊!"。案例效果案例

6-1:就诊时排队叫号实现思路基本步骤显示模拟叫号就诊情况:(1)在cn.campsg.java.experiment包中创建主类:MainClass;(2)为MainClass创建入口主方法:main。(3)模拟3个患者排队就诊:1)在main方法中,创建1个排队叫号器(QueueCaller)对象;2)在main方法中,向叫号器对象存入3个患者姓名;+提示QueueCallerqc=newQueueCaller();//创建默认叫号排队器for(inti=1;i<=3;i++){//取3个号 qc.fetchNumber("张山-"+i);}案例效果案例

6-1:就诊时排队叫号实现思路基本步骤显示模拟叫号就诊情况:(4)模拟叫号:1)在main方法中,循环叫号直到没有就诊患者为止。2)每次叫号后均需显示正在排队的患者信息。+提示while(qc.size()!=0){ qc.callNumber(); qc.showPatients();//显示候诊信息}浙江经贸职业技术学院集合Java语言程序设计Unit6主讲王昌建6.5.1Map接口概述6.5.2Map存储对象原理6.5.3HashMap类6.5Map接口6.5.1Map接口概述Java中的Map接口是和Collection接口同一等级的集合根接口,它表示一个键值对(key-value)的映射。010203Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另外一组值用于保存Map里的value,key和value都可以是任何引用类型的数据。Map的key不允许重复,即同一个Map对象的任何两个key通过equals方法比较总是返回false。key和value之间存在单向一对一关系,即通过指定的key总能找到唯一的、确定的value,即每一个键最多只能映射到一个值。注意点6.5.1Map接口概述HashMapTreeMapLinkedHashMap1243Map接口常用实现类HashTable6.5.1Map接口概述Map接口的主要方法(1)添加元素功能Vput(Kkey,Vvalue)--添加元素,如果键是第一次存储,就直接存储元素,返回null;如果键不是第一次存储,之前已经存在,就用值把以前的值替换掉并返回以前的值。(2)删除元素功能voidclear()--移除所有的键值对元素。Vremove(Objectkey)--根据键删除键值对元素,并把值返回。6.5.1Map接口概述Map接口的主要方法(3)判断功能booleancontainsKey(Objectkey)--判断集合是否包含指定的键。booleancontainsValue(Objectvalue)--判断集合是否包含指定的值。booleanisEmpty()--判断集合是否为空。(4)获取元素功能Vget(Objectkey)--根据键获取值。Set<K>keySet()--获取集合中所有键的集合。Collection<V>values()--获取集合中所有值的集合。intsize()--返回集合中的键值对的个数。浙江经贸职业技术学院集合Java语言程序设计Unit6主讲王昌建6.5.1Map接口概述6.5.2Map存储对象原理6.5.3HashMap类6.5Map接口6.5.2Map存储对象原理1Map的数据结构

Map的数据结构Map是一种容器,可以用来进行数据或对象的存储,拥有自己独特的数据结构。Map的每一个元素叫做键值对,所谓键值对其实就是“键”和“值”组成的一对。Map的每一个元素由两部分组成,分别是:key(键)和value(值)。

Map的存取操作容器是用来装东西的,那么容器就要有对应的存取操作。对于“取东西”,也就是查找操作,与数组和链表一样,Map在查找元素时也有自己的规则,这里Map通过查找key(键)的方式,来获取相应的value(值),并且key的值不可以重复,这一点与数组中的下标相似。6.5.2Map存储对象原理2Map的底层实现原理

Map的底层实现Map的底层实现基础是我们学过的数组和链表,因为Map的数据结构问题,Map中的各个元素之间没有连接的关系,所以通过数组的方式存储Map的每个元素。

当然Map既然是与数组和链表不同的容器,他自然也有自己的优点。Map同其他容器一样,也有自己的增、删、改对应的操作,Map的新增方法叫做put,查找方法叫做get。6.5.2Map存储对象原理2Map的底层实现原理//用程序模拟Map存储数据的原理publicclassMyMap{privateMyMap[]myMap=newMyMap[100];privateintsize;privateObjectkey;privateObjectvalue;publicMyMap(Objectkey,Objectvalue){this.key=key;this.value=value;}publicMyMap(){}publicvoidput(Objectkey,Objectvalue){MyMapmap=newMyMap(key,value);myMap[size++]=map;}//接下一页程序首先定义了一个类MyMap,并为该类定义了私有属性key和value,并定义了一个与类相同类型的数组,初始大小为100。然后添加一个赋初值的构造方法和一个无参构造方法。定义类的成员变量和构造方法定义一个put方法,实现根据传入的参数key和value创建一个类的对象并加入数组中,然后使得表示数组下标的参数size加1,从而实现了将给定的key和value保存到Map中的功能。定义put方法6.5.2Map存储对象原理2Map的底层实现原理//接上一页publicObjectget(Objectkey){for(inti=0;i<size;i++){if(key.equals(myMap[i].key)){returnmyMap[i].value;}}returnnull;}

publicstaticvoidmain(String[]args){MyMapm=newMyMap();m.put(123,12345);m.put("abc","abcdef"); System.out.println(m.get(123));System.out.println(m.get("abc"));} }定义get方法,传入参数key,然后使用循环来实现key与myMap数组中存储的元素的key进行比较,如果相等则返回该元素的value,如果没有匹配项则返回null,从而实现了对Map的取值操作。定义get方法编写了一个主方法,对该类进行了测试,程序运行效果如预期一致,可以将任何类型的key和value进行存储,并能够根据key的值再从Map中获取并输出。主方法测试浙江经贸职业技术学院集合Java语言程序设计Unit6主讲王昌建6.5.1Map接口概述6.5.2Map存储对象原理6.5.3HashMap类6.5Map接口6.5.3HashMap类HashMap是基于哈希表的Map接口的实现。010203在HashMap中,key-value总是会当做一个整体来处理,系统会根据hash算法来计算key-value的存储位置,可以通过key快速地存取value,因此HashMap在添加和删除映射关系时的效率更高。HashMap允许使用null值和null键,但必须保证键的唯一性。HashMap通过哈希表对其内部的映射关系进行快速查找,但HashMap不能保证映射的顺序。注意点6.5.3HashMap类TreeMap是Map接口的另外一个实现类。如果希望Map集合中的对象也存在一定的顺序则应该选择使用TreeMap。010203TreeMap中的映射关系存在一定的顺序。TreeMap不允许null键。TreeMap添加、删除操作时性能稍差。注意点浙江经贸职业技术学院集合Java语言程序设计Unit6主讲王昌建6.6.1遍历集合的方法6.6.3Comparable接口6.6.4Comparator接口6.6迭代与比较6.6.2使用Iterator迭代器6.6.1遍历集合的方法1集合的遍历方法

传统的for循环遍历遍历者自己在集合外部维护一个计数器,然后依次读取每一个位置的元素,当读取到最后一个元素后停止,主要就是需要按元素的位置来读取元素,这也是最原始的集合遍历方法。以List的遍历为例,其格式为:for(inti=0;i<list.size();i++){list.get(i);}6.6.1遍历集合的方法1集合的遍历方法

Iterator迭代器遍历

Iterator本来是面向对象的一个设计模式,主要目的就是屏蔽不同数据集合的特点进行统一遍历集合的接口。Java作为一个面向对象语言,自然也在Collection中支持了Iterator模式。以List的遍历为例,其格式为:Iteratoriterator=list.iterator();while(iterator.hasNext()){……iterator.next();}6.6.1遍历集合的方法1集合的遍历方法

For-Each循环遍历

For-Each循环也叫增强型的for循环或者叫foreach循环。foreach循环避免了显式地声明Iterator和计数器,具有代码简洁、不易出错的优点,但是这种方法只能做简单的遍历,不能在遍历过程中进行删除、替换数据等操作。。以List的遍历为例,其格式为:for(ElementTypeelement:list){……}6.6.1遍历集合的方法2Map的遍历方法

由于Java中的所有Map都实现了Map接口,因此以下方法适用于任何Map的实现类,例如HashMap、TreeMap、LinkedHashMap、Hashtable等。

下面以一个整数类的HashMap(HashMap<Integer,Integer>)为例进行说明。6.6.1遍历集合的方法2Map的遍历方法

在foreach循环中使用entries遍历

这是最常见的并且在大多数情况下也是最可取的遍历方式,在键和值都需要时使用。Map<Integer,Integer>map=newHashMap<Integer,Integer>();for(Map.Entry<Integer,Integer>entry:map.entrySet()){ Integerkey=entry.getKey();Integervalue=entry.getValue();}6.6.1遍历集合的方法2Map的遍历方法

在foreach循环中遍历keys或values

如果只需要map中的键或者值,可以通过keySet或values来实现遍历,而不是用entrySet。Map<Integer,Integer>map=newHashMap<Integer,Integer>();for(Integerkey:map.keySet()){//遍历map中的键

System.out.println("Key="+key);}for(Integervalue:map.values()){//遍历map中的值

System.out.println("Value="+value);}6.6.1遍历集合的方法2Map的遍历方法

使用Iterator遍历Mapmap=newHashMap();Iteratoriterator=map.entrySet().iterator();while(iterator.hasNext()){Map.Entryentry=(Map.Entry)iterator.next();Integerkey=(Integer)entry.getKey();Integervalue=(Integer)entry.getValue();System.out.println("Key="+key+",Value="+value);}6.6.1遍历集合的方法2Map的遍历方法

使用Iterator遍历010203在老版本java中这是遍历map的唯一方式。遍历时调用iterator.remove()来删除entries,前面两个方法则不能。从性能方面看,该方法类同于foreach遍历的性能。优点6.6.1遍历集合的方法2Map的遍历方法

通过键找值遍历Map<Integer,Integer>map=newHashMap<Integer,Integer>();for(Integerkey:map.keySet()){Integervalue=map.get(key);System.out.println("Key="+key+",Value="+value);}注意:该方法代码简洁但实际上效率较低,因为从键取值是耗时的操作,所以尽量避免使用浙江经贸职业技术学院集合Java语言程序设计Unit6主讲王昌建6.6.1遍历集合的方法6.6.3Comparable接口6.6.4Comparator接口6.6迭代与比较6.6.2使用Iterator迭代器6.6.2使用Iterator迭代器

迭代器迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。

迭代器通常被称为“轻量级”对象,因为创建它的代价小。

Iterator迭代器Java中的Iterator功能比较简单,并且只能单向移动。6.6.2使用Iterator迭代器要求容器返回一个Iterator。Iiterator()方法获得序列中的下一个元素,第一次调用时返回序列的第一个元素。next()方法检查序列中是否还有元素。hasNext()方法将迭代器新返回的元素删除。remove()方法Iterator迭代器常用的方法6.6.2使用Iterator迭代器

迭代器应用实例代码。知识应用浙江经贸职业技术学院集合Java语言程序设计Unit6主讲王昌建6.6.1遍历集合的方法6.6.3Comparable接口6.6.4Comparator接口6.6迭代与比较6.6.2使用Iterator迭代器6.6.3Comparable接口

Java的比较器

Java的比较器有两类,分别是Comparable接口和Comparator接口。Comparable是在集合内部定义的方法实现的排序,位于java.lang包。Comparator是在集合外部实现的排序,位于java.util包。6.6.3Comparable接口

类的自然排序和自然比较方法

Comparable接口强行对实现它的每个类的对象进行整体排序,此排序称为该类的自然排序。

类的compareTo()方法被称为它的自然比较方法。010203实现此接口的对象集合可以通过Collections.sort()进行自动排序。实现此接口的对象数组则可以通过Arrays.sort()进行自动排序。实现此接口的对象可以用作有序映射表中的键或有序集合中的元素,无需指定比较器。注意点6.6.3Comparable接口

在成绩排序中一般要求先按成绩(score)从高到底进行排序,如果成绩相同则按年龄(age)从低到高进行排序。

使用Comparable接口实现该功能。知识应用浙江经贸职业技术学院集合Java语言程序设计Unit6主讲王昌建6.6.1遍历集合的方法6.6.3Comparable接口6.6.4Comparator接口6.6迭代与比较6.6.2使用Iterator迭代器6.6.4Comparator接口0102Comparable接口的compareTo(To)方法只有一个参数。Comparator接口中必须要被实现的compare(To1,To2)方法则包含两个参数。注意点

如果在设计类的时候没有考虑到让类实现Comparable接口,那么就需要用到比较器接口Comparator。6.6.4Comparator接口

在成绩排序中一般要求先按成绩(score)从低到高进行排序,如果成绩相同则按年龄(age)从高到低进行排序。

使用Comparator接口实现该功能。知识应用浙江经贸职业技术学院案例

6-2单元6集合消费抽奖案例单元Java语言程序设计主讲王昌建eclipseeclipseeclipse案例

6-2:消费抽奖案例目标案例解释

以现实生活中的消费抽奖为业务背景,体验Map的实际应用。

程序设置四种奖项,分为特定奖1个,一等奖4个,二等奖6个,阳光普照奖100个。每次抽中一个奖项后,对应奖项的总奖品数量减少一个。案例效果案例

6-2:消费抽奖实现思路基本步骤1.按实训要求创建工程并配置环境2.创建奖项实体类:(1)在cn.campsg.java.experiment.entity包中创建奖项类:Awards;(2)为Awards类定义私有属性:name和count,并添加getter和setter方法(3)为Awards类创建默认的0参构造器。(4)为Awards类创建2参构造器,实现对成员变量的赋值。案例效果案例

6-2:消费抽奖实现思路基本步骤3.创建抽奖业务类:(1)在cn.campsg.java.experiment.entity包中创建抽奖业务类DrawReward;(2)为DrawReward类创建代表奖池的私有属性rwdPool(3)为DrawReward类创建默认的0参构造器,并实例化奖池对象并在奖池中添加四种奖项。(4)为DrawReward类创建抽奖方法:draward(5)为DrawReward类创建显示剩余奖项信息方法showSurplus案例效果案例

6-2:消费抽奖实现思路基本步骤4.显示模拟抽奖结果(1)在包cn.campsg.java.experiment中创建业务主类:MainClass;(2)在MainClass中定义程序入口主方法:main;(3)在main方法中,创建1个抽奖对象:DrawRewarddraw=newDrawReward();(4)在main方法中,随机生成抽奖号,模拟10次抽奖;(5)在main方法中,调用showSurplus,展示奖池的剩余奖品信息。浙江经贸职业技术学院集合Java语言程序设计Unit6主讲王昌建6.8.1Stream概述6.8.3List新增方法6.8StreamAPI(新特性)6.8.2创建并使用Stream6.8.1Stream概述

不同的Steam

Java8引入了全新的StreamAPI。但此Stream:与javaI/O包里的InputStream和OutputStream是完全不同的概念。不同于StAX对XML解析的Stream。也不同于AmazonKinesis对大数据实时处理的Stream。StreamAPI更像集合类,但行为和集合类又有所不同,它是对集合对象功能的增强,专注于对集合对象进行各种非常便捷、高效的聚合操作或大批量数据操作6.8.1Stream概述

SteamAPI

StreamAPI引入的目的在于弥补Java函数式编程的缺陷,总体来讲仍然是非常完善和强大,足以用很少的代码完成许多复杂的功能。StreamAPI充分利用Lambda表达式的特性,极大地提高编程效率和程序可读性。StreamAPI提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用Fork/Join并行方式来拆分任务和加速处理过程。Java8中首次出现的java.util.Stream,是一个函数式语言+多核时代综合影响的产物。6.8.1Stream概述Stream不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的Iterator。0102原始版本的Iterator用户只能显式地一个一个遍历元素并对其执行某些操作。高级版本的Stream,用户只要给出需要对其包含的元素执行什么操作,比如“过滤掉长度大于10的字符串”、“获取每个字符串的首字母”等,Stream会隐式地在内部进行遍历,做出相应的数据转换。6.8.1Stream概述相同点不同点Stream就如同一个迭代器(Iterator),单向不可往复,数据只能遍历一次,遍历过一次后即用尽。Stream可以并行化操作,迭代器只能命令式地、串行化操作。Stream的并行操作依赖于Java7中引入的Fork/Join框架来拆分任务和加速处理过程。浙江经贸职业技术学院集合Java语言程序设计Unit6主讲王昌建6.8.1Stream概述6.8.3List新增方法6.8StreamAPI(新特性)6.8.2创建并使用Stream6.8.2创建并使用Stream

在StreamAPI中,一个流基本上代表一个元素序列,StreamAPI提供了丰富的操作函数来计算这些元素。StreamAPI使用Lambda表达式和其它函数进行抽象,可以使得代码更易于理解、更为干净。有了这些抽象,还可以做一些优化,比如实现并行等。6.8.2创建并使用Stream123获取一个数据源(Source)数据转换执行操作获取想要的结果使用一个流的三个基本步骤

每次转换时原有Stream对象不改变,返回一个新的Stream对象(可以有多次转换)6.8.2创建并使用Stream1创建数据源(1)从Collection和数组创建Collection.stream()Collection.parallelStream()Arrays.stream(Tarray)orStream.of()(2)从BufferedReader创建java.io.BufferedReader.lines()(3)静态工厂创建java.util.stream.IntStream.range()java.nio.file.Files.walk()(4)自己构建java.util.Spliterator6.8.2创建并使用Stream2流的操作类型(1)Intermediate

一个流可以后面跟随零个或多个Intermediate操作,其目的主要是打开流,做出某种程度的数据映射/过滤,然后返回一个新的流,交给下一个操作使用。这类操作都是惰性化的(lazy),就是说,仅仅调用到这类方法,并没有真正开始流的遍历。(2)Terminal一个流只能有一个Terminal操作,当这个操作执行后,流就被使用“光”了,无法再被操作。所以这必定是流的最后一个操作。执行Terminal操作才会真正开始流的遍历,并且会生成一个结果。6.8.2创建并使用Stream2流的操作类型(3)Short-circuiting

当操作一个无限大的Stream,而又希望在有限时间内完成操作,则拥有一个Short-circuiting操作是必要非充分条件。例如:对于一个Intermediate操作,如果它接受的是一个无限大的Stream,但返回一个有限的新Stream,或者对于一个Terminal操作,如果它接受的是一个无限大的Stream,但要求能在有限的时间计算出结果。6.8.2创建并使用Stream3流的操作方法(1)Intermediate操作方法map(mapToInt,flatMap等)、filter、distinct、sorted、peek、limit、skip、parallel、sequential、unordered等。(2)Terminal操作方法forEach、forEachOrdered、toArray、reduce、collect、min、max、count、anyMatch、allMatch、noneMatch、findFirst、findAny、iterator等。(3)Short-circuiting操作方法anyMatch、allMatch、noneMatch、findFirst、findAny、limit等。6.8.2创建并使用StreamStream的简单应用实例。

实现了从Student类实例列表中进行筛选、列表元素数量获取、整形数据流IntStream的获取和使用等

知识应用浙江经贸职业技术学院集合Java语言程序设计Unit6主讲王昌建6.8.1Stream概述6.8.3List新增方法6.8StreamAPI(新特性)6.8.2创建并使用Stream6.8.3List新增方法返回值类型方法名称和参数方法说明Stream<E>stream()从集合数据源中创建一个连续的流Stream<E>parallelStream()从集合数据源中创建一个并行的流对于流的操作,集合类的顶级接口Collection中新增了两个方法:6.8.3List新增方法

stream()方法示例作用:以list为数据源创建一个连续的Student对象的流。以List为例,代码:Stream<Student>stream=list.stream()6.8.3List新增方法

parallelStream()方法示例作用:第一行代码实现创建一个存储Integer类型元素的列表,第二行代码则展示了利用列表进行并行的输出操作,因而输出显示的顺序不一定会是1、2、3、4、5、6、7、8、9,而可能是任意的顺序,这就是并行流的作用效果。对于并行流的操作,观察两行代码:SList<Integer>numbers=Arrays.asList(1,2,3,4,5,6,7,8,9);numbers.parallelStream().forEach(out::println);浙江经贸职业技术学院集合Java语言程序设计Unit6主讲王昌建6.9.1泛型的作用6.9.3自定义泛型6.9.4类型通配符6.9泛型6.9.2集合与泛型6.9.1泛型的作用

泛型的机制泛型是一种参数化类型的机制,它可以使得代码适用于各种类型,从而编写更加通用的代码,例如集合框架。泛型是一种编译时类型确认机制,提供了编译期的类型安全,确保在泛型类型(通常为泛型集合)上只能使用正确类型的对象,避免了在运行时出现ClassCastException。泛型的正常工作是依赖编译器在编译源码的时候,先进行类型检查,然后进行类型擦除并且在类型参数出现的地方插入强制转换的相关指令实现的。6.9.1泛型的作用下面以一个简单的例子介绍泛型。先看下面的代码:Listlist=newArrayList();list.add("zjiet");list.add(100);for(inti=0;i<list.si

温馨提示

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

评论

0/150

提交评论