第7章容器和泛型课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《第7章容器和泛型课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 容器 课件
- 资源描述:
-
1、第第7章章 容器和泛型容器和泛型T7.8 泛型方法泛型方法T7.7 泛型泛型T7.12 泛型数组泛型数组T7.1 Collection与与IteratorT7.2 实用类实用类CollectionsT7.3 Set(集集)T7.4 List(列表列表)T7.5 Queue(队列队列)T7.6 Map(映射映射)T7.9 受限泛型受限泛型T7.10 通配符与受限通配符通配符与受限通配符T7.11 子类泛型子类泛型T7.13 综合实例综合实例第第7章章 容器和泛型容器和泛型Java实用类库提供了一套相当完整的容器类来解决这个问题,其中基本的类型是List、Set、Queue和Map,这些对象类型也
2、称为集合类。容器提供了完善的方法来保存对象。Java的容器类库位于java.util包中,Java容器类库中的接口及类之间的关系如图7.1所示,图中实线表示继承,虚线表示接口实现。而泛型的引入最主要原因就是安全地使用容器类。图图7.1 容器类容器类7.1 Collection与与IteratorCollection 是容器类的根接口,List、Set、Queue是它的直接子接口。Collection 表示一组对象,这些对象也称为 Collection 的元素。List类型的容器允许加入重复对象,按照索引位置排序并且按照在容器中的索引位置检索对象。Set类型的容器不允许加入重复对象,也不按照某种
3、方式排序对象。Map接口没有继承Collection接口。Map类型的容器中的每一个元素包含一对键对象和值对象,容器中的键对象不可重复,值对象可以重复。表7.1列出了Collection接口的常用方法。方法描述boolean add(E e)向容器中添加一个元素boolean addAll(Collection c)向容器中添加参数中所有的元素void clear()移除容器中的所有元素boolean contains(Object o)判定此 collection 是否包含指定的元素,有则返回 trueboolean containsAll(Collection c)判定此 collecti
4、on 是否包含指定 collection 中的所有元素,是则返回 trueboolean isEmpty()判定此容器是否为空,是则返回trueIterator iterator()返回一个Iterator,用来遍历容器中的所有元素boolean remove(Object o)如果容器中存在此元素,则删除它boolean retainAll(Collection c)将此Collection与参数c的交集存入此Collection中int size()返回此 collection 中的元素数目Object toArray()返回包含此 collection 中所有元素的数组表表7.1 Col
5、lection的常用方法的常用方法7.1 Collection与与IteratorCollection接口的iterator()和toArray()方法都用于获得容器中所有元素,前者返回一个Iterator对象,后者返回一个包含容器中所有元素的数组。Iterator接口中声明了如下方法:lboolean hasNext():判断容器中的元素是否遍历完毕,没有则返回true。lnext():返回迭代的下一个元素。lvoid remove():从迭代器指向的Collection中移除迭代器返回的最后一个元素。必须先调用一次next()方法之后,才能调用一次remove(),即remove()不能连
6、续多次调用。【例例7.1】向容器中添加一组元素,用iterator()方法遍历容器中的元素。7.2 实用类实用类Collections就像java.util.Arrays一样,java.util.Collections类也有一些实用的static方法,其中一部分方法专门用于操纵List类型容器,还有一部分方法可用于操纵所有的Collection类型或Map类型容器。List代表长度可变的线性表,Collections的以下方法适用于List类型。copy(List dest,List src):将所有元素从一个列表复制到另一个列表。fill(List list,T obj):使用指定元素替换指
7、定列表中的所有元素。nCopies(int n,T o):返回由指定对象的n个副本组成的不可修改的列表。shuffle(List list):使用默认随机源对指定列表进行置换。sort(List list):根据元素的自然顺序对指定列表按升序进行排序。【例例7.2】使用Collections的nCopies()、min()、max()、binarySearch()等常用方法。7.3 Set(集集)7.3.1 HashSetHashSet类按照哈希算法来存取容器中的对象,具有很好的存取和查找性能。当向容器中加入一个对象时,HashSet会调用对象的hashCode()方法来获取哈希码,然后根据这
8、个哈希码进一步计算出对象在容器中的存放位置。在Object类中定义hashCode()和equals()方法,Object类的equals()方法按照对象的内存地址比较对象是否相等,因此如果object1.equals(object2)为true,则表明object1变量和object2变量实际上引用同一个对象,那么object1和object2的哈希码也肯定相同。为了保证HashSet能正常工作,要求当两个对象用 equals()方法比较的结果为true时,它们的哈希码也相等。例如,如果object1.equals(object2)为true 时,那么以下表达式的结果也应为true。obje
9、ct1.hashCode()=object2.hashCode();如果用户定义的类覆盖Object类equals()方法,但没有覆盖Objec类hashCode()方法就会导致object1.equals(object2)为true 时,而object1和object2的哈希码不一定一样,这会使HashSet无法正常工作。【例例7.3】测试不同时重载Object类的equals()和hashCode()方法。7.3.2 TreeSet TreeSet类实现了SortedSet接口,能够对容器中的对象进行排序。当向TreeSet中加入一个对象后,会继续保持对象间的排序的次序,例如下面的代码片段
10、:Set set=new TreeSet();set.add(new String(spring);set.add(new String(summer);set.add(new String(autumn);set.add(new String(winter);System.out.println(set);运行结果:autumn,spring,summer,winterTreeSet支持两种排序方式:自然排序和指定排序。在默认的情况下TreeSet采用自然排序方式。h1.自然排序自然排序在JDK类库中,有一部分类实现了java.lang.Comparable接口,如Integer、Doubl
11、e 和String等。Comparable接口有一个compareTo(Object o)方法,它返回整数类型。pareTo(y):如果返回值为0,则表示x 和y 相等;如果返回值大于0,则表示x大于y;如果返回值小于0,则表示x小于y。7.3.2 TreeSet TreeSet调用对象的compareTo()方法比较容器中对象的大小,然后进行升序排列。表7.2列出了JDK类库中实现了Comparable接口的一些类的排序及其排序方式。类排序方式BigDecimal、Integer、Byte、DoubleFloat、Integer、Long、Short按数字大小排序Character按字符的U
12、nicode值的数字大小排序String 按字符串字符的Unicode值排序表表7.2 类的排序类的排序使用自然排序时,只能向TreeSet容器中加入同类型的对象,如下所示。Set set=new TreeSet();set.add(new Integer(1);set.add(new String(spring);System.out.println(set);/抛出java.lang.ClassCastException异常向TreeSet容器中加入同类型的对象,要求这些对象的类必须实现Comparable接口。【例例7.4】向TreeSet容器中加入4个雇员信息,并按工资的多少进行升序排
13、列。7.3.2 TreeSet h2.指定排序指定排序Java.util.Comparator接口提供具体的排序方式,指定被比较的对象的类型,Comparator接口的compare(T o1,T o2)方法用于比较两个对象的大小。当compare(T o1,T o2)的返回值大于0时,表示o1大于o2;当compare(T o1,T o2)的返回值等于0时,表示o1等于o2;当compare(T o1,T o2)的返回值小于0时,表示o1小于o2。【例例7.5】实现Comparator接口,加入TreeSet容器中的对象以brand降序排列、以place升序排列。7.4 List(列表列表)
14、7.4.1 ArrayListArrayList代表长度可变的数组,允许对元素进行随机的快速访问,但是向ArrayList中插入与删除元素的速度较慢。ArrayList是线程不安全的,若要成为线程安全的,可用:List list=Collections.synchronizedList(new ArrayList();【例例7.6】运用ArrayList类的各种方法,并展示相似方法的异同点。说明:说明:该程序用到了ArrayList的多个方法。创建了一个ArrayList类型的容器,通过add方法添加四个String类型的对象。容器中含有horse对象,contains()方法返回true。使
15、用remove()方法移除用get()方法得到的pig对象。用subList()方法得到从fromIndex(包括)和 toIndex(不包括)之间的部分视图。Collections.sort(sub)语句对容器中的对象按字母进行排序。Collections.shuffle(sub,rand)语句使用指定的随机源对指定列表进行置换。retainAll()方法是一种有效的“交集”操作,在本例中,它保留了所有同时在copy与sub中的元素。将指定 Collection 中的所有元素插入列表中的指定位置。执行list.toArray()语句返回一个数组,该数组包含容器中的所有元素。执行list.to
16、Array(new String0 语句返回一个数组,该数组包含容器中的所有元素,返回数组的运行时类型与参数数组的类型完全相同,而不是单纯的Object。7.4.2 LinkedListLinkedList在内部是采用双向循环链表实现的,插入与删除元素的速度较快,随机访问速度则较慢。LinkedList单独具有addFirst()、addLast()、getFirst()、getLast()、removeFirst()和removeLast()方法,这些方法使得LinkedList可以作为堆栈、队列和双向队列来使用。这些方法彼此之间只是名称有些差异,或者只存在较少差异,以使得这些名字在特定用法
17、的上下文环境中更加适用(特别是在Queue中)。同样,LinkedList也是线程不安全的。【例例7.7】测试LinkedList类的一些方法的异同点。7.4.3 栈的实现栈的实现“栈”通常是后进先出的容器,先进的后弹出。LinkedList具有能够直接实现栈功能的方法,因此可以直接将LinkedList作为栈使用。【例例7.8】用LinkedList实现栈的功能。7.5 Queue(队列队列)队列是一个典型的先进先出的容器。即从容器的一端放入对象,从另一端取出,并且对象放入容器的顺序与取出的顺序是相同的。队列常被当作一种可靠的将对象从程序的某个区域传输到另一个区域的途径。LinkedList
展开阅读全文