JAVA-泛型与集合框架.ppt_第1页
JAVA-泛型与集合框架.ppt_第2页
JAVA-泛型与集合框架.ppt_第3页
JAVA-泛型与集合框架.ppt_第4页
JAVA-泛型与集合框架.ppt_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

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

文档简介

1、2010-1-10,1,Java面向对象程序设计第13章,配合例子源代码一起使用,Power point 制作:耿祥义 张跃平,泛型与集合框架,2010-1-10,2,主要内容 泛型 链表 堆栈 散列映射 树集 树映射 难点 树映射,导读,2010-1-10,3,在jdk1.2之后,Java提供了实现常见数据结构的类,这些实现数据结构的类通称为Java集合框架。在JDK1.5后,Java集合框架开始支持泛型,本章首先介绍泛型,然后讲解常见数据结构类的用法。,概述,2010-1-10,4,13.1 泛型,泛型(Generics)是在JDK1.5中推出的,其主要目的是可以建立具有类型安全的集合框架

2、,如链表、散列映射等数据结构。,2010-1-10,5,13.1.1 泛型类声明,可以使用“class 名称”声明一个类,为了和普通的类有所区别,这样声明的类称作泛型类,如: class People 参考:Cone.java,2010-1-10,6,13.1.2 使用泛型类声明对象,泛型类声明和创建对象时,类名后多了一对“”,而且必须要用具体的类型替换“”中的泛型。例如: Cone coneOne; coneOne =new Cone(new Circle(); 例题13-1,2010-1-10,7,13.1.3 泛型接口,可以使用“interface 名称”声明一个接口,这样声名的接口称作

3、泛型接口如 interface Computer 例题13-2,2010-1-10,8,8.1 Java中的集合类结构,Java提供了集合类(Collection)及其API,于是用户可以通过统一的操作接口,使得从一种数据结构到另一种数据结构的转换极为方便,简化了程序员编程时的负担。 任何集合框架包括三部分内容: 对外的接口 接口的实现 对集合运算的算法 集合API的根是一个集合接口,存放于java.util包中。Collection接口定义了所有属于集合的类都应该具有的通用方法。,2010-1-10,9,8.1 Java中的集合类结构,Java集合框架结构由两颗接口树构成: 第一棵树根节点为

4、Collection接口,它定义了所有集合的基本操作,如添加、删除、遍历等。 它的子接口Set、List等则提供了更加特殊的功能。,2010-1-10,10,Collection接口,2010-1-10,11,第二棵树根节点为Map接口。与哈希表类似,保持的是键值对的集合,可以通过键来实现对值元素的快速访问。,2010-1-10,12,Map接口,第二棵树根节点为Map接口。与哈希表类似,保持的是键值对的集合,可以通过键来实现对值元素的快速访问。,2010-1-10,13,2010-1-10,14,8.2 Collection接口,2010-1-10,15,13.2 List接口,List接口

5、是包含有序元素的一种Collection子接口,其中的元素必须按序存放。元素之间的顺序关系可以由插入的时间先后决定,也可以由元素值的大小决定。 List接口使用类似于数组下标的索引的概念表示元素在List 中的位置。用户能够使用索引来访问List 中的元素。索引从0开始。为了保持元素的有序的特性,List接口新增加了大量的方法,使之能够在序列中间根据具体位置添加和删除元素。,2010-1-10,16,13.2 链表,链表是由若干个称作节点的对象组成的一种数据结构,每个节点含有一个数据和下一个节点的引用 。,2010-1-10,17,List接口的主要方法,2010-1-10,18,13.2.1

6、 LinkedList 类,LinkedList类提供了使用双向链表实现数据存储的方法,可按序号检索数据,并能够进行向前或向后遍历。 由于插入数据时只需要记录元素的前后项即可,所以插入数度较快,因此适合于在链表中间需要频繁进行插入和删除的操作。,2010-1-10,19,13.2.1 LinkedList泛型类, LinkedList泛型类创建的对象以链表结构存储数据,习惯上称LinkedList类创建的对象为链表对象。例如, LinkedList mylist=new LinkedList(); 创建一个空双链表。 add(E obj) 向链表依次增加节点,2010-1-10,20,Link

7、edlist接口的主要方法,2010-1-10,21,ArrayList类是List接口的一个可变长数组的实现,即一个ArrayList类对象可以动态改变大小。每个ArrayList类对象都有一个容量(Capacity),用于存储元素的数组的大小。容量可随着不断添加新元素而自动增加。 序列以初始长度创建,当长度超过时,集合自动变大;当删除对象时,集合自动变小。集合中允许存储null值。ArrayList类的随机访问速度快,但是向表中插入和删除比较慢。 当需要插入大量元素时,在插入前可以调用ensureCapacity 方法来增加ArrayList 的容量以提高插入效率。,8.4.2 Array

8、List 类,2010-1-10,22,ArrayList常用的构造函数如下: ArrayList ():构建一个空的ArrayList对象。 ArrayList (Collection c):构建一个ArrayList对象,并且将集合c中所有元素添加进去。 ArrayList (int initialCapacity):构建一个拥有特定容量的空ArrayList对象。 ArrayList的很多成员方法与LinkedList相似,两者的本质区别是一个使用顺序结构,另一个使用链表结构,因此,它也可以使用LinkedList类提供的方法进行列表的操作。,8.4.2 ArrayList 类,2010

9、-1-10,23,2010-1-10,24,8.5 Iterator接口,除了使用集合对象的get()方法可以实现对集合中的元素的遍历外。利用迭代器(Iterator)也可以实现元素遍历。 迭代器是一个实现了Iterator接口或者ListIterator接口的对象。ListIterator继承了Iterator,可以进行双向遍历以及元素的修改。,2010-1-10,25,2010-1-10,26,Iterator迭代器只能前向循环,如果需要双向遍历,则可以使用更高级的ListIterator迭代器,ListIterator接口继承自Iterator接口。 ListIterator迭代器除了有

10、next()方法外,还新增了hasprevious()方法和previous()方法,实现前向遍历。ListIterator还可以定位当前的索引位置,调用nextIndex()和previousIndex()就可以实现。,2010-1-10,27,2010-1-10,28,2010-1-10,29,13.3 Stack类,在Java语言中,Stack类是java.util包中专门用来实现栈的工具类。 Stack类继承自Vector类,因此它是Vector的一个子类,实现了一个后进先出的堆栈。 Stack类继承了Vector类的所有方法,还新增了一些方法使得Vector类能够实现堆栈的操作。,2

11、010-1-10,30,1、创建Stack类对象 public Stack();它建立一个空的堆栈 2、压栈与出栈操作 public Object push(Object item):将指定的对象压入栈 public Object pop():将栈顶的对象从栈中取出 3、检查栈是否为空 public boolean empty():测试堆栈是否为空,若堆栈中没有对象元素,则返回true,否则返回false 4、查看栈顶端的数据,但不删除该数据。 public object peek() 5、获取数据在堆栈中的位置。最顶端的位置是1,向下依次增加。如果堆栈不含有此数据,则返回-1。 public

12、 search(Object data) 例:13.6,2010-1-10,31,13.4 Map及HashMap接口,2010-1-10,32,Map接口的主要方法,2010-1-10,33,Map接口的一个抽象类是AbstractMap。在这个抽象类中,部分地实现了Map接口中的成员方法,使得具体的映射类不必实现Map接口中的每个成员方法。 AstractMap抽象类有三个子类:TreeMap HashMap WeakHashMap:,AstractMap抽象类,2010-1-10,34,(1) TreeMap描述了一个按键值升序排列的映射,它有一些扩展的方法,如firstKey(),la

13、stKey()等,还可以从TreeMap中指定一个范围以取得其子Map。 (2) HashMap描述的一个映射中允许存储空对象,由于键必须唯一,所以只能有一个空键值。 (3)WeakHashMap是一种改进的HashMap,它描述了一个映射,当集合中的某些内容不再使用时需清除掉无用的数据,并使用垃圾回收机制进行回收。,AstractMap抽象类,2010-1-10,35,HashMap通过哈希运算可以快速查找一个键,因此在适合于在Map中插入、删除和定位元素。如果要按照自然顺序或者自定义顺序遍历关键字,TreeMap会更好些。,2HashMap,2010-1-10,36,由于HashMap实现

14、了Map接口,因此它没有自己的新方法。HashMap的构造方法如下: HashMap():创建一个空的HashMap集合。 HashMap(Map t):创建一个哈希集,将t中所有元素添加进去。 HashMap(int initialCapacity):创建一个拥有特定容量的空HashMap集合。 HashMap(int initialCapacity,float loadFactor):创建一个拥有特定容量和加载因子的空HashMap。,2010-1-10,37,散列表中的容量 是指能够存储对象的数量。 当对象存储的数目到达容量乘以加载因子的值时,容量将会自动地增加到原容量的2倍加1,加1的

15、目的是确保散列表的容量为质数或奇数。 例如: aMap对象最初的容量为151,当存储对象的数量达到91时,容量将会自动增加到303。,2010-1-10,38,13.4 散列映射 13.4.1 HashMap泛型类,HashMap对象采用散列表这种数据结构存储数据,习惯上称HashMap对象为散列映射。 例如 HashMap hashtable= HashSet(); hashtable可以存储“键/值”对数据。 相关方法: public V put(K key,V value)将键/值对数据存放到散列映射中,该方法同时返回键所对应的值。,2010-1-10,39,loadFactor是0.0

16、1.0之间的一个数,通常默认为0.75。加载因子定义了哈希集合充满什么程度时就要增加容量。即当元素的数目大于哈希集容量和加载因子之积时,哈希集容量将扩展。,2010-1-10,40,HashMap类的主要成员方法,2010-1-10,41,13.4.2 常用方法,public void clear() 清空散列映射。 public Object clone() 返回当前散列映射的一个克隆。 public boolean containsKey(Object key) 如果散列映射有“键/值”对使用了参数指定的键,方法返回true,否则返回false。 public boolean contai

17、nsValue(Object value) 如果散列映射有“键/值”对的值是参数指定的值。 public V get(Object key) 返回散列映射中使用key做键的“键/值”对中的值。 public boolean isEmpty() 如果散列映射不含任何“键/值”对,方法返回true,否则返回false。 public V remove(Object key) 删除散列映射中键为参数指定的“键/值”对,并返回键对应的值。 public int size() 返回散列映射的大小,即散列映射中“键/值”对的数目。,2010-1-10,42,13.6 树映射,TreeMap类实现了Map接

18、口,称TreeMap对象为树映射。 树映射使用public V put(K key,V value);方法添加节点。 例题13-9,2010-1-10,43,13.4.3 遍历散列映射,public Collection values()方法返回一个实现Collection接口类创建的对象。 使用接口回调技术,即将该对象的引用赋给Collection接口变量,该接口变量可以回调iterator()方法获取一个Iterator对象,这个Iterator对象存放着散列映 射中所有“键/值”对中的“值”。,2010-1-10,44,13.5 Set接口,Set接口是一种不包含重复元素的Collect

19、ion的子接口。 Set接口中并没有引入新方法,它提供的基本方法和Collection接口类似。,2010-1-10,45,2010-1-10,46,Set接口派生了一个SortedSet接口和一个抽象类AbstractSet。SortedSet接口用来描述有序的元素集合,TreeSet实现了这个接口,它将放入其中的元素按序存放,要求其中的对象是可排序的。 抽象类AbstractSet实现了部分Collection接口,并有一个子类HashSet,它以散列方式表示集合内容。,2010-1-10,47,13.5 树集 13.5.1 TreeSet泛型类,TreeSet类创建的对象称作树集。 例如

20、 TreeSet mytree=new TreeSe(); 然后使用add方法为树集添加节点,例如 mytree.add(boy);,2010-1-10,48,13.5.2 节点的大小关系,树集用add方法添加节点,节点会按其存放的数据的“大小”顺序一层一层地依次排列,在同一层中的节点从左到右按“大小”顺序递增排列,下一层的都比上一层的小。,2010-1-10,49,13.5.3 TreeSet类的常用方法,public boolean add(E o) 向树集添加加节点。 public void clear() 删除树集中的所有节点。 public void contains(Object

21、o) 如果树集中有包含参数指定的对象,该方法返回true,否则返回false 。 public E first() 返回树集中的第一个节点中的数据(最小的节点)。 public E last() 返回最后一个节点中的数据(最大的节点)。 public isEmpty() 判断是否是空树集,如果树集不含任何节点,该方法返回true 。 public boolean remove(Object o) 删除树集中的存储参数指定的对象的最小节点。 public int size() 返回树集中节点的数目。 例题13-8,2010-1-10,50,HashSet类,HashSet类是实现了Set接口的标

22、准类,它创建了一个使用哈希表存储的集合,能快速定位一个元素,从而可以优化查询的速度,特别是在查找大集合时HashSet类比较有用。 HashSet的构造函数如下: HashSet():创建一个空的哈希集。 HashSet(Collection c):创建一个哈希集,并且将集合c中所有元素添加进去。 HashSet(int initialCapacity):创建一个拥有特定容量的空哈希集。 HashSet(int initialCapacity,float loadFactor):创建一个拥有特定容量和加载因子的空哈希集。,2010-1-10,51,泛型是JDK 1.5以上版本的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口和泛型方法。 在JDK 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”。“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编

温馨提示

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

评论

0/150

提交评论