Java面向对象思想与程序设计-第8章-集合类课件_第1页
Java面向对象思想与程序设计-第8章-集合类课件_第2页
Java面向对象思想与程序设计-第8章-集合类课件_第3页
Java面向对象思想与程序设计-第8章-集合类课件_第4页
Java面向对象思想与程序设计-第8章-集合类课件_第5页
已阅读5页,还剩115页未读 继续免费阅读

下载本文档

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

文档简介

8集合类第章Java程序设计8集合类第章Java程序设计18.2集合类总览8.3List集合8.4Set集合8.1泛型8.5Map集合8.6集合元素的操作8.7小结C目录ONTENTS8.2集合类总览8.3List集合8.4S28.1.1什么是泛型泛型,也称之为“参数化类型”,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。8.1.1什么是泛型泛型,也称之为“参数化类型”,就是将38.1.1什么是泛型【例8.1】假设有一个篮子(Basket),我们可以用它存放不同的物品,如放鸡蛋(Egg),放面包(Bread),当然也可以放钱(Money)等等。如何定义这个Basket类来满足存放不同种类物品的需求呢?【分析】在定义这个类时,需要解决这样一个问题:放入篮子的这些物品对象存放在哪?我们可以通过数组来存放这些对象;这样引出了下一个问题:数组类型如何定义可以满足存放不同类型的物品?我们可以用所有类型的父类Object来进行定义。Example8_01.java8.1.1什么是泛型【例8.1】假设有一个篮子(Bask48.1.2泛型类的定义泛型类是带有类型参数的类,类中也有属性和方法。泛型类的定义形式:class泛型类名<类型参数表列>{//类体}泛型类型参数:T:代表这是一个类型TypeE:代表这是一个元素ElementK:代表这是一个键KeyV:代表这是一个值Value8.1.2泛型类的定义泛型类是带有类型参数的类,类中也有58.1.2泛型类的定义定义泛型类的对象:泛型类名[<实际类型表列>]对象名=new泛型类名[<实际类型表列>]([形参表]);或泛型类名[<实际类型表列>]对象名=new泛型类名[<>]([形参表]);也可以用“?”代替“实际参数表列”如:Basket<Egg>basket=newBasket<Egg>();【例8.2】定义一个泛型篮子类,并创建相关的对象。Example8_02.java8.1.2泛型类的定义定义泛型类的对象:泛型类名[<实际68.1.2泛型类的定义

泛型的使用规则:泛型的类型参数只能是类类型,而不能是简单类型。泛型的类型参数可以有多个。静态字段的类型不能是类型参数。不能直接创建类型参数变量的数组,只能通过反射创建。泛型的参数类型可以使用extends和super关键字。泛型的参数类型还可以是通配符类型。8.1.2泛型类的定义泛型的使用规则:78.1.3泛型接口的定义除了可以定义泛型类外,还可以定义泛型接口。泛型接口定义形式:interface接口名<类型参数表列>{//……}8.1.3泛型接口的定义除了可以定义泛型类外,还可以定义泛88.1.3泛型接口的定义在实现接口时,也应该声明与接口相同的类型参数。实现形式如下:class类名<类型参数表列>implements接口名<类型参数表列>{//…}8.1.3泛型接口的定义在实现接口时,也应该声明与接口相同98.1.4泛型方法的定义1.泛型方法[访问限定词][static]<类型参数表列>方法类型方法名([参数表列]){//…}方法也可以是泛型方法,泛型方法可以定义在泛型类中,也可以定义在非泛型类中。泛型方法定义形式:8.1.4泛型方法的定义1.泛型方法[访问限定词]108.1.4

泛型方法的定义2.具有可变参数的方法System.out.printf(“%d,%f\n”,i,f);System.out.printf(“x=%d,y=%d,z=%d”,x,y,z);printf是具有可变参数的方法。利用泛型方法,可以定义具有可变参数的方法,如printf方法:8.1.4泛型方法的定义2.具有可变参数的方法Sys118.1.4泛型方法的定义[访问限定词]<类型参数表列>方法类型方法名(类型参数名…参数名){//……}【例8.3】具有可变参数的方法的定义与使用。Example8_03.java2.具有可变参数的方法8.1.4泛型方法的定义[访问限定词]<类型参数表列>128.1.5泛型参数的限定

如果只接收指定范围内的类类型,可以对泛型的参数进行限定。参数限定的语法形式:类型形式参数extends父类“类型形式参数”是指声明泛型类时所声明的类型,“父类”表示只有这个类下面的子类才可以做实际类型。【例8.4】定义一个泛型类,能够找出多个数据中的最大数和最小数。Example8_04.java8.1.5泛型参数的限定如果只接收指定范围内的类类型,138.2集合类总览8.3List集合8.4Set集合8.1泛型8.5Map集合8.6集合元素的操作8.7小结C目录ONTENTS8.2集合类总览8.3List集合8.4S148.2.1集合类及其特点集合类的特点:空间自主调整,提高空间利用率。提供不同的数据结构和算法,减少编程工作量。提高程序的处理速度和质量。注意:集合类不支持简单数据类型的存放和处理。如果确实需要存储简单类型数据可以先进行类的封装(装箱)处理。集合类中存放的是对象的引用,而不是对象本身。8.2.1集合类及其特点集合类的特点:注意:158.2.2Java的集合类Collection<interface>List<interface>Set<interface>ArrayListLinkedListHashSetTreeSetMap<interface>HashMapTreeMapVectorStack8.2.2Java的集合类CollectionListS168.2.2Java的集合类Java的集合类主要继承了Map接口和Collection接口。其中在Collection接口中定义了大多数集合类支持的方法。下面给出Collection接口的部分方法。返回类型方法名方法功能booleanadd(Ee)向集合中添加新元素booleanaddAll(Collectionc)将指定集合中的所有元素添加到当前集合中。booleanremove(Objecto)删除当前集合中包含的指定元素booleanremoveAll(Collectionc)删除当前集合中与指定集合相同的所有元素booleanretainAll(Collectionc)保留当前集合中与指定集合相同的所有元素voidclear()删除当前集合中的所有元素booleancontains(Objecto)查找当前集合中是否有指定元素booleancontainsAll(Collectionc)查找当前集合中是否包含指定集合中的所有元素booleanisEmpty()当前集合是否为空intsize()返回当前集合的元素个数Iteratoriterator()返回一个可遍历当前集合的迭代器Streamstream()返回一个连接集合的顺序流Object[]toArray()返回一个当前集合所有元素的数组8.2.2Java的集合类Java的集合类主要继承了Ma178.2.2Java的集合类Java中实现Collection接口的类,主要包括List集合接口和Set集合接口。List是一个有序元素集合,允许出现重复元素。Set是一个无序集合,不允许出现重复元素。Map是Java.util包中的另一个接口,Map集合中的每个元素都由一个键-值对构成。在Map中不能有重复的键,但是可以有相同的值。集合类均采用泛型进行定义。8.2.2Java的集合类Java中实现Collecti188.2集合类总览8.3List集合8.4Set集合8.1泛型8.5Map集合8.6集合元素的操作8.7小结C目录ONTENTS8.2集合类总览8.3List集合8.4S198.3.1List接口List集合接口,也称之为线性表,是一个有序列表。集合中的元素是按顺序进行存放和处理的,可以像访问数组元素一样通过序号访问和处理List集合元素。List集合重点关注的是索引而不是元素本身,集合中允许出现重复元素。实现List集合接口的常用类有ArrayList、LinkedList、Vector和Stack。8.3.1List接口List集合接口,也称之为线性表,208.3.1List接口表8.2List接口中的主要方法类型方法名方法功能booleanadd(Ee)把元素e加到表的尾部voidadd(int

index,E

e)把元素e加到表的index位置,原index位置元素顺序后移booleanequals(Object

o)比较对象o是否与表中的元素是同一元素Eget(int

index)得到表中index位置的元素booleanindexOf(Objecto)判断元素o在表中是否存在。如果不存在,则返回-1Iterator<E>iterator()获得表的遍历器List接口的定义形式:publicinterfaceList<E>extendsCollection<E>8.3.1List接口表8.2List接口中的主要方218.3.2ArrayList集合类ArrayList是一种具有可变大小的动态数组结构,ArrayList类的定义

形式:publicclassArrayList<E>extendsAbstractList<E>implementsList<E>,RandomAccess,Cloneable,Serializable8.3.2ArrayList集合类ArrayList是一228.3.2ArrayList集合类表8.3ArrayList类的构造方法【例8.5】已知一个人员名单,将每个名字前面添加一个序号。Example8_05.java方法名方法功能ArrayList()构造一个初始容量为10的空列表。ArrayList(Collection

c)构造一个包含指定collection的元素的列表。ArrayList(int

capacity)构造一个具有指定初始容量的空列表。8.3.2ArrayList集合类表8.3ArrayL238.3.3LinkedList集合类LinkedList集合类是另一个常用的线性列表集合,采用的是双向链表结构。LinkedList类的定义形式:publicclassLinkedList<E>extendsAbstractSequentialList<E>implementsList<E>,Deque<E>,Cloneable,Serializable8.3.3LinkedList集合类LinkedList248.3.3LinkedList集合类LinkedList实现了两个接口:List和Deque接口,List接口中定义了线性表操作方法,Deque接口中定义了线性数列从队列两端访问元素的方法。LinkedList对象既可以表示线性序列表,也可以把它当做堆栈使用,还可以把它当做队列使用。8.3.3LinkedList集合类LinkedList258.3.3LinkedList集合类返回类型方法名方法功能booleanadd(Ee)将元素e加到列表的末尾voidadd(int

index,E

element)把元素e插入到列表index所指位置,原位置元素顺序后移voidaddFirst(E

e)将元素e插入到列表的头部EgetFirst()返回列表的头部元素intindexOf(Object

o)返回元素o在列表中第1次出现的位置。如果无元素o,则返回-1booleanofferFirst(E

e)将元素e插入到列表的头部EpollLast()返回列表中尾部元素并且从表中删除该元素。如果表空,则返回nullEpop()栈顶元素出栈voidpush(E

e)元素e入栈EremoveFirst()从列表中删除头部元素并返回该元素LinkedList类的部分方法【例8.6】求小于某个正整数的所有素数。Example8_06.java8.3.3LinkedList集合类返回类型方法名方法268.2集合类总览8.3List集合8.4Set集合8.1泛型8.5Map集合8.6集合元素的操作8.7小结C目录ONTENTS8.2集合类总览8.3List集合8.4S27Set接口的定义形式:publicinterfaceSet<E>extendsCollection<E>Set实现了Collection接口定义的所有操作。Set还能利用相关方法实现数学上的集合运算,如交集、并集、差集8.4.1Set接口表8.5常用的集合运算方法说明集合运算对应方法实现功能并集addAll(Collectionc)得到两个集合的并集,结果保存到当前集合中交集retainAll(Collectionc)得到两个集合的交集,结果保存到当前集合中差集removeAll(Collectionc)得到两个集合的差集,结果保存到当前集合中超集containsAll(Collectionc)当前集合是否包含集合c的所有元素,是返回trueSet接口的定义形式:8.4.1Set接口表8.5常用288.4.2HashSet集合类HashSet的定义形式:publicclassHashSet<E>extendsAbstractSet<E>implementsSet<E>,Cloneable,Serializable该类实现了Set接口,为用户提供快速查找和添加元素功能。8.4.2HashSet集合类HashSet的定义形式:298.4.2HashSet集合类说明:使用构造方法创建空HashSet,会预先分配一些元素空间,默认是16个元素。构造方法中的加载因子是指当空间利用率达到这个因子时就需要进行扩容了。HashSet存储每个元素时会生成一个唯一的整数标识——散列码(hashcode。HashSet根据这个标识来决定元素所在的存储位置。缺点:保存的元素无任何特定的顺序。8.4.2HashSet集合类说明:308.4.2HashSet集合类返回类型方法名方法功能HashSet()构造一个新的空set,初始容量是16,加载因子是0.75。HashSet(Collectionc)构造一个包含指定collection中的元素的新set。HashSet(intCapacity)构造一个新的空set,指定初始容量和默认的加载因子(0.75)。HashSet(intCapacity,floatloadFactor)

构造一个新的空set,指定初始容量和加载因子。booleanadd(Ee)如果set中没有元素e,则添加。voidclear()删除set中所有元素。Objectclone()返回此HashSet实例的副本,但并不复制这些元素本身。booleancontains(Objecto)查询set中是否包含指定元素obooleanisEmpty()判断set中是否没有任何元素。Iterator<E>iterator()返回set中元素进行迭代的迭代器。booleanremove(Objecto)删除set中的指定元素ointsize()返回set中的元素的数量(set的容量)。表8.6HashSet的主要方法8.4.2HashSet集合类返回类型方法名方法功能Ha318.4.3TreeSet集合类、TreeSet类的定义形式:publicclassTreeSet<E>extendsAbstractSet<E>implementsNavigableSet<E>,Cloneable,Serializable说明:TreeSet内部采用了二叉搜索树的数据结构进行元素的存储,实现了元素的有序存放。TreeSet适合按顺序遍历。使用TreeSet类的前提条件:存储的元素类型必须是可排序的。8.4.3TreeSet集合类、TreeSet类的定义形328.4.3TreeSet集合类返回类型方法名方法功能TreeSet()构造一个新的空TreeSet,根据元素的自然顺序进行排序。TreeSet(Collectionc)构造一个包含指定Collection元素的新TreeSet,按照元素的自然顺序进行排序。表8.7TreeSet的构造方法8.4.3TreeSet集合类返回类型方法名方法功能Tr338.4.3TreeSet集合类返回类型方法名方法功能Comparatorcomparator()返回对此set中的元素进行排序的比较器。Iterator<E>iterator()返回元素按升序进行迭代的迭代器。Iterator<E>descendingIterator()返回元素按降序进行迭代的迭代器。Efirst()返回第一个元素。Elast()返回最后一个元素。Eceiling(Ee)返回大于等于给定元素的最小元素;如果不存在,则返回null。Efloor(Ee)返回小于等于给定元素的最大元素;如果不存在,则返回null。Elower(Ee)返回小于给定元素的最大元素;如果不存在,则返回null。Ehigher(Ee)返回大于给定元素的最小元素;如果不存在,则返回null。表8.8TreeSet类的部分方法【例8.7】班级学生报名参加校运动会,已知各项比赛的报名人员,请统计班级参加比赛的人数。Example8_07.java8.4.3TreeSet集合类返回类型方法名方法功能Co348.2集合类总览8.3List集合8.4Set集合8.1泛型8.5Map集合8.6集合元素的操作8.7小结C目录ONTENTS8.2集合类总览8.3List集合8.4S358.5.1Map接口Map接口是实现映射集合的根接口,其定义了关于映射集合的相关操作方法。返回类型方法名方法功能voidclear()删除集合中的所有元素booleancontainsKey(Objectkey)查询集合中是否存在指定的key键booleancontainsValue(Objectvalue)查询集合中是否存在指定的value值Set<Map.Entry<K,V>>entrySet()返回集合中包含的所有键值对的Set集合视图。booleanequals(Objecto)比较指定的对象与此集合对象是否相等。Vget(Objectkey)返回指定键所映射的值;如果键不存在则返回null。表8.9Map接口的常用方法8.5.1Map接口Map接口是实现映射集合的根接口,368.5.1Map接口返回类型方法名方法功能booleanisEmpty()查询集合是否为空。Set<K>keySet()返回集合中包含的所有键的Set集合视图。Vput(Kkey,Vvalue)添加一个键值对,如果存在该键,则替换原有的值。voidputAll(Mapm)将集合m中所有键值对复制到当前集合中。Vremove(Objectkey)删除指定键可以的键值对。intsize()返回集合中的键值对个数。Collection<V>values()返回集合中包含的所有值的集合视图。续表8.5.1Map接口返回类型方法名方法功能boolea378.5.2HashMap集合类HashMap类的定义形式:publicclassHashMap<K,V>extendsAbstractMap<K,V>implementsMap<K,V>,Cloneable,Serializable8.5.2HashMap集合类HashMap类的定义形式388.5.2HashMap集合类方法名方法功能HashMap()构造一个具有默认初始容量(16)和默认加载因子(0.75)的空HashMap。HashMap(intCapacity)构造一个带指定初始容量和默认加载因子(0.75)的空HashMap。HashMap(intCap,floatf)构造一个带指定初始容量和加载因子的空HashMap。HashMap(Mapm)构造一个映射关系与指定Map相同的新HashMap。表8.10HashMap的构造方法【例8.8】创建一个电话簿,并查询“zhangsan”的电话号码是多少。Example8_08.java8.5.2HashMap集合类方法名方法功能HashMa398.5.3TreeMap集合类TreeMap集合类的定义形式:publicclassTreeMap<K,V>extendsAbstractMap<K,V>implementsNavigableMap<K,V>,Cloneable,Serializable该集合类根据键的自然顺序进行排序,或者根据构造集合对象时提供的

Comparator

进行排序。TreeMap类是对基于红黑树(Red-Blacktree)的NavigableMap接口的具体实现。8.5.3TreeMap集合类TreeMap集合类的定义408.5.3TreeMap集合类方法名方法功能TreeMap()构造一个新的、空的集合。TreeMap(Comparatorc)构造一个新的、空的集合,集合的排序方式由给定的比较器决定。TreeMap(Mapm)

构造一个与给定m相同的自然排序的新集合。TreeMap(SortedMapm)

构造一个与指定有序集合m相同的新的集合。表8.11TreeMap类的构造方法8.5.3TreeMap集合类方法名方法功能TreeMa418.5.3TreeMap集合类返回类型方法名方法功能

Map.EntryceilingEntry(Kkey)返回一个不小于给定键的最小键值对;如不存在,则返回null。KceilingKey(Kkey)返回一个大于等于给定键的最小键;如不存在,则返回null。NavigableSetdescendingKeySet()返回此集合中所有键的逆序集合视图。Map.EntryfirstEntry()返回此集合中最小键的键值对;如果集合为空,则返回null。KfirstKey()返回此集合中第一个(最小)键。Vget(Objectkey)返回指定键所映射的值,如不存在,则返回null。SetkeySet()返回此集合中所有键的Set视图。Map.EntrylastEntry()返回此集合中的最大键的键值对;如果为空,则返回null。

Map.EntrypollFirstEntry()移除并返回与此集合中的最小键的键-值对;如果为空,则返回null。表8.12TreeMap类的常用方法【例8.9】将例8.8的电话簿按姓名排序输出。Example8_09.java8.5.3TreeMap集合类返回类型方法名方法功能

M428.2集合类总览8.3List集合8.4Set集合8.1泛型8.5Map集合8.6集合元素的操作8.7小结C目录ONTENTS8.2集合类总览8.3List集合8.4S438.6.1使用Iterator迭代器Iterator,称为迭代器,是一种允许用户以顺序方式高效访问集合元素的一种特殊对象。使用迭代器可以简化遍历集合元素的过程。Java定义了Iterator接口,描述了在遍历元素时所需要使用的方法。而具体Iterator接口的实现则由各集合类根据自身结构特点来完成。8.6.1使用Iterator迭代器Iterator,448.6.1使用Iterator迭代器Iterator接口只提供了三个方法:hasNext()方法,next()方法和remove()方法。hasNext()方法判断是否遍历到集合的最后一个元素;next()方法返回迭代器指向的下一个元素;remove()方法删除迭代器当前返回的元素。Java提供的ListIterator接口扩展了Iterator接口的功能,定义了逆向遍历的方法,实现List接口的类均实现了ListIterator迭代器。【例8.10】删除数组中长度为偶数的字符串。Example8_10.java8.6.1使用Iterator迭代器Iterator接458.6.2使用CollectionsCollections类与Collection接口的区别:Collection接口是一类集合的根接口,提供对这类集合中的元素进行基本操作的通用方法。Collections类是具体的实现类,为实现Collection接口的集合提供了一系列静态方法,完成元素的处理,如排序、查找、特定变换等操作。Collections类是Java为方便进行Collection集合的操作和处理所提供的类。8.6.2使用CollectionsCollections468.6.2使用Collections返回类型方法名方法功能staticintbinarySearch(Listlist,Tkey)使用二分搜索法搜索列表,返回key所在的位置。staticvoidcopy(Listdest,Listsrc)将所有元素从列表src复制到列表dest。staticvoidfill(Listlist,Tobj)使用元素obj替换列表list中的所有元素。staticTmax(Collectioncoll)按自然顺序,返回集合coll的最大元素。staticTmax(Collectioncoll,Comparatorcomp)按指定比较器comp产生的顺序,返回集合coll的最大元素。表

8.13Collections类常用方法8.6.2使用Collections返回类型方法名方法功能478.6.2使用Collections返回类型方法名方法功能staticTmin(Collectioncoll)按元素的自然顺序返回集合coll的最小元素。staticbooleanreplaceAll(Listlist,ToldVal,TnewVal)使用元素newVal替换列表中出现的所有oldVal元素。staticvoidreverse(Listlist)反转列表list中元素的顺序。staticvoidsort(Listlist)按元素的自然顺序对列表list按升序进行排序。staticvoidsort(Listlist,Comparatorc)按指定比较器产生的顺序对列表list进行排序。staticvoidswap(Listlist,inti,intj)将列表list中第i位置和第j位置的元素进行互换。续表【例8.11】有一个学生点名册,要求按学号进行排序。Example8_11.java8.6.2使用Collections返回类型方法名方法功能488.6.3使用Lambda表达式Lambda表达式是Java1.8中新增的一种特性。Lambda表达式用更少的代码实现同样的功能。代码更简洁紧凑,支持大集合的并行操作。Java1.8新增了java.util.stream和java.util.function两个包用于扩展集合的操作。8.6.3使用Lambda表达式Lambda表达式是J498.6.3使用Lambda表达式stream可以在集合上建立一个管道流,进入流的集合元素可以进行一些中间操作,如对元素进行条件过滤。条件的给定就要使用function包中的类完成;最后可以对符合条件的元素进行相关处理,如字符转换,数据计算等。Lambda表达式配合这两个包的应用,大大增强了对集合的处理能力。8.6.3使用Lambda表达式stream可以在集合508.6.3使用Lambda表达式1.Lambda表达式Lambda语法格式:(parameters)->expression或者(parameters)->{statements;}Lambda表达式由三部分组成:parameters:形参列表。->:表示为“被用于”。方法体:可以是表达式也可以是代码块,实现函数接口中的方法。方法体可以有返回值也可以没有返回值。

8.6.3使用Lambda表达式1.Lambda表达式L518.6.3使用Lambda表达式1.Lambda表达式几个简单示例:()->1没有参数,直接返回1;(intx,inty)->x+y有两个int类型的参数,返回这两个参数的和;(x,y)->x+y有两个参数,JVM根据上下文推断参数的类型,返回两个参数的和;(Stringname,Stringnumber)->{System.out.println(name);System.out.println(number)}有两个String类型参数,分别进行输出,没有返回值;

x->2*x有一个参数,返回它本身的2倍。8.6.3使用Lambda表达式1.Lambda表达式几528.6.3使用Lambda表达式2.stream流stream表示数据流,流本身并不存储元素,在流中的操作也不会改变源数据,而是生成新Stream。在数据流中,可以对数据做多次处理和操作。stream既支持串行也支持并行。8.6.3使用Lambda表达式2.stream流str538.6.3使用Lambda表达式返回类型方法名方法功能static

Streamconcat(Streama,Streamb)创建一个流,其元素是a后跟b的所有元素。longcount()返回此流中的元素数。Streamdistinct()返回由该流的不同元素组成的流。staticStreamempty()返回一个空的顺序流。表8.14stream接口的常用方法8.6.3使用Lambda表达式返回类型方法名方法功能st548.6.3使用Lambda表达式返回类型方法名方法功能Streamfilter(Predicatep)返回一个符合匹配条件的流。voidforEach(Consumeraction)对流的每个元素执行操作。Streamlimit(longmaxSize)返回长度不超过maxSize的子流。Streammap(Functionmapper)返回该流元素执行函数后的结果组成的流。Streamskip(longn)丢弃首个n元素后,返回由该流的n元素组成的流。续表例8.12:将集合中所有长度不小于4的字符串转换成大写字符后输出。Example8_12.java8.6.3使用Lambda表达式返回类型方法名方法功能St55综合应用举例编程实现圆圈报数游戏。有n个人围坐一圈,从第m个人开始报数,每报到数字k或k的倍数,这个人被淘汰。求最后的胜利者是谁。【分析】该题目的实现可以有多种方法,一种是直接按照题意,将人员信息放到数组中,每个人员记录姓名,所在位置和当前状态,初始状态均为真,即都参与报数游戏。从指定的第m个人开始计数,当计数值为k时,则将该人的状态改为假,即退出报数游戏。直到剩余1人完成报数游戏,最后输出该人的位置和姓名。综合应用举例编程实现圆圈报数游戏。有n个人围坐一圈,从第m个56综合应用举例我们还可以采用另一种方法,即利用动态数组存放人员信息。每报数到k时,将当前报数人从动态数组中移出,直到只剩一个人为止。方法1:Example8_13.java方法2:Example8_13_2.java综合应用举例我们还可以采用另一种方法,即利用动态数组存放人员578.2集合类总览8.3List集合8.4Set集合8.1泛型8.5Map集合8.6集合元素的操作8.7小结C目录ONTENTS8.2集合类总览8.3List集合8.4S58小结Summary本章首先讲述了集合类中用到的一种类型:泛型,利用泛型可以让集合很容易实现不同类型对象的存储。接着,对Java的集合类进行了一个总览性的介绍,用于了解Java的集合类及其不同特点。然后,详细讲解了Java的三个主要集合:List集合,Set集合,Map集合。这些集合的存储结构各不相同,在使用上有各自不同的特点,因此通过案例对这些集合类的定义和使用方法进行了详细分析和介绍。最后,集中介绍了对元素进行遍历和访问的几种不同方法,便于用户根据实际应用选择相应的方法进行数据操作。小结Summary本章首先讲述了集合类中用到的一种类型:泛型59谢谢观赏Java程序设计谢谢观赏Java程序设计608集合类第章Java程序设计8集合类第章Java程序设计618.2集合类总览8.3List集合8.4Set集合8.1泛型8.5Map集合8.6集合元素的操作8.7小结C目录ONTENTS8.2集合类总览8.3List集合8.4S628.1.1什么是泛型泛型,也称之为“参数化类型”,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。8.1.1什么是泛型泛型,也称之为“参数化类型”,就是将638.1.1什么是泛型【例8.1】假设有一个篮子(Basket),我们可以用它存放不同的物品,如放鸡蛋(Egg),放面包(Bread),当然也可以放钱(Money)等等。如何定义这个Basket类来满足存放不同种类物品的需求呢?【分析】在定义这个类时,需要解决这样一个问题:放入篮子的这些物品对象存放在哪?我们可以通过数组来存放这些对象;这样引出了下一个问题:数组类型如何定义可以满足存放不同类型的物品?我们可以用所有类型的父类Object来进行定义。Example8_01.java8.1.1什么是泛型【例8.1】假设有一个篮子(Bask648.1.2泛型类的定义泛型类是带有类型参数的类,类中也有属性和方法。泛型类的定义形式:class泛型类名<类型参数表列>{//类体}泛型类型参数:T:代表这是一个类型TypeE:代表这是一个元素ElementK:代表这是一个键KeyV:代表这是一个值Value8.1.2泛型类的定义泛型类是带有类型参数的类,类中也有658.1.2泛型类的定义定义泛型类的对象:泛型类名[<实际类型表列>]对象名=new泛型类名[<实际类型表列>]([形参表]);或泛型类名[<实际类型表列>]对象名=new泛型类名[<>]([形参表]);也可以用“?”代替“实际参数表列”如:Basket<Egg>basket=newBasket<Egg>();【例8.2】定义一个泛型篮子类,并创建相关的对象。Example8_02.java8.1.2泛型类的定义定义泛型类的对象:泛型类名[<实际668.1.2泛型类的定义

泛型的使用规则:泛型的类型参数只能是类类型,而不能是简单类型。泛型的类型参数可以有多个。静态字段的类型不能是类型参数。不能直接创建类型参数变量的数组,只能通过反射创建。泛型的参数类型可以使用extends和super关键字。泛型的参数类型还可以是通配符类型。8.1.2泛型类的定义泛型的使用规则:678.1.3泛型接口的定义除了可以定义泛型类外,还可以定义泛型接口。泛型接口定义形式:interface接口名<类型参数表列>{//……}8.1.3泛型接口的定义除了可以定义泛型类外,还可以定义泛688.1.3泛型接口的定义在实现接口时,也应该声明与接口相同的类型参数。实现形式如下:class类名<类型参数表列>implements接口名<类型参数表列>{//…}8.1.3泛型接口的定义在实现接口时,也应该声明与接口相同698.1.4泛型方法的定义1.泛型方法[访问限定词][static]<类型参数表列>方法类型方法名([参数表列]){//…}方法也可以是泛型方法,泛型方法可以定义在泛型类中,也可以定义在非泛型类中。泛型方法定义形式:8.1.4泛型方法的定义1.泛型方法[访问限定词]708.1.4

泛型方法的定义2.具有可变参数的方法System.out.printf(“%d,%f\n”,i,f);System.out.printf(“x=%d,y=%d,z=%d”,x,y,z);printf是具有可变参数的方法。利用泛型方法,可以定义具有可变参数的方法,如printf方法:8.1.4泛型方法的定义2.具有可变参数的方法Sys718.1.4泛型方法的定义[访问限定词]<类型参数表列>方法类型方法名(类型参数名…参数名){//……}【例8.3】具有可变参数的方法的定义与使用。Example8_03.java2.具有可变参数的方法8.1.4泛型方法的定义[访问限定词]<类型参数表列>728.1.5泛型参数的限定

如果只接收指定范围内的类类型,可以对泛型的参数进行限定。参数限定的语法形式:类型形式参数extends父类“类型形式参数”是指声明泛型类时所声明的类型,“父类”表示只有这个类下面的子类才可以做实际类型。【例8.4】定义一个泛型类,能够找出多个数据中的最大数和最小数。Example8_04.java8.1.5泛型参数的限定如果只接收指定范围内的类类型,738.2集合类总览8.3List集合8.4Set集合8.1泛型8.5Map集合8.6集合元素的操作8.7小结C目录ONTENTS8.2集合类总览8.3List集合8.4S748.2.1集合类及其特点集合类的特点:空间自主调整,提高空间利用率。提供不同的数据结构和算法,减少编程工作量。提高程序的处理速度和质量。注意:集合类不支持简单数据类型的存放和处理。如果确实需要存储简单类型数据可以先进行类的封装(装箱)处理。集合类中存放的是对象的引用,而不是对象本身。8.2.1集合类及其特点集合类的特点:注意:758.2.2Java的集合类Collection<interface>List<interface>Set<interface>ArrayListLinkedListHashSetTreeSetMap<interface>HashMapTreeMapVectorStack8.2.2Java的集合类CollectionListS768.2.2Java的集合类Java的集合类主要继承了Map接口和Collection接口。其中在Collection接口中定义了大多数集合类支持的方法。下面给出Collection接口的部分方法。返回类型方法名方法功能booleanadd(Ee)向集合中添加新元素booleanaddAll(Collectionc)将指定集合中的所有元素添加到当前集合中。booleanremove(Objecto)删除当前集合中包含的指定元素booleanremoveAll(Collectionc)删除当前集合中与指定集合相同的所有元素booleanretainAll(Collectionc)保留当前集合中与指定集合相同的所有元素voidclear()删除当前集合中的所有元素booleancontains(Objecto)查找当前集合中是否有指定元素booleancontainsAll(Collectionc)查找当前集合中是否包含指定集合中的所有元素booleanisEmpty()当前集合是否为空intsize()返回当前集合的元素个数Iteratoriterator()返回一个可遍历当前集合的迭代器Streamstream()返回一个连接集合的顺序流Object[]toArray()返回一个当前集合所有元素的数组8.2.2Java的集合类Java的集合类主要继承了Ma778.2.2Java的集合类Java中实现Collection接口的类,主要包括List集合接口和Set集合接口。List是一个有序元素集合,允许出现重复元素。Set是一个无序集合,不允许出现重复元素。Map是Java.util包中的另一个接口,Map集合中的每个元素都由一个键-值对构成。在Map中不能有重复的键,但是可以有相同的值。集合类均采用泛型进行定义。8.2.2Java的集合类Java中实现Collecti788.2集合类总览8.3List集合8.4Set集合8.1泛型8.5Map集合8.6集合元素的操作8.7小结C目录ONTENTS8.2集合类总览8.3List集合8.4S798.3.1List接口List集合接口,也称之为线性表,是一个有序列表。集合中的元素是按顺序进行存放和处理的,可以像访问数组元素一样通过序号访问和处理List集合元素。List集合重点关注的是索引而不是元素本身,集合中允许出现重复元素。实现List集合接口的常用类有ArrayList、LinkedList、Vector和Stack。8.3.1List接口List集合接口,也称之为线性表,808.3.1List接口表8.2List接口中的主要方法类型方法名方法功能booleanadd(Ee)把元素e加到表的尾部voidadd(int

index,E

e)把元素e加到表的index位置,原index位置元素顺序后移booleanequals(Object

o)比较对象o是否与表中的元素是同一元素Eget(int

index)得到表中index位置的元素booleanindexOf(Objecto)判断元素o在表中是否存在。如果不存在,则返回-1Iterator<E>iterator()获得表的遍历器List接口的定义形式:publicinterfaceList<E>extendsCollection<E>8.3.1List接口表8.2List接口中的主要方818.3.2ArrayList集合类ArrayList是一种具有可变大小的动态数组结构,ArrayList类的定义

形式:publicclassArrayList<E>extendsAbstractList<E>implementsList<E>,RandomAccess,Cloneable,Serializable8.3.2ArrayList集合类ArrayList是一828.3.2ArrayList集合类表8.3ArrayList类的构造方法【例8.5】已知一个人员名单,将每个名字前面添加一个序号。Example8_05.java方法名方法功能ArrayList()构造一个初始容量为10的空列表。ArrayList(Collection

c)构造一个包含指定collection的元素的列表。ArrayList(int

capacity)构造一个具有指定初始容量的空列表。8.3.2ArrayList集合类表8.3ArrayL838.3.3LinkedList集合类LinkedList集合类是另一个常用的线性列表集合,采用的是双向链表结构。LinkedList类的定义形式:publicclassLinkedList<E>extendsAbstractSequentialList<E>implementsList<E>,Deque<E>,Cloneable,Serializable8.3.3LinkedList集合类LinkedList848.3.3LinkedList集合类LinkedList实现了两个接口:List和Deque接口,List接口中定义了线性表操作方法,Deque接口中定义了线性数列从队列两端访问元素的方法。LinkedList对象既可以表示线性序列表,也可以把它当做堆栈使用,还可以把它当做队列使用。8.3.3LinkedList集合类LinkedList858.3.3LinkedList集合类返回类型方法名方法功能booleanadd(Ee)将元素e加到列表的末尾voidadd(int

index,E

element)把元素e插入到列表index所指位置,原位置元素顺序后移voidaddFirst(E

e)将元素e插入到列表的头部EgetFirst()返回列表的头部元素intindexOf(Object

o)返回元素o在列表中第1次出现的位置。如果无元素o,则返回-1booleanofferFirst(E

e)将元素e插入到列表的头部EpollLast()返回列表中尾部元素并且从表中删除该元素。如果表空,则返回nullEpop()栈顶元素出栈voidpush(E

e)元素e入栈EremoveFirst()从列表中删除头部元素并返回该元素LinkedList类的部分方法【例8.6】求小于某个正整数的所有素数。Example8_06.java8.3.3LinkedList集合类返回类型方法名方法868.2集合类总览8.3List集合8.4Set集合8.1泛型8.5Map集合8.6集合元素的操作8.7小结C目录ONTENTS8.2集合类总览8.3List集合8.4S87Set接口的定义形式:publicinterfaceSet<E>extendsCollection<E>Set实现了Collection接口定义的所有操作。Set还能利用相关方法实现数学上的集合运算,如交集、并集、差集8.4.1Set接口表8.5常用的集合运算方法说明集合运算对应方法实现功能并集addAll(Collectionc)得到两个集合的并集,结果保存到当前集合中交集retainAll(Collectionc)得到两个集合的交集,结果保存到当前集合中差集removeAll(Collectionc)得到两个集合的差集,结果保存到当前集合中超集containsAll(Collectionc)当前集合是否包含集合c的所有元素,是返回trueSet接口的定义形式:8.4.1Set接口表8.5常用888.4.2HashSet集合类HashSet的定义形式:publicclassHashSet<E>extendsAbstractSet<E>implementsSet<E>,Cloneable,Serializable该类实现了Set接口,为用户提供快速查找和添加元素功能。8.4.2HashSet集合类HashSet的定义形式:898.4.2HashSet集合类说明:使用构造方法创建空HashSet,会预先分配一些元素空间,默认是16个元素。构造方法中的加载因子是指当空间利用率达到这个因子时就需要进行扩容了。HashSet存储每个元素时会生成一个唯一的整数标识——散列码(hashcode。HashSet根据这个标识来决定元素所在的存储位置。缺点:保存的元素无任何特定的顺序。8.4.2HashSet集合类说明:908.4.2HashSet集合类返回类型方法名方法功能HashSet()构造一个新的空set,初始容量是16,加载因子是0.75。HashSet(Collectionc)构造一个包含指定collection中的元素的新set。HashSet(intCapacity)构造一个新的空set,指定初始容量和默认的加载因子(0.75)。HashSet(intCapacity,floatloadFactor)

构造一个新的空set,指定初始容量和加载因子。booleanadd(Ee)如果set中没有元素e,则添加。voidclear()删除set中所有元素。Objectclone()返回此HashSet实例的副本,但并不复制这些元素本身。booleancontains(Objecto)查询set中是否包含指定元素obooleanisEmpty()判断set中是否没有任何元素。Iterator<E>iterator()返回set中元素进行迭代的迭代器。booleanremove(Objecto)删除set中的指定元素ointsize()返回set中的元素的数量(set的容量)。表8.6HashSet的主要方法8.4.2HashSet集合类返回类型方法名方法功能Ha918.4.3TreeSet集合类、TreeSet类的定义形式:publicclassTreeSet<E>extendsAbstractSet<E>implementsNavigableSet<E>,Cloneable,Serializable说明:TreeSet内部采用了二叉搜索树的数据结构进行元素的存储,实现了元素的有序存放。TreeSet适合按顺序遍历。使用TreeSet类的前提条件:存储的元素类型必须是可排序的。8.4.3TreeSet集合类、TreeSet类的定义形928.4.3TreeSet集合类返回类型方法名方法功能TreeSet()构造一个新的空TreeSet,根据元素的自然顺序进行排序。TreeSet(Collectionc)构造一个包含指定Collection元素的新TreeSet,按照元素的自然顺序进行排序。表8.7TreeSet的构造方法8.4.3TreeSet集合类返回类型方法名方法功能Tr938.4.3TreeSet集合类返回类型方法名方法功能Comparatorcomparator()返回对此set中的元素进行排序的比较器。Iterator<E>iterator()返回元素按升序进行迭代的迭代器。Iterator<E>descendingIterator()返回元素按降序进行迭代的迭代器。Efirst()返回第一个元素。Elast()返回最后一个元素。Eceiling(Ee)返回大于等于给定元素的最小元素;如果不存在,则返回null。Efloor(Ee)返回小于等于给定元素的最大元素;如果不存在,则返回null。Elower(Ee)返回小于给定元素的最大元素;如果不存在,则返回null。Ehigher(Ee)返回大于给定元素的最小元素;如果不存在,则返回null。表8.8TreeSet类的部分方法【例8.7】班级学生报名参加校运动会,已知各项比赛的报名人员,请统计班级参加比赛的人数。Example8_07.java8.4.3TreeSet集合类返回类型方法名方法功能Co948.2集合类总览8.3List集合8.4Set集合8.1泛型8.5Map集合8.6集合元素的操作8.7小结C目录ONTENTS8.2集合类总览8.3List集合8.4S958.5.1Map接口Map接口是实现映射集合的根接口,其定义了关于映射集合的相关操作方法。返回类型方法名方法功能voidclear()删除集合中的所有元素booleancontainsKey(Objectkey)查询集合中是否存在指定的key键booleancontainsValue(Objectvalue)查询集合中是否存在指定的value值Set<Map.Entry<K,V>>entrySet()返回集合中包含的所有键值对的Set集合视图。booleanequals(Objecto)比较指定的对象与此集合对象是否相等。Vget(Objectkey)返回指定键所映射的值;如果键不存在则返回null。表8.9Map接口的常用方法8.5.1Map接口Map接口是实现映射集合的根接口,968.5.1Map接口返回类型方法名方法功能booleanisEmpty()查询集合是否为空。Set<K>keySet()返回集合中包含的所有键的Set集合视图。Vput(Kkey,Vvalue)添加一个键值对,如果存在该键,则替换原有的值。voidputAll(Mapm)将集合m中所有键值对复制到当前集合中。Vremove(Objectkey)删除指定键可以的键值对。intsize()返回集合中的键值对个数。Collection<V>values()返回集合中包含的所有值的集合视图。续表8.5.1Map接口返回类型方法名方法功能boolea978.5.2HashMap集合类HashMap类的定义形式:publicclassHashMap<K,V>extendsAbstractMap<K,V>implementsMap<K,V>,Cloneable,Serializable8.5.2HashMap集合类HashMap类的定义形式988.5.2HashMap集合类方法名方法功能HashMap()构造一个具有默认初始容量(16)和默认加载因子(0.75)的空HashMap。HashMap(intCapacity)构造一个带指定初始容量和默认加载因子(0.75)的空HashMap。HashMap(intCap,floatf)构造一个带指定初始容量和加载因子的空HashMap。HashMap(Mapm)构造一个映射关系与指定Map相同的新HashMap。表8.10HashMap的构造方法【例8.8】创建一个电话簿,并查询“zhangsan”的电话号码是多少。Example8_08.java8.5.2HashMap集合类方法名方法功能HashMa998.5.3TreeMap集合类TreeMap集合类的定义形式:publicclassTreeMap<K,V>extendsAbstractMap<K,V>implementsNavigableMap<K,V>,Cloneable,Serializable该集合类根据键的自然顺序进行排序,或者根据构造集合对象时提供的

Comparator

进行排序。TreeMap类是对基于红黑树(Red-Blacktree)的NavigableMap接口的具体实现。8.5.3TreeMap集合类TreeMap集合类的定义1008.5.3TreeMap集合类方法名方法功能TreeMap()构造一个新的、空的集合。TreeMap(Comparatorc)构造一个新的、空的集合,集合的排序方式由给定的比较器决定。TreeMap(Mapm)

构造一个与给定m相同的自然排序的新集合。TreeMap(SortedMapm)

构造一个与指定有序集合m相同的新的集合。表8.11TreeMap类的构造方法8.5.3TreeMap集合类方法名方法功能TreeMa1018.5.3TreeMap集合类返回类型方法名方法功能

Map.EntryceilingEntry(Kkey)返回一个不小于给定键的最小键值对;如不存在,则返回null。KceilingKey(Kkey)返回一个大于等于给定键的最小键;如不存在,则返回null。NavigableSetdescendingKeySet()返回此集合中所有键的逆序集合视图。Map.EntryfirstEntry()返回此集合中最小键的键值对;如果集合为空,则返回null。KfirstKey()返回此集合中第一个(最小)键。Vget(Objectkey)返回指定键所映射的值,如不存在,则返回null。SetkeySet()返回此集合中所有键的Set视图。Map.EntrylastEntry()返回此集合中的最大键的键值对;如果为空,则返回null。

Map.EntrypollFirstEntry()移除并返回与此集合中的最小键的键-值对;如果为空,则返回null。表8.12TreeMap类的常用方法【例8.9】将例8.8的电话簿按姓名排序输出。Example8_09.java8.5.3TreeMap集合类返回类型方法名方法功能

M1028.2集合类总览8.3List集合8.4Set集合8.1泛型8.5Map集合8.6集合元素的操作8.7小结C目录ONTENTS8.2集合类总览8.3List集合8.4S1038.6.1使用Iterator迭代器Iterator,称为迭代器,是一种允许用户以顺序方式高效访问集合元素的一种特殊对象。使用迭代器可以简化遍历集合元素的过程。Java定义了Iterator接口,描述了在遍历元素时所需要使用的方法。而具体Iterator接口的实现则由各集合类根据自身结构特点来完成。8.6.1使用Iterator迭代器Iterator,1048.6.1使用Iterator迭代器Iterator接口只提供了三个方法:hasNext()方法,next()方法和remove()方法。hasNext()方法判断是否遍历到集合的最后一个元素;next()方法返回迭代器指向的下一个元素;remove()方法删除迭代器当前返回的元素。Java提供的

温馨提示

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

评论

0/150

提交评论