第八章对象的集合.ppt

上传人:本田雅阁 文档编号:2583460 上传时间:2019-04-12 格式:PPT 页数:39 大小:256.51KB
返回 下载 相关 举报
第八章对象的集合.ppt_第1页
第1页 / 共39页
第八章对象的集合.ppt_第2页
第2页 / 共39页
第八章对象的集合.ppt_第3页
第3页 / 共39页
亲,该文档总共39页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第八章对象的集合.ppt》由会员分享,可在线阅读,更多相关《第八章对象的集合.ppt(39页珍藏版)》请在三一文库上搜索。

1、1,第八章 对象的集合,2,主要内容,1、对象数组 2、集合 3、list接口 4、Set, SortedSet接口 5、Map, SortedMap接口 6、迭代器(Iterator) 参考李发致教材第七章,郑莉教材第七章,ThinkInJava第11章,3,1、对象数组,数组:在Java提供的存储及随机访问对象序列的各种方法中,数组是效率最高的一种,但数组的大小是固定的,只能用来表达一组同类型数据,在生存期内大小不可变。 对象数组 数组元素是类的对象 所有元素具有相同的类型 每个元素都是一个对象的引用,4,1.1 对象数组的初始化,静态初始化:在声明和定义数组的同时对数组元素进行初始化,例

2、如: BankAccount accounts = new BankAccount(“Zhang“, 100.00), new BankAccount(“Li“, 2380.00), new BankAccount(“Wang“, 500.00), new BankAccount(“Liu“, 175.56), new BankAccount(“Ma“, 924.02);,5,动态初始化:使用运算符new,需要经过两步: 首先给数组分配空间 type arrayName =new typearraySize; 然后给每一个数组元素分配空间 arrayName0=new type(paramLi

3、st); arrayNamearraySize-1=new type(paramList);,6,1.2 数组的操作 java.util.Arrays,在java.util包中的Arrays类提供了一些操作数组的方法 int binarySearch(type a, type key) 对数组进行二分法查找 如果key存在,则返回它在数组a中的位置 如果不存在,则返回它的“-(插入位置-1)” void fill(type a, type val) 给数组全部或某段数据填充成一个特殊的值,7,boolean equals(type a, type a2) 两个数组大小相同,并且每一个元素相等

4、两个null数组是相等的 void sort(type a) void sort(type a, int fromIndx, int toIndex) void sort(type a, Comparator c) void sort(type a, int fromIndx, int toIndex, Comparator c) 详细用法参看Java API,8,2、 集合 (Collection),Java中的数组只能保存固定数目的元素,且必须把所有需要的内存单元一次性的申请出来,而不能先创建数组再追加数组元素数量。 所以在对象数量不明确的情况下,类型多样化的情况下,需要更复杂的方法来管理

5、对象。,9,2.1 Java集合框架(Collections Framework),集合 计算机科学中有20多个标准的数据结构,如链表,二叉树,栈和hash表等。 Java直接以类库的形式提供了其中的许多数据结构,这些数据结构可以存储对象的集合,并管理对象。 数据结构和类库通称为Java的集合框架(Java Collections Framework)。,10,集合框架提供了一个通用的接口java.util.Collection,其中给出了插入,删除等操作一系列方法声明。 Java集合框架中有6种基本的数据结构。,11,List 按照一定次序排列的对象集,对象之间有次序关系,可以包含重复的对象

6、。 Set 无次序的对象集,但这些对象都是唯一的,不重复。 SortedSet 按照升序排列元素的对象集。 Queue JDK1.5引入的新特性,以储存处理之前需要暂存的数据元素,以先进先出(First In First out, FIFO)的方式处理。为线程编程提供帮助。 以上四种均实现了Collection接口。,2.1.1集合框架中的6种基本数据结构,12,Map map没有实现Collection接口,用于存储一群成对的对象,这些对象各自保持着“键-值”(key-value)对应关系。即一个是键(如人名),另一个是与键对应的值(如电话号码)。 SortedMap 按键的升序排列的map

7、。 程序员首先应该从list, set, queue, map中做出选择,然后再根据性能和其他必要的特性,选用其中的具体类。,13,结构示意图,a,d,b,a,c,列表list, n,a,b,c,d,e,集合set,a,c,b,d,v23,v16,v9,v10,映射map,14,2.1.2 集合框架层次 collection接口,类层次如图,主要包括5个接口、5个抽象类及6个具体类,Collection,AbstractCollection,Vector,ArrayList,Stack,List,Set,SortedSet,AbstractSet,AbstractList,AbstractSe

8、quentialList,HashSet,TreeSet,LinkedList,Queue,AbstractQueue,15,2.1.2 集合框架层次 map,16,Collection接口声明了十几个抽象方法,用于增加,删除或查询数据结构。 查询方法 int size() 返回集合对象中包含的元素个数 boolean isEmpty() 判断集合对象中是否还包含元素,如果没有任何元素,则返回true boolean contains(Object obj) 判断对象是否在集合中 boolean containsAll(Collection c) 判断方法的接收者对象是否包含集合中的所有元素,

9、2.1.3 Collection接口基本方法,17,修改方法包括 boolean add(Object obj) 向集合中增加对象 boolean addAll(Collection c) 将参数集合中的所有元素增加到接收者集合中 boolean remove(Object obj) 从集合中删除对象 boolean removeAll(Collection c) -将参数集合中的所有元素从接收者集合中删除 boolean retainAll(Collection c) 在接收者集合中保留参数集合中的所有元素,其它元素都删除 void clear() 删除集合中的所有元素,18,3.1 Lis

10、t接口:编程中较为常用的集合 可包含重复元素 元素是有顺序的,每个元素都有一个index值(从0开始)标明元素在列表中的位置 实现它的四个主要类是 Vector(legacy):Java1.0/1.1遗留下来的类,在Java1.0/1.1中唯一可以自我扩展的序列。如今基本上可以看作ArrayList 栈Stack(legacy):也是Java1.0/1.1遗留下来的类,仅在一端进行插入或删除操作的线性表,以先进后出(First In last Out)的方式进行,3. List接口,19,ArrayList:由数组实现的一种list,因此它的随机访问速度极快,但是向list中插入与删除元素的速

11、度很慢。 LinkedList:由双向链表实现的一种list,适合于在list中间需要频繁进行插入和删除操作,但随机访问则相对较慢。 提供了addFirst(), addLast(), getLast(), removeFirst()和removeLast()等方法,可用于实现栈和队列的操作。,20,3.2 List接口常用方法,List接口在实现Collection接口的基础上又增加了大约10个基本的数据访问方法: Object get(int index); Object set(int index, E element); Object add(int index, E element)

12、; Object addAll(int index, Collection); Object remove(int index); int indexOf(Object o); int lastIndex(Object o); ListIterator listIterator(); ListIterator listIterator(int index); List subList(int from, int to);,21,3.3 ArrayList的使用,3.3.1 创建一个ArrayList ArrayList的常用方法同样适用于Vector,构造方法与Vector也类似 ArrayL

13、ist myList = new ArrayList(); /初始化容量为10 ArrayList myList = new ArrayList(int cap); /初始化容量为cap ArrayList myList = new ArrayList(Collection col); /以参数col中的元素进行初始化,22,3.3.2 添加对象到ArrayList中,void add(Object obj) 添加一个对象,如 ArrayList teamList = new ArrayList(); teamList.add(“Zhang Wei“); teamList.add(“Li Ho

14、ng“); boolean addAll(Collection col) 添加整个集合,如果接收者对象的结果有变化,则返回true,如 ArrayList teamList = new ArrayList(); teamList.add(“Zhang Wei“); teamList.add(“Li Hong“); ArrayList yourList = new ArrayList(); yourList.addAll(teamList);,23,JDK 1.4.2和更早版本的集合都有一个共同的缺点:一旦将某个对象添加到其中,该对象便失去了其原有的类型信息,集合中所容纳的元素其实只是一些指向O

15、bject对象的引用。也就是集合只保存没有类型特征的对象。,集合对其所容纳的对象类型没有任何限制,可以将任意类型的对象添加到同一集合中。 从集合中取出对象时必须将其强制转换成正确的类型。,24,25,3.4 泛型(Generics)集合,这样一来,从集合里取出对象需要强制类型转换,否则不安全,运行时出现错误。 JDK1.5后编译器采用Generics来保证类型安全,在编译时自动检测出类型不匹配,显示编译警告。,JDK 1.5引入了泛型(Generics): 从泛型集合中取出元素时不再需要进行强制类型转换。 编译器会保证添加到集合中的元素一定是参数化类型(parameterized type)指

16、定的类型。这和C+的Template class(类模板)具有同样的功能。,26,27,在类,接口,方法的定义时用无需指名元素具体类型,用一个通用名称(如type, E)代替;而在具体应用时再把元素赋予真正的类型名称。 例:StackList.java,GenericClass.java 所以JDK1.5要求创建一个集合时给出元素类型通用名称,或者直接指明元素具体类型名称,否则编译时将显示警告。,28,类型通用名称,按照惯例,类型通用名称命名为一个大写字母,常用的名称如下: E Element (广泛用于Java Collection Framework) K Key,键 N Number ,

17、 数 T Type, 类型 V Value, 值 S, U, V等 第二,三,四个类型 Java DocAPI中常出现这些名称的使用。,29,使用范型的Collections 例子,public class MyGenericCollection public static void main(String args) List myList=new ArrayList(); / myList.add(“A string“); /This no longer compiles myList.add(new Integer(1); myList.add(new Integer(2); Integ

18、er x; for(int i=0;imyList.size();i+) x=myList.get(i); System.out.println (x); ,30,可见上述例子使用通配符指明了具体类型: ArrayList list = new ArrayList(); 这样就无法编译通过,容易检测出错误。 例:MyGenericCollection.java,31,继承关系下添加父类与子类对象到集合中,指定父类类型为存储类型,取出对象时无需强制类型转换。 例:person1,32,3.5 LinkedList的使用,LinkedList和ArrayList都实现了List接口,无论使用哪一个

19、,程序都产生相同的结果,但LinkedList适合于在list中间需要频繁进行插入和删除操作。 LinkedList可以用于实现栈和队列。 栈的实现: 例MyStack.java,33,Set接口 适用于不允许出现重复的元素 实现它的两个主要类是 哈希集合(HashSet):用于快速检索 树集合(TreeSet):采用自动升序方式存储元素,4、Set、SortedSet接口,34,SortedSet接口:一种特殊的Set 其中的元素是升序排列的,还增加了与次序相关的操作 通常用于存放词汇表这样的内容,35,Map接口: 不是Collection接口的继承 用于维护键/值对(key/value

20、pairs) 描述了从不重复的键到值的映射,是一个从关键字到值的映射对象 其中不能有重复的关键字,每个关键字最多能够映射到一个值,5、Map、SortedMap接口,36,SortedMap接口 一种特殊的Map,其中的关键字是升序排列的 与SortedSet对等的Map,通常用于词典和电话目录等,37,6、迭代器Iterator,Iterator接口(1.2版,替代Enumeration) 是一个对象,用于遍历并选择序列中的对象,是对Enumeration接口的改进 具有如下三个实例方法, hasNext() 判断是否还有元素 next() 取得下一个元素 remove() 将Iterato

21、r新近返回的(如next()返回的)元素删除,38,List还设计有更强大的ListIterator。 利用Iterator访问每个元素。 List cats = new ArrayList(); Iterator e = cats.iterator(); while(e.hasNext() System.out.println(“Cats has ”+e.next(); 例:CatsAndDogs2.java 删除集合中某些元素 例: IteratorTest.java,39,JDK1.5后,Iterator的应用逐渐淡出,利用新的foreach语句,只需给出元素类型,循环变量及集合即可,可以简洁写出下列代码。 for(Double d : c) System.out.println(“C has ” + d); d为循环变量,c为集合。 例:ForEachCollection.java,Foreach语言遍历整个集合,

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1