java泛型与集合中文版,第8章java泛型与集合类.doc

41528d3028836879cd698677c3999917.gif第8章java泛型与集合类.doc

第 8章 Java泛型与集合类 核心内容: 1. 集合的作用与概念 2. 泛型的作用与用法。 3. Set、List、Map 的用法 4. Iterator、Enumeration 的用法 8.1 早期的集合类 集合可理解为一个容器,该容器主要指映射(map) 、集合(set) 、列表(list) 、散列 表(hashtable)等抽象数据结构。容器可以包含有多个元素,这些元素通常是一些 Java 对 象。针对上述抽象数据结构所定义的一些标准编程接口称之为集合框架。集合框架主要是 由一组精心设计的接口、类和隐含在其中的算法所组成,通过它们可以采用集合的方式完 成 Java 对象的存储、获取、操作以及转换等功能。集合框架的设计是严格按照面向对象的 思想进行设计的,它对上述所提及的抽象数据结构和算法进行了封装。封装的好处是提供 一个易用的、标准的编程接口,使得在实际编程中不需要再定义类似的数据结构,直接引 用集合框架中的接口即可,提高了编程的效率和质量。此外还可以在集合框架的基础上完 成如堆栈、队列和多线程安全访问等操作。 在集合框架中有几个基本的集合接口,分别是 Collection 接口、List 接口、Set 接口和 Map 接口,它们所构成的层次关系如图 8-1 所示。 Collection 接口 Set 接口 List 接口 Map 接口图 8-1 集合框架层次关系图 (1) Collection 接口是一组允许重复的对象。 (2) Set 接口继承 Collection,但不允许集合中出现重复元素。 (3) List 接口继承 Collection,允许集合中有重复,并引入位置索引。 (4) Map 接口与 Collection 接口无任何关系,Map 的典型应用是访问按关键字存储的 值,所包含的是键—值对,而不是单个独立的元素。 作为对上述接口的实现,Java 语言目前主要提供下述类的定义,如表 8-1 所示表 8-1 集合接口及其类的实现 接口 集合类的实现 历史集合类 HashSet Set TreeSet ArrayList Vector List LinkedList Stack HashMap Hashtable Map TreeMap 由于在 JDK1.5 当中增加了泛型,我们把 JDK1.5 之前不支持泛型的集合类称之为早期 集合类。早期的集合有个缺点:当我们把一个对象存放到集合里后,集合就会“忘记”这 个对象的数据类型,当再次取出该对象时,该对象的编译类型就变成了 Object 类型。早期 的集合之所以被设计成这样,是因为设计集合的程序员不知道我们需要用它来保存什么类 型的对象。所以他们把集合设计成能保存任何类型的对象。但这样做也带来了两个问题: 一、集合对元素类型没有任何限制,例如只想创建一个保存 String 类型的集合,但是程序 也允许把 boolean 类型的对象存放在该集合当中,这样容易引发异常。二、由于把对象保 存在集合当中时,集合忘记了对象的数据类型,只知道它存放的是 Object 类型,因此取出 集合元素后通常要进行强制类型转换。这种强制类型转换既会增加程序的复杂度,也可能 引发 ClassCastException。 【例8-1】 Test.java 早期集合类 1 import java.util.ArrayList; 2 import java.util.Iterator; 3 import java.util.List; 4 public class Test { 5 public static void main(String[] args) { 6 List list=new ArrayList(); 7 list.add(“beijing“); 8 list.add(“wuhan“); 9 list.add(“shanghai“); 10 //list.add(4); 11 for(int i=0;ijava Testbeijingwuhanshanghai 程序说明:上述程序的第 6行是创建一个 List 集合对象,第 7、8、9 行是向该集合当中添了一个 3个 String 类型的对象元素,第 11、12、13、14行是通过 for循环将集合当中的元素取出, 转换为 String 类型并输出。 上述程序只是创建了一个 List 对象,而且只用 List 对象来保存字符串对象。但是对于 保存在 List 对象当中的数据类型我们不能做任何的限制。如果在程序的第 10行,我们不 小心把一个 int 类型的数据保存到 List 当中,就将导致程序在第 12行出现 ClassCastException 异常。自 JDK1.5 以后,Java 引入了泛型的概念,允许我们在创建集合 时指定集合元素的类型。这样添加数据元素到集合中时会做类型检查。如果要添加的数据 元素与指定的数据类型不匹配,编译时会报错。 8.2 泛型 在面向对象编程语言中,多态算是一种泛化机制。例如,你可以将方法的参数类型设 为基类,那么该方法就可以接受从这个基类中导出的任何类作为参数。这样的方法更加通 用一些,可应用的地方也多一些。但有时候,拘泥于类的单继承体系,也会使程序受限太 多。如果方法的参数是一个接口,而不是一个类,这种限制就放松了许多。因为任何实现 了该接口的类都能够满足该方法。可是有时候,即便使用了接口,对程序的约束也还是太 强了。因为一旦指明了接口,就要求你的代码必须使用特定的接口。而我们希望达到的目 的是编写更通用的代码,要使代码能够应用于“某种不具体的类型” ,而不是一个具体的接 口或类。在 Java SE 5中增加了泛型机制。 “泛型”这个术语的意思是:“适用于许多的类 型” 。泛型实现了参数化类型的概念,使代码可以应用于多种类型。 8.2.1 泛型类一个泛型类就是具有一个或多个类型变量的类。本节使用一个简单的 Pair 类作为例子。 public class Pair{private T first; private T second; public Pair(){first=null; second=null;} public Pair(T first,T second){this.first=first; this.second=second;} public T getFirst(){return first;} public T getSecond(){return second;} public void setFirst(T newValue){first=newValue;} public void setSecond(T newValue){second=newValue;} } Pair 类引入了一个类型变量 T,用尖括号括起来,并放在类名的后面。泛型类可以有多 个类型变量。例如,可以定义 Pair 类,其中第一个成员变量和第二个成员变量使用不同的 类型:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值