《Java SE程序设计及实践》课件07_第7章 泛型与集合.ppt

上传人(卖家):momomo 文档编号:7944845 上传时间:2024-09-07 格式:PPT 页数:27 大小:695KB
下载 相关 举报
《Java SE程序设计及实践》课件07_第7章 泛型与集合.ppt_第1页
第1页 / 共27页
《Java SE程序设计及实践》课件07_第7章 泛型与集合.ppt_第2页
第2页 / 共27页
《Java SE程序设计及实践》课件07_第7章 泛型与集合.ppt_第3页
第3页 / 共27页
《Java SE程序设计及实践》课件07_第7章 泛型与集合.ppt_第4页
第4页 / 共27页
《Java SE程序设计及实践》课件07_第7章 泛型与集合.ppt_第5页
第5页 / 共27页
点击查看更多>>
资源描述

1、-1-理解泛型的概念掌握泛型类的创建和使用理解泛型的有界类型和通配符的使用了解泛型的局限性理解Java集合框架的结构掌握Java迭代器接口的使用掌握List、Set、Map等结构集合类的使用掌握foreach语句的使用目标目标-2-泛型概述泛型概述 什么是泛型什么是泛型泛型是JDK5.0的新特性,泛型的本质是参数化类型,即所操作的数据类型被指定为一个参数。这种类型参数可以用在类、接口和方法类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法泛型类、泛型接口、泛型方法。Java语言引入泛型的目的主要是为了类型安全。在JDK5.0之前,没有泛型的情况的下,使用Object类型的变量来代表任意

2、类型的数据,但“任意化”带来的缺点是需要显式的强制类型转换,此种转换要求开发者必须明确知道变量的真实类型。对于强制类型转强制类型转换错误换错误的情况,编译器可能不提示错误,但在运行的时候会出现异常,这是一个安全隐患。-3-泛型概述泛型概述-1 不使用泛型实现参数化类型public class NoGeneric private Object ob;/定义一个通用类型成员public NoGeneric(Object ob)this.ob=ob;public Object getOb()return ob;public void setOb(Object ob)this.ob=ob;public

3、 void showType()System.out.println(实际类型是:+ob.getClass().getName();-4-泛型概述泛型概述-2 再创建一个Integer版本和String版本的NoGeneric对象进行测试,代码如下:public class NoGenericDemo public static void main(String args)/定义类NoGeneric的一个Integer版本NoGeneric intOb=new NoGeneric(new Integer(88);intOb.showType();int i=(Integer)intOb.get

4、Ob();System.out.println(value=+i);/定义类NoGeneric的一个String版本System.out.println(-);NoGeneric strOb=new NoGeneric(Hello Gen!“);strOb.showType();String s=(String)strOb.getOb();System.out.println(value=+s);执行结果如下:实际类型是:java.lang.Integervalue=88-实际类型是:java.lang.Stringvalue=Hello Gen!-5-泛型概述泛型概述-3 使用泛型实现参数化

5、类型首先利用泛型定义泛型类首先利用泛型定义泛型类Generic,代码如下:,代码如下:public class Generic private T ob;/定义泛型成员变量 public Generic(T ob)this.ob=ob;public T getOb()return ob;public void setOb(T ob)this.ob=ob;public void showTyep()System.out.println(实际类型是:+ob.getClass().getName();-6-泛型概述泛型概述-4 再创建一个Integer版本和String版本的Generic对象进行测

6、试,代码如下:public class GenericDemo public static void main(String args)/定义泛型类Genneric的一个Integer版本Generic intOb=new Generic (88);intOb.showTyep();int i=intOb.getOb();System.out.println(value=+i);System.out.println(-);/定义泛型类Genneric的一个String版本Generic strOb=new Generic (Hello Gen!);strOb.showTyep();String

7、 s=strOb.getOb();System.out.println(value=+s);执行结果如下:实际类型是:java.lang.Integervalue=88-实际类型是:java.lang.Stringvalue=Hello Gen!-7-泛型定义泛型定义 泛型语法结构归纳为如下形式:class class-name /实例化泛型类的语法结构如下:class-name obj=new class-name (cons-arg-list)用于指明当前泛型类可接受的类型参数占位符的个数 -8-有界类型有界类型-1 有界类型定义泛型类时,可以向类型参数指定任何类型信息,特别是集合框架操作

8、中,可以最大限度的提高泛型类的适用范围。但有时候需要对类型参数的取值进行一定程度的限制,以使数据具有可操作性。为了处理这种情况,Java提供了有界类型。在指定类型参数时可以使用extends关键字限制此类型参数代表的类必须继承自指定父类或父类本身。-9-有界类型有界类型-2 有界类型实例public class BoundGeneric /定义泛型数组T array;public BoundGeneric(T array)this.array=array;/计算总和public double sum()double sum=0.0;for(T element:array)sum=sum+ele

9、ment.doubleValue();return sum;-10-有界类型有界类型-3 测试BoundGeneric类public class BoundGenericDemo public static void main(String args)Integer intArray=1,2,3,4;/使用整型数组构造泛型对象BoundGeneric iobj=new BoundGeneric(intArray);System.out.println(iobj的和为:+iobj.sum();Double dArray=1.0,2.0,3.0,4.0;/使用Double型数组构造泛型对象Boun

10、dGeneric dobj=new BoundGeneric(dArray);System.out.println(dobj的和为:+dobj.sum();String strArray=str1,str2;/下面语句将报错,String不是Number的子类/BoundGeneric sobj=new BoundGeneric(strArray);前两个输出执行结果如下:iobj的和为:10.0dobj的和为:10.0-11-泛型的局限性泛型的局限性 Java并没有真正实现泛型,是编译器在编译的时候在字节码上做了手脚(称为擦除),是编译器级别的,虚拟机并不知道有没有泛型。这样做的主要原因是为

11、了兼容Java的早期版本。但是这种实现理念造成Java的泛型存在一些问题。为了规避这些问题Java对泛型的使用上做了一些约束,但不可避免的还是有一些问题存在。这其中大多数限制都是由类型擦除引起的。p泛型类型不能被实例化 p不能声明参数化类型的数组 p不能用类型参数替换基本类型 p不能定义带泛型的异常。不允许定义Throwable的泛型子类。p不能在静态变量或者静态方法中引用类中声明的类型参数。-12-集合概述集合概述-1 集合框架Java中对常用的数据结构和算法做了一些规范和实现。所有抽象出来的中对常用的数据结构和算法做了一些规范和实现。所有抽象出来的数据结构和操作统称为数据结构和操作统称为J

12、ava集合框架集合框架(Java Collection Framework,简,简称称JCF)。)。集合框架的引入给编程操作带来了如下的优势:p 集合框架强调了软件的复用。集合框架通过提供有用的数据结构和算法,使集合框架强调了软件的复用。集合框架通过提供有用的数据结构和算法,使开发者能集中注意力于程序的重要部分上开发者能集中注意力于程序的重要部分上p 集合框架通过提供对有用的数据结构(动态数组、链接表、树和散列表等)集合框架通过提供对有用的数据结构(动态数组、链接表、树和散列表等)和算法的高性能、高质量的实现使程序的运行速度和质量得到提高和算法的高性能、高质量的实现使程序的运行速度和质量得到提

13、高p 集合框架必须允许不同类型的数据以相同的方式和高度互操作方式工作集合框架必须允许不同类型的数据以相同的方式和高度互操作方式工作p 集合框架允许扩展或修改集合框架允许扩展或修改p 集合框架集合框架API易学易用易学易用p 集合框架主要由一组用来操作对象的接口组成,不同接口描述一组不同数据集合框架主要由一组用来操作对象的接口组成,不同接口描述一组不同数据类型类型-13-集合概述集合概述-2 Java的集合框架主要由一组用来操作对象的接口组成,不同接口描述一组不同数据类型。抽其核心,主要接口有:Collection、List、Set和Map。简化框架图如下所示:-14-Collection接口

14、Collection接口 Collection接口是构造集合框架的基础,用于表示任何对象的集合。接口是构造集合框架的基础,用于表示任何对象的集合。该接口中声明了所有集合都拥有的核心方法,例如基本的添加、删除该接口中声明了所有集合都拥有的核心方法,例如基本的添加、删除操作等,并且提供了一组操作成批对象的方法,还提供了支持查询操操作等,并且提供了一组操作成批对象的方法,还提供了支持查询操作如判断集合是否为空的方法等。作如判断集合是否为空的方法等。Collection在使用时需要注意以下事项:p 其中几种方法可能会引发一个其中几种方法可能会引发一个UnsupportedOperationExcept

15、ion异常异常p 当企图将一个不兼容的对象加入一个类集中时,将产生当企图将一个不兼容的对象加入一个类集中时,将产生ClassCastException异常异常p Collection并没有并没有get()方法来随机访问第几个元素。只能通过方法来随机访问第几个元素。只能通过iterator()遍遍历元素历元素-15-List接口 List接口List是最常用的一种集合。List接口继承了Collection接口,元素允许重复,以元素添加的次序来放置元素,不会重新排列。该接口不但能够对列表的一部分进行处理,还允许针对位置索引的随机操作。它的具体实现类常用的有ArrayList和LinkedList

16、。List在使用时需要注意以下事项:p 如果集合不可更改,其中几个方法将引发一个如果集合不可更改,其中几个方法将引发一个UnsupportedOperationException异常异常p 当企图将一个不兼容的对象加入一个类集中时,将产生当企图将一个不兼容的对象加入一个类集中时,将产生ClassCastException异异常常p 如果使用无效索引,一些方法将出如果使用无效索引,一些方法将出IndexOutOfBoundsException异常异常-16-Set接口和Map接口 Set接口 Set接口继承Collection接口,Set中的对象元素不能重复,其元素添加后采用自己内部的一个排列机

17、制。Set接口没有引入新方法,可以说Set就是一个Collection,只是行为不同。它的常用具体实现有HashSet和和TreeSet类。类。Map接口 Map接口没有继承Collection接口。Map接口是用于维护键/值对(key/value)的集合,Map容器中的键不允许重复,而值可以是任意对象。Map有两种比较常用的实现:HashMap和和TreeMap。-17-Collections类和Arrays类 Collections和Arrays 集合框架中还有两个很实用的辅助类:Collections和Arrays。pCollections提供了对一个Collection类型的容器进行诸

18、如排序、复制、查找和填充等一些非常有用的方法;pArrays则提供了针对数组进行类似操作的方法。-18-迭代器迭代器 Iterator接口 为了支持对Collection进行一致的遍历操作,Java的集合框架提供了Iterator接口,使用者可以采用一致的方式操作Collection,而不需知道这个Collection的具体实现类型。Iterator接口中的方法能以迭代方式逐个访问集合中各个元素,并安全的从Collection中删除元素。ListIterator接口 ListIterator接口继承接口继承Iterator接口接口,是列表迭代器,用以支持添加或更改底层集合中的元素,允许程序员双

19、向访问、修改列表。ListIterator没有当前位置,光标位于调用previous和next方法返回的值之间,是一个长度为n的列表,有n+1个有效索引值。-19-List ArrayList ArrayList支持可随需要而调整的动态数组支持可随需要而调整的动态数组。其内部封装了一个动态再分配的Object数组。每个ArrayList对象有一个capacity。这个capacity表示存储列表中元素的数组的容量。当元素添加到ArrayList时,它的capacity可根据需要的容量自动增加。在向一个ArrayList对象添加大量元素的程序中,可使用ensureCapacity()方法增加ca

20、pacity,此方法可以减少重分配的次数。LinkedList LinkedList类提供了一个链表数据结构,更适合频繁的数据增删操作。-20-List-1 for-each JDK5.0提供了一种全新的for循环for-each形式,for-each可以遍历实现Iterable接口的任何对象的集合,其操作形式比迭代器更方便有效。for-each遍历实例遍历实例public class ArrayListDemo/.省略代码部分/使用for-each遍历public static void travel2()for(String str:arrayList)System.out.println

21、(str);/.省略代码部分-21-SetHashSet HashSet能快速定位一个元素。该结构使用散列表进行存储。public class HashSetDemo public static void main(String args)HashSet hashSet=new HashSet();/添加元素hashSet.add(first);hashSet.add(second);hashSet.add(third);hashSet.add(forth);System.out.println(hashSet);/遍历for(String str:hashSet)System.out.pri

22、ntln(str);执行结果如下:forth,second,third,firstforthsecondthirdfirst-22-Set-2TreeSet TreeSet是使用树结构来进行存储,并且能够保证元素已排序。存储大量的需要进行快速检索的排序信息的情况下,TreeSet是一个很好的选择。TreeSet实例演示public class TreeSetDemo public static void main(String args)TreeSet treeSet=new TreeSet();/添加元素treeSet.add(first);treeSet.add(second);treeS

23、et.add(third);treeSet.add(forth);System.out.println(treeSet);/遍历for(String str:treeSet)System.out.println(str);执行结果如下:first,forth,second,thirdfirstforthsecondthird-23-Map MapMap是一种把键对象和值对象关联的容器,Map中的键不允许重复。键不允许重复。Map中提供了Map.Entry接口,通过Map的entrySet方法返回一个实现Map.Entry接口的对象集合,使得可以单独操作Map的项(键/值对),在Map中的每一个

24、项,就是一个Map.Entry对象,通过遍历每一个Entry,可以获得每一个条目的键或值并对值进行更改。-24-Map-1 HashMap HashMap类使用散列表实现Map接口。散列映射并不保证它的元素的顺序,元素加入散列映射的顺序并不一定是它们被迭代函数读出的顺序。HashMap允允许使用许使用 null 值和值和 null 键。键。注意注意:LinkedHashMap是HashMap的子类,它保存了记录的插入顺序,由于它遍历的速度和容量无关,只和实际数据有关,所以比HashMap速度慢。TreeMap TreeMap类通过使用树实现Map接口。TreeMap按顺序存储键/值对,同时允许

25、快速检索。应该注意的是,不像散列映射,TreeMap保证它的元素按照键升序排序。-25-区别与联系区别与联系下面从元素是否有序,是否可重复来进行区别,以便记忆和正确选用集合类。集合集合是否有序是否有序是否可重复是否可重复Collection否否是是List是是是是SetAbstractSet否否否否HashSetTreeSet是是MapAbstractMap否否使用使用key-value来映射和存来映射和存储数据,储数据,Key必须惟一,必须惟一,value可以重复可以重复HashMapLinkedHashMap是是TreeMap是是-26-泛型的类型参数只能是类类型(包括自定义类)不能是基本数据类型利用泛型可以定义泛型类、泛型方法、泛型接口同一种泛型可以对应多个版本(因为类型参数是不确定的),不同版本的泛型类实例是不兼容的泛型的类型参数可以使用extends语句,习惯上称为“有界类型”泛型的类型参数还可以是通配符类型Java集合是基于算法设计的高性能类集Java集合主要接口有:Collection、List、Set和Map迭代器接口用于遍历集合内部元素,具体有Iterator和ListIterator接口JDK5.0提供了for-each语句,以方便集合遍历3小结小结谢 谢 Thanks for listening.

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 大学
版权提示 | 免责声明

1,本文(《Java SE程序设计及实践》课件07_第7章 泛型与集合.ppt)为本站会员(momomo)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|