第7章__容器和泛型

上传人:l**** 文档编号:139252685 上传时间:2020-07-20 格式:PPT 页数:25 大小:844.50KB
返回 下载 相关 举报
第7章__容器和泛型_第1页
第1页 / 共25页
第7章__容器和泛型_第2页
第2页 / 共25页
第7章__容器和泛型_第3页
第3页 / 共25页
第7章__容器和泛型_第4页
第4页 / 共25页
第7章__容器和泛型_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《第7章__容器和泛型》由会员分享,可在线阅读,更多相关《第7章__容器和泛型(25页珍藏版)》请在金锄头文库上搜索。

1、第7章 容器和泛型,7.1 Collection与lterator,7.2 实用类Collections,7.3 Set(集),7.4 List(列表),7.5 Map(映射),7.6 泛型,7.7 通配符与受限通配符,7.8 综合实例,第7章 容器和泛型,Java实用类库提供了一套相当完整的容器类来解决这个问题,其中基本的类型是List、Set、Queue和Map,这些对象类型也称为集合类。容器提供了完善的方法来保存对象。Java的容器类库位于java.util包中,Java容器类库中的接口及类之间的关系如图7.1所示,图中实线表示继承,虚线表示接口实现。而泛型的引入最主要原因就是安全地使用

2、容器类。,图7.1 容器类,7.1 Collection与Iterator,Collection 是容器类的根接口,List、Set、Queue是它的直接子接口。Collection 表示一组对象,这些对象也称为 Collection 的元素。List类型的容器允许加入重复对象,按照索引位置排序并且按照在容器中的索引位置检索对象。Set类型的容器不允许加入重复对象,也不按照某种方式排序对象。Map接口没有继承Collection接口。Map类型的容器中的每一个元素包含一对键对象和值对象,容器中的键对象不可重复,值对象可以重复。表7.1列出了Collection接口的常用方法。 Iterator

3、接口中声明了如下方法。 boolean hasNext():判断容器中的元素是否遍历完毕,没有则返回true。 next():返回迭代的下一个元素。 void remove():从迭代器指向的Collection中移除迭代器返回的最后一个元素。必须先调用一次next()方法之后,才能调用一次remove(),即remove()不能连续多次调用。 【例7.1】 向容器中添加一组元素,用iterator()方法遍历容器中的元素。,7.1 Collection与Iterator,程序运行结果:,7.2 实用类Collections,List代表长度可变的线性表,Collections的以下方法适用于

4、List类型。 copy(List dest, List src):将所有元素从一个列表复制到另一个列表。 fill(List list, T obj):使用指定元素替换指定列表中的所有元素。 nCopies(int n, T o):返回由指定对象的n个副本组成的不可修改的列表。 shuffle(List list):使用默认随机源对指定列表进行置换。 sort(List list):根据元素的自然顺序对指定列表按升序进行排序。 【例7.2】 使用Collections的min()、max()、binarySearch()等常用方法。 程序运行结果:,7.3 Set(集),7.3.1 Hash

5、Set HashSet类按照哈希算法来存取容器中的对象,具有很好的存取和查找性能。当向容器中加入一个对象时,HashSet会调用对象的hashCode()方法来获取哈希码,然后根据这个哈希码进一步计算出对象在容器中的存放位置。 在Object类中定义hashCode()和equals()方法,Object类的equals()方法按照对象的内存地址比较对象是否相等,因此如果object1.equals(object2)为true,则表明object1变量和object2变量实际上引用同一个对象,那么object1和object2的哈希码也肯定相同。 为了保证HashSet能正常工作,要求当两个对

6、象用equals()方法比较的结果为true时,它们的哈希码也相等。例如,如果object1.equals(object2)为true,那么以下表达式的结果也应为true。 object1.hashCode() = object2.hashCode();,7.3.1 HashSet,【例7.3】 测试不同时重载Object类的equals()和hashCode()方法。 程序运行结果: 在程序HashSetTest.java中加入两个相同的对象到Set中,由于并没有覆盖Object类hashCode()方法,创建的两个Person对象的哈希码不一样,因此HashSet为两个Person对象计算

7、不同的存放位置,于是把它们存放在容器的不同地方。可见,为了保证HashSet正常工作,如果Student类覆盖了equals()方法,也应该覆盖hashCode()方法,并且保证两个相等的Person对象的哈希码也一样。因此取消程序的注释,重新运行HashSetTest.java程序。 程序运行结果:,7.3.2 TreeSet,TreeSet类实现了SortedSet接口,能够对容器中的对象进行排序。当向TreeSet中加入一个对象后,会继续保持对象间的排序的次序。例如下面的代码片段: Set set = new TreeSet(); set.add(new String(spring);

8、set.add(new String(summer); set.add(new String(autumn); set.add(new String(winter); System.out.println(set); 运行结果: autumn, spring, summer, winter TreeSet支持两种排序方式:自然排序和指定排序。在默认的情况下,TreeSet采用自然排序方式。,7.3.2 TreeSet,1自然排序 在JDK类库中,有一部分类实现了java.lang.Comparable接口,如Integer、 Double 和String等。Comparable接口有一个com

9、pareTo(Object o)方法,它返回整数类型。 pareTo(y):如果返回值为0,则表示x和y相等;如果返回值大于0,则表示x大于y;如果返回值小于0,则表示x小于y。 TreeSet调用对象的compareTo()方法比较容器中对象的大小,然后进行升序排列。表7.2列出了JDK类库中实现了Comparable接口的一些类的排序及其排序方式。,表7.2 类的排序,7.3.2 TreeSet,使用自然排序时,只能向TreeSet容器中加入同类型的对象,如下所示。 Set set = new TreeSet(); set.add(new Integer(1); set.add(new S

10、tring(spring); System.out.println(set);/抛出java.lang.ClassCastException异常 向TreeSet容器中加入同类型的对象,要求这些对象的类必须实现Comparable接口。 【例7.4】 向TreeSet容器中加入4个雇员信息,并按工资的多少进行升序排列。 程序运行结果:,7.3.2 TreeSet,2指定排序 Java.util.Comparator接口提供具体的排序方式,指定被比较的对象的类型,Comparator接口的compare(T o1,T o2)方法用于比较两个对象的大小。当compare(T o1,T o2)的返回

11、值大于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(列表),7.4.1 ArrayList ArrayList代表长度可变的数组,允许对元素进行随机的快速访问,但是向ArrayList中插入与删除元素的速度较慢。ArrayList是线程不安全的,若要成为线程安全的,可用: List list = Collection

12、s.synchronizedList(new ArrayList(); 【例7.6】 运用ArrayList类的各种方法,并展示相似方法的异同点。 程序运行结果:,7.4.2 LinkedList,LinkedList在内部是采用双向循环链表实现的,插入与删除元素的速度较快,随机访问速度则较慢。LinkedList单独具有addFirst()、addLast()、getFirst()、getLast()、removeFirst()和removeLast()方法,这些方法使得LinkedList可以作为堆栈、队列和双向队列来使用。这些方法彼此之间只是名称有些差异,或者只存在较少差异,以使得这些名

13、字在特定用法的上下文环境中更加适用(特别是在Queue中)。同样,LinkedList也是线程不安全的。 “栈”通常是后进先出的容器,将元素插入到列表的头部。LinkedList具有能够直接实现栈功能的方法,因此可以直接将LinkedList作为栈来使用。 【例7.7】 用LinkedList实现栈的功能。 程序运行结果:,7.5 Map(映射),7.5.1 HashMap HashMap是基于HashCode的,若想正确使用HashMap,则需重写hashCode()和equals()方法。HashMap不是线程安全的,若要线程安全,可用: Map m = Collections.synch

14、ronizedMap(new HashMap(); 【例7.8】 设计一个Java程序,统计任意给定的一个字符串中,每一个英文字母的使用频度。 程序运行结果:,7.5.2 TreeMap,使用SortedMap接口,可以确保键处于排序状态。这些功能的实现由SortedMap接口的方法提供。 Comparator comparator():返回当前Map使用的Comparator;或者返回null,表示以自然方式排序。 firstKey():返回Map中的第一个键。 lastKey():返回Map中的最后一个键。 SortedMap subMap(fromKey,toKey):生成此Map的子集

15、,由键小于toKey的所有键值对组成。 SortedMap tailMap(fromKey):生成此Map的子集,由键大于或等于toKey的所有键值对组成。,7.5.2 TreeMap,【例7.9】 设计一个Java程序,所要完成的功能是:对一个由数字和非数字组成的字符串,将其中连续的数字字符转换成一个整数。若连续的数字字符个数超过4个,则以4个数字字符为一组进行转换。转换生成的整数依次存放在整数数组中。如对字符串“c123yz45!786*+56abc123456789”,分析后的整数数组内容为:123、45、786、56、1234、5678、9。 程序运行结果:,7.6 泛型,Java S

16、E5引入了“泛型”的概念。泛型实现了参数化类型的概念,使代码可以应用于多种类型。泛型这个术语的意思是“适用于许多种的类型”,目的是希望类或方法能够具备最广泛的表达能力。 【例7.10】 指定其持有Object类型的对象。 程序运行结果:,【例7.11】 使用泛型类指定其持有的对象的类型。 程序运行结果:,7.6 泛型,在程序BasicGeneric.java中,T是类型参数,所以在创建BasicGeneric对象时,必须指明想持有什么类型的对象,将其置于尖括号内。例如下面的语句: BasicGeneric generic1 = new BasicGeneric(new B(); 然后,就只能在generic1中存入该类型的对象了,这时的T类型就是引用类型B,所以通过get()方法就能自动地获得正确的类型,而无须强制类型转换。在创建generic2对象时,T又变成Double类型。 其实,一个泛型类就是具有一个或多个类型变量的类。即泛型类可以带有两个及以上类型参数,参数之间用逗号分隔。 【例7.12】 带有两个类型参数T1、T2的泛型类。 程序运行结

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 工作范文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号