深入JavaJava集合学习教案.pptx
《深入JavaJava集合学习教案.pptx》由会员分享,可在线阅读,更多相关《深入JavaJava集合学习教案.pptx(171页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、会计学1深入深入(shnr)JavaJava集合集合第一页,共171页。n nJava集合类是一种特别有用(yu yn)的工具类,可用于存储数量不等的对象,并可以实现常用的数据结构,如栈、队列等。除此之外java集合还可用于保存具有映射关系的关联数组。Java集合大致可分为Set、List、Queue和Map四种体系,其中Set代表无序、不可重复的集合;List代表有序、重复的集合;而Map则代表具有映射关系的集合。Java5中又增加了Queue体系集合,代表一种队列集合实现。第2页/共171页第三页,共171页。第一节第一节 Java集合集合(jh)概述概述pp为了保存数量不确定的数据,以及
2、保存具有映射关系的数据(也称为关联素组),Java提供了集合类。集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。所有的集合类都位于(wiy)java.util包下,后来为了处理多线程环境下的并发安全问题,java5还在java.util.concurrent包下提供了一些多线程支持的集合类。pp集合类和数组不一样,数组元素既可以是基本数据类型,又可以是对象(实际上保存的是对象的引用变量);而集合只能保存对象。ppJava的集合类主要由两个接口派生而出:Collection和Map。第3页/共171页第四页,共171页。Collection接口接口(ji ku)及其派生及其派生类类第
3、4页/共171页第五页,共171页。Map体系(tx)的继承树第5页/共171页第六页,共171页。第二节第二节 Collection和和Iteration接口接口(ji ku)n nCollectionCollection接口是接口是ListList、SetSet和和QueueQueue接口的父接口,该接口里定义的接口的父接口,该接口里定义的方法既可用于操作方法既可用于操作SetSet集合集合(jh)(jh),也可用于操作,也可用于操作ListList和和QueueQueue集合集合(jh)(jh)。CollectionCollection接口里定义了如下操作集合接口里定义了如下操作集合(j
4、h)(jh)元素的方法。元素的方法。n nboolean add(Object o):boolean add(Object o):用于向集合用于向集合(jh)(jh)里添加一个元素,如果集合里添加一个元素,如果集合(jh)(jh)对对象被添加操作改变了,则返回象被添加操作改变了,则返回truetrue。n nboolean addAll(Collection c):boolean addAll(Collection c):该方法把集合该方法把集合(jh)c(jh)c里的所有元素添加到指定里的所有元素添加到指定集合集合(jh)(jh)里。如果集合里。如果集合(jh)(jh)对象被添加操作改变了,
5、则返回对象被添加操作改变了,则返回truetrue。n nvoid clear():void clear():清除集合清除集合(jh)(jh)里所有元素,将集合里所有元素,将集合(jh)(jh)长度变为长度变为0 0;n nboolean contains(Object o):boolean contains(Object o):返回集合返回集合(jh)(jh)里是否包含指定元素。里是否包含指定元素。n nboolean containsAll(Collection c):boolean containsAll(Collection c):返回集合返回集合(jh)(jh)里是否包含集合里是否包
6、含集合(jh)c(jh)c里所里所有元素。有元素。n nboolean isEmpty():boolean isEmpty():返回集合返回集合(jh)(jh)是否为空。当集合是否为空。当集合(jh)(jh)长度为长度为0 0时返回时返回truetrue。否则返回。否则返回falsefalse。第6页/共171页第七页,共171页。ppIterator iterator():Iterator iterator():返回一个返回一个IteratorIterator对象,用于遍历集合里的元素。对象,用于遍历集合里的元素。ppboolean remove(Object o):boolean remo
7、ve(Object o):从此从此 collection collection 中移除指定元素的单个实例,存在多个中移除指定元素的单个实例,存在多个只删除第一个。只删除第一个。ppboolean removeAll(Collection c):boolean removeAll(Collection c):移除此移除此 collection collection 中那些也包含在指定中那些也包含在指定 c c中的所有中的所有元素元素,如果如果(rgu(rgu)删除了一个或一个以上,则返回删除了一个或一个以上,则返回truetrue。ppboolean retainAll(Collection c
8、):boolean retainAll(Collection c):从集合中删除集合从集合中删除集合c c里不包含的元素(相当于把调里不包含的元素(相当于把调用该方法的集合变成该集合和集合用该方法的集合变成该集合和集合c c的交集),如果的交集),如果(rgu(rgu)该操作改变了调用该操作改变了调用该方法的集合,则该方法返回该方法的集合,则该方法返回truetrue。ppint size():int size():该方法返回集合里元素的个数。该方法返回集合里元素的个数。ppObject toArray():Object toArray():该方法把集合转换成一个数组,所有的集合元素变成对应的
9、该方法把集合转换成一个数组,所有的集合元素变成对应的数组元素。数组元素。第7页/共171页第八页,共171页。小练习(linx):因为所有的Collection 实现(shxin)类都重写了toString()方法,该方法可以一次性输出集合中所有元素。第8页/共171页第九页,共171页。n n上面程序中创建了两个Collection对象(duxing),一个是c集合,一个是books集合,其中c集合是ArrayList,而books集合是HashSet。虽然他们使用的实现类不同,但当把他们当成Collection来使用时,使用add,remove,clear等方法完全没有任何区别。第9页/共
10、171页第十页,共171页。n n1.使用Lambda表达式遍历集合n njava8为Iterable接口新增了一个forEach(Consumer action)默认方法,该方法所需参数的类型是一个函数式接口,而Iterable接口是Collection接口的父接口,因此Collection集合也可以直接调用(dioyng)该方法。n n当程序调用(dioyng)Iterable的forEach(Consumer action)遍历集合元素时,程序会依次将集合元素传给Consumer的accept(T,t)方法(该接口中唯一的抽象方法)。正因为Consumer是函数式接口,因此可以使用Lam
11、bda表达式来遍历集合元素。第10页/共171页第十一页,共171页。n n2.使用foreach循环遍历(bin l)集合元素n n除了可以使用Iterator接口迭代访问Collection集合里的元素之外,使用Java5提供的foreach循环迭代访问集合元素更加便捷。n nCollection books=new HashSet();n nbooks.add(JavaEE);n nbooks.add(Android);n n/使用foreach循环来迭代访问Collection集合元素n nfor(Object obj:books)n nString book=(String)obj;
12、n nSystem.out.println(book);第11页/共171页第十二页,共171页。n n3.使用Java8新增的Predicate操作集合n nJava8为Collection集合新增了一个removeIf(Predicate filter)方法,该方法见鬼批量删除符合filter条件的所有元素。该方法需要一个Predicate(谓词)对象作为(zuwi)参数,Predicate也是函数式接口,因此可是用Lambda表示式作为(zuwi)参数。第12页/共171页第十三页,共171页。n n4.使用Java8新增的Stream操作集合n nJava8还新增了Stream、InS
13、tream、LongStream、DoubleStream等流式API,这些API代表多个支持串行和并行聚集(jj)操作的元素。Stream是一个通用的流接口,而IntStream、LongStream、DoubleStream则代表元素类型为int、long、double的流。n nJava8还为上面每个流式API提供了对应的Builder,例如Stream.Builder,IntStream.Builder,LongBuilder,DoubleStream.Builder,开发者可以通过这些Builder来创建对应的流。第13页/共171页第十四页,共171页。n n独立使用Stream的
14、步骤如下:n n使用Stream或XXXStream的builder()类方法创建(chungjin)Stream对应的Builder。n n重复调用Builder的add()方法向该流中添加多个元素。n n调用Builder的builder()方法获取该流中添加多个元素。n n调用Stream的聚集方法。第14页/共171页第十五页,共171页。n n实例:n n注意:IntStream的聚集(jj)方法只能执行一次。第15页/共171页第十六页,共171页。n nStream提供了大量的方法进行(jnxng)聚集操作,这些方法既可以是“中间的”(intermediate),也可以是“末端的
15、”(terminal)。n n中间方法:中间操作允许流保持打开状态,并允许直接调用后续方法。上面程序中的map()方法就是中间方法。中间方法的返回值是另外一个流。n n末端方法:末端方法是对流的最终操作,当对某个Stream执行末端方法后,该流将会被“消耗”且不可再用。上面程序的sum(),count(),average()等就是末端第16页/共171页第十七页,共171页。n n流的方法还有如下两个特征:n n有状态的方法:这种方法会给流增加一些新的属性,比如元素的唯一性、元素的最大数量、保证元素以排序的方式被处理等。有状态的方法往往需要(xyo)更大的性能开销。n n短路方法:短路方法可以
16、尽早结束对流的操作,不必检查所有的元素。第17页/共171页第十八页,共171页。n n介绍一下Stream常用的方法:n nfilter(Predicate predicate):过滤Stream中所有不符合predicate的元素。n nmapToXxx(ToXxxFunction mapper):使用ToXxxFunction对流(duli)中的元素执行一对一的转换。n npeek(Consumer action):依次对每个元素执行一些操作,该方法返回的流与原有流包含相同的元素。该方法主要用于调试。n ndistinct():该方法用于排序流中所有重复的元素(判断元素重复的标准是使用e
17、quals()比较返回true)。这是一个有状态的方法。第18页/共171页第十九页,共171页。ppsorted():该方法用于保证流中的元素在后续的访问中处于有序状态。这是一个有状态的方法。pplimit(long maxSize):该方法用于保证对该流的后续访问中最大允许(ynx)访问的元素个数。这是一个有状态的、短路的方法。第19页/共171页第二十页,共171页。n nStream常用的末端方法n nforEach(Consumer action):遍历流中所有元素,对每个元素执行action。n ntoArray():将流中所有元素转换为一个数组。n nreduce():该方法有三
18、个重载的版本(bnbn),都用于通过某种操作来合并流中的元素。n nmin():返回流中所有元素的最小值。n nmax():返回流中所有元素的最大值。n ncount():返回流中所有元素的数量。第20页/共171页第二十一页,共171页。ppanyMatch(Predicate predicate):判断(pndun)流中是否至少包含一个元素符号符合Predicate条件。ppallMatch(Prediacate predicate):判断(pndun)流中是否每个元素都符合Predicate条件。ppnoneMatch(Predicate predicate):判断(pndun)流中是否
19、所有元素都不符合Predicate条件。ppfindFirst():返回流中的第一个元素。ppfindAny():返回流中的任意一个元素。第21页/共171页第二十二页,共171页。n n除此之外,Java 8 允许使用流式API来操作集合,Collection接口提供了一个Stream()默认方法,该方法可返回该集合对应(duyng)的流,接下来计科通过流式API来操作集合元素。由于Stream可以对集合元素进行整体的聚集操作,因此Stream极大地丰富了集合的功能。第22页/共171页第二十三页,共171页。n n实例(shl):第23页/共171页第二十四页,共171页。第三节第三节 S
20、et集合集合(jh)n nset集合类似一个罐子,程序可以一次把对象丢进set集合,而set集合通常不能记住元素的添加顺序。Set集合与Collection基本相同,没有提供任何额外的方法。实际上Set就是Collection,只是行为略有不同。n nset集合不允许包含相同元素,如果试图把两个相同的元素加入同一个Set集合中,则添加操作失败,add()方法返回(fnhu)false,且新元素不会被加入。n n上面介绍的是set集合的通用知识,因此完全适合后面介绍的HashSet、TreeSet和EnumSet三个实现类。只是三个实现类还各有特色。第24页/共171页第二十五页,共171页。1
21、.HashSet类类n nHashSet是set接口的典型实现,大多数时候使用Set集合时就是使用这个实现类。HashSet按Hash算法来存储集合中的元素,因此据很好的存储和查找性能。n nHashSet具有以下特点:n n不能保证元素的排列顺序,顺序可能(knng)与添加顺序不同,顺序也有可能(knng)发生变化。n nHashSet不是同步的,如果多个线程同时访问一个HashSet,假设有两个或者两个以上线程同时修改了HashSet集合时,必须通过代码来保证其同步。n n集合元素值可以是null。第25页/共171页第二十六页,共171页。n n当向HashSet集合中存入一个(y)元素
22、时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode()值,然后根据该hashCode值决定该对象在HashSet中的存储位置。如果有两个元素通过equals()方法比较返回true,但它们的hasCode()方法返回值不同,HashSet将会把他们存储在不同的位置,依然可以添加成功。n n也就是说,HashSet集合判断两个元素相等的标准是两个对象通过equals()方法比较相等,并且两个对象的hashCode()方法返回值也相等。第26页/共171页第二十七页,共171页。n n如果两个对象的hashCode()方法(fngf)返回的hasCode值相同,
23、但他们通过equals()方法(fngf)比较返回false时更加麻烦:因为两个对象的hasCode()值相同,HashSet将试图把他们保存在同一个位置,但又不行(否则将只剩下一个对象),所以实际上会在这个位置用链式结构来保存多个对象;而HashSet访问集合元素时也是根据元素的hashCode值来快速定位的,如果HashSet中两个以上的元素具有相同的hashCode值,将会导致性能下降。第27页/共171页第二十八页,共171页。n n如果两个对象通过equals()方法返回true,但这两个对象的hashCode()返回不同的hasCode()值时,这将导致HashSet会把这两个对象
24、保存在Hash表中的不同位置,从而使两个对象都可以添加成功,这就与Set集合的规则冲突了。n n如果需要把某个类的对象保存到HashSet集合中,重写这个类的equals()方法和hashCode()方法时,应该尽量保证两个对象通过equals()方法比较(bjio)返回true时,它们的hasCode()方法返回值也相同。第28页/共171页第二十九页,共171页。n nHashSet中每个能存储元素的“槽位”(slot)通常称为“桶”(bucket),如果有多个元素的hashCode值相同,但它们通过equals()方法比较返回(fnhu)false,就需要在一个“桶”里放多个元素,这样就
25、会导致性能下降。第29页/共171页第三十页,共171页。重写重写hashCode()方法方法(fngf)的的基本规则基本规则pp在程序运行过程中,同一个对象多次调用hashCode()方法(fngf)应该返回相同的值。pp当两个对象通过equals()方法(fngf)返回true时,这两个对象的hashCode()方法(fngf)应该返回相同的值。pp对象中用作equals()方法(fngf)比较标准的实例变量,都应该用于计算hashCode第30页/共171页第三十一页,共171页。重写重写hashCode的一般的一般(ybn)步步骤骤n n1.把对象内每个有意义的实例变量(即每个参与eq
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 深入 JavaJava 集合 学习 教案
限制150内