




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章容器和泛型,7.1Collection与lterator,7.2实用类Collections,7.3Set(集),7.4List(列表),7.5Map(映射),7.6泛型,7.7通配符与受限通配符,7.8综合实例,第7章容器和泛型,Java实用类库提供了一套相当完整的容器类来解决这个问题,其中基本的类型是List、Set、Queue和Map,这些对象类型也称为集合类。容器提供了完善的方法来保存对象。Java的容器类库位于java.util包中,Java容器类库中的接口及类之间的关系如图7.1所示,图中实线表示继承,虚线表示接口实现。而泛型的引入最主要原因就是安全地使用容器类。,图7.1容器类,7.1Collection与Iterator,Collection是容器类的根接口,List、Set、Queue是它的直接子接口。Collection表示一组对象,这些对象也称为Collection的元素。List类型的容器允许加入重复对象,按照索引位置排序并且按照在容器中的索引位置检索对象。Set类型的容器不允许加入重复对象,也不按照某种方式排序对象。Map接口没有继承Collection接口。Map类型的容器中的每一个元素包含一对键对象和值对象,容器中的键对象不可重复,值对象可以重复。表7.1列出了Collection接口的常用方法。Iterator接口中声明了如下方法。booleanhasNext():判断容器中的元素是否遍历完毕,没有则返回true。next():返回迭代的下一个元素。voidremove():从迭代器指向的Collection中移除迭代器返回的最后一个元素。必须先调用一次next()方法之后,才能调用一次remove(),即remove()不能连续多次调用。【例7.1】向容器中添加一组元素,用iterator()方法遍历容器中的元素。,7.1Collection与Iterator,程序运行结果:,7.2实用类Collections,List代表长度可变的线性表,Collections的以下方法适用于List类型。copy(Listdest,Listsrc):将所有元素从一个列表复制到另一个列表。fill(Listlist,Tobj):使用指定元素替换指定列表中的所有元素。nCopies(intn,To):返回由指定对象的n个副本组成的不可修改的列表。shuffle(Listlist):使用默认随机源对指定列表进行置换。sort(Listlist):根据元素的自然顺序对指定列表按升序进行排序。【例7.2】使用Collections的min()、max()、binarySearch()等常用方法。程序运行结果:,7.3Set(集),7.3.1HashSetHashSet类按照哈希算法来存取容器中的对象,具有很好的存取和查找性能。当向容器中加入一个对象时,HashSet会调用对象的hashCode()方法来获取哈希码,然后根据这个哈希码进一步计算出对象在容器中的存放位置。在Object类中定义hashCode()和equals()方法,Object类的equals()方法按照对象的内存地址比较对象是否相等,因此如果object1.equals(object2)为true,则表明object1变量和object2变量实际上引用同一个对象,那么object1和object2的哈希码也肯定相同。为了保证HashSet能正常工作,要求当两个对象用equals()方法比较的结果为true时,它们的哈希码也相等。例如,如果object1.equals(object2)为true,那么以下表达式的结果也应为true。object1.hashCode()=object2.hashCode();,7.3.1HashSet,【例7.3】测试不同时重载Object类的equals()和hashCode()方法。程序运行结果:在程序HashSetTest.java中加入两个相同的对象到Set中,由于并没有覆盖Object类hashCode()方法,创建的两个Person对象的哈希码不一样,因此HashSet为两个Person对象计算不同的存放位置,于是把它们存放在容器的不同地方。可见,为了保证HashSet正常工作,如果Student类覆盖了equals()方法,也应该覆盖hashCode()方法,并且保证两个相等的Person对象的哈希码也一样。因此取消程序的注释,重新运行HashSetTest.java程序。程序运行结果:,7.3.2TreeSet,TreeSet类实现了SortedSet接口,能够对容器中的对象进行排序。当向TreeSet中加入一个对象后,会继续保持对象间的排序的次序。例如下面的代码片段:Setset=newTreeSet();set.add(newString(spring);set.add(newString(summer);set.add(newString(autumn);set.add(newString(winter);System.out.println(set);运行结果:autumn,spring,summer,winterTreeSet支持两种排序方式:自然排序和指定排序。在默认的情况下,TreeSet采用自然排序方式。,7.3.2TreeSet,1自然排序在JDK类库中,有一部分类实现了java.lang.Comparable接口,如Integer、Double和String等。Comparable接口有一个compareTo(Objecto)方法,它返回整数类型。pareTo(y):如果返回值为0,则表示x和y相等;如果返回值大于0,则表示x大于y;如果返回值小于0,则表示x小于y。TreeSet调用对象的compareTo()方法比较容器中对象的大小,然后进行升序排列。表7.2列出了JDK类库中实现了Comparable接口的一些类的排序及其排序方式。,表7.2类的排序,7.3.2TreeSet,使用自然排序时,只能向TreeSet容器中加入同类型的对象,如下所示。Setset=newTreeSet();set.add(newInteger(1);set.add(newString(spring);System.out.println(set);/抛出java.lang.ClassCastException异常向TreeSet容器中加入同类型的对象,要求这些对象的类必须实现Comparable接口。【例7.4】向TreeSet容器中加入4个雇员信息,并按工资的多少进行升序排列。程序运行结果:,7.3.2TreeSet,2指定排序Java.util.Comparator接口提供具体的排序方式,指定被比较的对象的类型,Comparator接口的compare(To1,To2)方法用于比较两个对象的大小。当compare(To1,To2)的返回值大于0时,表示o1大于o2;当compare(To1,To2)的返回值等于0时,表示o1等于o2;当compare(To1,To2)的返回值小于0时,表示o1小于o2。【例7.5】实现Comparator接口,加入TreeSet容器中的对象以brand降序排列,以place升序排列。程序运行结果:,7.4List(列表),7.4.1ArrayListArrayList代表长度可变的数组,允许对元素进行随机的快速访问,但是向ArrayList中插入与删除元素的速度较慢。ArrayList是线程不安全的,若要成为线程安全的,可用:Listlist=Collections.synchronizedList(newArrayList();【例7.6】运用ArrayList类的各种方法,并展示相似方法的异同点。程序运行结果:,7.4.2LinkedList,LinkedList在内部是采用双向循环链表实现的,插入与删除元素的速度较快,随机访问速度则较慢。LinkedList单独具有addFirst()、addLast()、getFirst()、getLast()、removeFirst()和removeLast()方法,这些方法使得LinkedList可以作为堆栈、队列和双向队列来使用。这些方法彼此之间只是名称有些差异,或者只存在较少差异,以使得这些名字在特定用法的上下文环境中更加适用(特别是在Queue中)。同样,LinkedList也是线程不安全的。“栈”通常是后进先出的容器,将元素插入到列表的头部。LinkedList具有能够直接实现栈功能的方法,因此可以直接将LinkedList作为栈来使用。【例7.7】用LinkedList实现栈的功能。程序运行结果:,7.5Map(映射),7.5.1HashMapHashMap是基于HashCode的,若想正确使用HashMap,则需重写hashCode()和equals()方法。HashMap不是线程安全的,若要线程安全,可用:Mapm=Collections.synchronizedMap(newHashMap();【例7.8】设计一个Java程序,统计任意给定的一个字符串中,每一个英文字母的使用频度。程序运行结果:,7.5.2TreeMap,使用SortedMap接口,可以确保键处于排序状态。这些功能的实现由SortedMap接口的方法提供。Comparatorcomparator():返回当前Map使用的Comparator;或者返回null,表示以自然方式排序。firstKey():返回Map中的第一个键。lastKey():返回Map中的最后一个键。SortedMapsubMap(fromKey,toKey):生成此Map的子集,由键小于toKey的所有键值对组成。SortedMaptailMap(fromKey):生成此Map的子集,由键大于或等于toKey的所有键值对组成。,7.5.2TreeMap,【例7.9】设计一个Java程序,所要完成的功能是:对一个由数字和非数字组成的字符串,将其中连续的数字字符转换成一个整数。若连续的数字字符个数超过4个,则以4个数字字符为一组进行转换。转换生成的整数依次存放在整数数组中。如对字符串“c123yz45!786*+56abc123456789”,分析后的整数数组内容为:123、45、786、56、1234、5678、9。程序运行结果:,7.6泛型,JavaSE5引入了“泛型”的概念。泛型实现了参数化类型的概念,使代码可以应用于多种类型。泛型这个术语的意思是“适用于许多种的类型”,目的是希望类或方法能够具备最广泛的表达能力。【例7.10】指定其持有Object类型的对象。程序运行结果:,【例7.11】使用泛型类指定其持有的对象的类型。程序运行结果:,7.6泛型,在程序BasicGeneric.java中,T是类型参数,所以在创建BasicGeneric对象时,必须指明想持有什么类型的对象,将其置于尖括号内。例如下面的语句:BasicGenericgeneric1=newBasicGeneric(newB();然后,就只能在generic1中存入该类型的对象了,这时的T类型就是引用类型B,所以通过get()方法就能自动地获得正确的类型,而无须强制类型转换。在创建generic2对象时,T又变成Double类型。其实,一个泛型类就是具有一个或多个类型变量的类。即泛型类可以带有两个及以上类型参数,参数之间用逗号分隔。【例7.12】带有两个类型参数T1、T2的泛型类。程序运行结果:,7.7通配符与受限通配符,考虑下面的一个简单的泛型类,在这个泛型类中只有简单的setXXX()和getXXX()方法。publicclassGenericsprivateTobj;publicvoidsetObj(Tobj)this.obj=obj;publicTgetObj()returnobj;可以给上面的这个泛型类定义两个引用:Genericsgen1=null;Genericsgen2=null;,7.7通配符与受限通配符,现在有一个需求,希望有一个名称为gen的引用可以接受所有下面的对象。gen=newGenerics();gen=newGenerics();简单地说,参数化类型必须是List类型或其子类型,要满足这种要求,可以使用“?”通配符,并使用“extends”关键字限定参数化类型。例如下面的语句:Genericsgen=null;gen=newGenerics();gen=newGenerics();如果指定的不是List的类型或者子类型,则编译器会报告错误。例如下面的语句:Genericsgen=newGenerics();,7.7通配符与受限通配符,如果只指定了而不使用“extends”关键字,则可以是Object类及其子类,也就是所有的类了。那么为什么不直接使用Generics呢?何必要用Generics?通过使用通配符,可限制对它加入新的信息,只能获取它的信息或是移除它的信息。例如下面的语句:Genericsgen=newGenerics();gen.setObj(cat);Genericsgen2=gen;System.ou
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 森林火灾知识培训课件
- 物业公司薪酬体系实施方案
- 2025年初高中体育与健康课程教师招聘考试运动技能测试模拟题集
- 桥梁监控课件
- 高血压护理业务学习试题及答案
- 《机械员》考试题库含答案(培优b卷)
- 2025年工业节能减排技术专家招聘笔试模拟题详解及备考指南
- 2025年碳足迹评价师中级实操面试题及操作指南
- 2025年碳汇计量评估知识体系梳理与高级模拟题实战训练
- 2025年审计招聘笔试实战模拟题集及解析
- 2025年内江市总工会公开招聘工会社会工作者(14人)笔试模拟试题及答案解析
- 2025云南辅警笔试题目及答案
- 2025四川内江市总工会招聘工会社会工作者14人笔试备考试题及答案解析
- 2025年三支扶陕西试题及答案
- 2025年新修订《治安管理处罚法》
- 【政治 云南卷】2025年云南省高考招生统一考试真题政治试卷(含答案)
- 培训班老师规矩管理制度
- 炉窑公司现场管理制度
- 无人车项目计划书范文大全
- 股权转让及公司业绩承诺补充协议模板
- (高清版)DZT 0388-2021 矿区地下水监测规范
评论
0/150
提交评论