《Java程序设计》课件-javaCP6泛型与集合_第1页
《Java程序设计》课件-javaCP6泛型与集合_第2页
《Java程序设计》课件-javaCP6泛型与集合_第3页
《Java程序设计》课件-javaCP6泛型与集合_第4页
《Java程序设计》课件-javaCP6泛型与集合_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

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

文档简介

第六章泛型与集合

Java程序设计本章主要内容

泛型泛型是数据类型多态化的一种体现。集合在Java的API中,对常用的数据结构和算法做了一些规范和实现,形成一系列接口和类。这些抽象出来的数据结构和算法操作统称为Java的集合框架(JavaCollectionFramework,JCF)。程序员使用集合框架提供的接口和类,在具体应用时,不必考虑这些数据结构算法的实现细节,只需用这些类创建对象并直接应用即可,这大大提高了编程效率。2024/12/24李飞——计算中心2/30泛型的基本概念泛型能解决什么样的问题?通过引用来实现参数类型的“任意化”。减少参数传递中显式的数据类型转换。如何理解泛型?是java解决通用数据类型问题的一种实现方案。对比Eg6.1和eg6.2可体会使用泛型与否的差别。2024/12/24李飞——东北大学秦皇岛分校计算中心3/35使用泛型带泛型的类。带泛型的方法。定义带泛型的方法和定义普通成员方法的语句格式完全一样,只是方法的返回值类型和方法的参数可以使用泛型类而已。使用带泛型方法的方式与使用不带泛型方法的方式完全相同。带泛型的语句2024/12/24李飞——东北大学秦皇岛分校计算中心4/35[类说明修饰符]class类名<类型参数列表>[extends父类名][implements接口名列表]{……}类名<类型实参列表>对象名=new构造方法名<类型实参列表>([参数表]);例6.3:定义有两个可变类型的泛型类。classTwoGen<T,V>{ privateTob1; privateVob2; publicTwoGen(To1,Vo2){ ob1=o1; ob2=o2; } publicTgetOb1(){ returnob1;

} publicVgetOb2(){ returnob2; } publicvoidsetOb1(Tob1){ this.ob1=ob1; } publicvoidsetOb2(Vob2){ this.ob2=ob2; }2024/12/24李飞——东北大学秦皇岛分校计算中心5/35 publicvoidshowTypes(){System.out.println("TypeofTis"+ob1.getClass().getName());System.out.println("TypeofVis"+ob2.getClass().getName());}}

publicclasseg6_3{ publicstaticvoidmain(String[]args){ TwoGen<Integer,String>tgObj=newTwoGen<Integer,String>(88,"Generics");//使用泛型的语句 intt=tgObj.getOb1(); System.out.println("value:"+t); Stringv=tgObj.getOb2(); System.out.println("value:"+v); tgObj.setOb1(25);//使用带泛型的方法 tgObj.showTypes(); }}2024/12/24李飞——东北大学秦皇岛分校计算中心6/35使用泛型的注意事项泛型的类型参数必须为类的引用,不能用基本类型(如int,short,long,byte,float,double,char,boolean)。泛型是类型的参数化,在使用时可以用作不同类型,但不同类型的泛型类实例是不兼容的。泛型的类型参数可以有多个,也可以是一个。泛型可以使用extends,super,?

(通配符)来对类型参数进行限定不能实例化泛型类型变量。Gen<T>a=newGen();//错误的Gen<String>a=newGen();//正确的不能创建带泛型类型的数组。如错误语句“TwoGen<Integer,String>[]tArray=newTwoGen<Integer,String>[3];”2024/12/24李飞——东北大学秦皇岛分校计算中心7/356.2集合在程序设计过程中,我们经常需要对一些具有特殊数据结构的多个对象进行操作,比如对表、栈等的对象操作。在Java的API中,对常用的数据结构和算法做了一些规范和实现,形成一系列接口和类。这些抽象出来的数据结构和算法操作统称为Java的集合框架(JavaCollectionFramework,JCF)。程序员使用集合框架提供的接口和类,在具体应用时,不必考虑这些数据结构算法的实现细节,只需用这些类创建对象并直接应用即可,这大大提高了编程效率。2024/12/24李飞——东北大学秦皇岛分校计算中心8/356.2.1集合框架核心接口主要有Collection、List、Set、Queue、Deque和Map。2024/12/24李飞——东北大学秦皇岛分校计算中心9/35Collection接口Collection接口是集合的框架基础,它用于表示对象集合。该接口中声明了所有集合都将拥有的核心方法,如添加元素和删除元素等。2024/12/24李飞——东北大学秦皇岛分校计算中心10/35表6.1Collection的方法方法名说明add(Ee)将元素加入的集合中,成功返回true。clear()移除collection中的所有元素。equals(Objecto)比较collection与指定对象o是否相等。isEmpty()判定collection是否为空,是则返回true。size()获取collection中的元素数。iterator()获得collection的迭代器。hashCode()获得collection的哈希码值。toArray()以数组形式返回collection中所有元素。removeAll(Collection<?>c)从collection中移除c中的所有元素。retainAll(Collection<?>c)仅保留collection中也包含在c中的元素。contains(Objecto)判定集合中是否包含元素o,是返回true。remove(Objecto)移除集合中元素o,删除成功返回true。containsAll(Collection<?>c)判定集合中是否包含子集c,是返回true。addAll(Collection<?extendsE>c)将集合c中的所有元素添加到当前集合中,添加成功返回true。2024/12/24李飞——东北大学秦皇岛分校计算中心11/35Set接口Set接口用来描述数据结构中的集合。它具有与Collection完全一样的接口,只是Set不保存重复的元素,向Set添加元素时,不保证元素添加后与添加的顺序一致。实现它的常用子类有TreeSet类和HashSet类。2024/12/24李飞——东北大学秦皇岛分校计算中心12/35Deque接口Deque用于描述数据结构中的双端队列。它是一种在两端都可以进行加入和删除元素操作的线性表。2024/12/24李飞——东北大学秦皇岛分校计算中心13/35Deque的常用方法方法名说明addFirst(Ee)将指定元素插入双端队列的开头。addLast(Ee)将指定元素插入双端队列的末尾。getFirst()求双端队列的第一个元素。getLast()求双端队列的最后一个元素。peekFirst()求双端队列的第一个元素;如果双端队列为空,则返回null。peekLast()求双端队列的最后一个元素;如果双端队列为空,则返回null。pollFirst()获取并移除队列的首元素;如果双端队列为空,则返回null。pollLast()获取并移除队列的末元素;如果双端队列为空,则返回null。removeFirst()获取并移除双端队列第一个元素。removeLast()获取并移除双端队列的最后一个元素。size()返回双端队列的元素数。2024/12/24李飞——东北大学秦皇岛分校计算中心14/35List接口List用来描述数据结构中的表。List表中允许有重复的元素,而且元素的位置是按照元素的添加顺序存放的。常用的List实现类有ArrayList(数组列表)类和LinkedList(链表)类。2024/12/24李飞——东北大学秦皇岛分校计算中心15/35List的常用方法方法名说明add(intindex,Eelement)在列表的index位置插入指定元素E。addAll(intindex,Collection<?extendsE>c)将集合c中所有元素插入到列表中的index起始位置。get(intindex)求列表中指定位置的元素。indexOf(Objecto)求列表中第一次出现元素o的索引;如果列表不包含该元素,则返回-1。lastIndexOf(Objecto)求列表中最后出现的元素o的索引;如果列表不包含此元素,则返回-1。remove(intindex)移除列表中索引为index的元素。set(intindex,Eelement)用元素E替换列表中索引为index的元素。listIterator()返回此列表元素的列表迭代器。listIterator(intindex)返回列表中从列表的index位置开始的列表迭代器。subList(intfromIndex,inttoIndex)返回列表中从索引fromIndex(包括)到toIndex(不包括)之间的子列表。2024/12/24李飞——东北大学秦皇岛分校计算中心16/35Queue接口Queue接口描述数据结构中的队列。它是一种先进先出的线性表。2024/12/24李飞——东北大学秦皇岛分校计算中心17/35

Queue的常用方法方法名说明element()获取队列头的元素,但是不移除此元素。offer(Ee)将元素e插入队列,添加成功返回true。peek()获取但不移除此队列的头;如果队列为空,则返回null。poll()获取并移除此队列的头,如果队列为空,则返回null。2024/12/24李飞——东北大学秦皇岛分校计算中心18/35Map接口Map接口用于维护键/值对(key/value)的集合,Map容器中的键对象不允许重复,而一个值对象又可以是一个Map,以此类推,这样就形成了一个多级映射。Map有两种常用的实现HashMap类和TreeMap类。2024/12/24李飞——东北大学秦皇岛分校计算中心19/35Map接口的常用方法方法名说明clear()删除所有的键值对。containsKey(Objectkey)判断Map中是否有关键字为key的键值对,有则返回true。containsValue(Objectvalue)判断Map中是否有值为key的键值对,有则返回true。entrySet()返回Map中的项的集合,集合对象类型为Map.Entry。get(Objectkey)获取键值为key对应值得对象。hashCode()获取Map的哈希码值。isEmpty()判断Map是否为空,是则返回true。keySet()获取Map的键的集合。put(Kkey,Vvalue)将键/值为key-value的项加入Map。putAll(Map<?extendsK,?extendsV>m)将m的项全部加入到Map中remove(Objectkey)移除键值为key对应的项。size()获取Map中项的个数。values()获取Map中值的集合。2024/12/24李飞——东北大学秦皇岛分校计算中心20/35其他接口SortedMap接口继承自Map接口,它表示有序的Map。SortedSet接口描述的是一个带有排序的集合,它根据向集合加入元素的顺序排序,比Set接口多了几个和排序相关的方法定义,2024/12/24李飞——东北大学秦皇岛分校计算中心21/35迭代器接口(Iterator和Listlterator)迭代器是集合框架中的一种特殊接口。它提供对集合或表的遍历和各种访问功能。常用的迭代器接口有Iterator接口和Listlterator接口两个。Iterator接口提供对集合元素的访问操作功能2024/12/24李飞——东北大学秦皇岛分校计算中心22/35Iterator接口的方法方法名说明hasNext()判断是否存在另一个可访问的元素,有则返回true。next()返回要访问的下一个元素。remove()删除上次访问返回的对象。2024/12/24李飞——东北大学秦皇岛分校计算中心23/35Listlterator接口的常用方法方法名说明add(Ee)将元素e插入列表当前位置的前面。hasNext()判断是否有下一个元素,有则返回true。hasPrevious()判断是否还有上一个元素,是的话返回true。next()获取列表中的下一个元素。nextIndex()获取下一个元素的索引。previous()获取列表中的前一个元素。previousIndex()获取列表中前一个元素的索引。remove()从列表中移除由next()或previous()返回的最后一个元素。set(Ee)用指定元素e替换next或previous返回的最后一个元素。2024/12/24李飞——东北大学秦皇岛分校计算中心24/35表List接口的具体实现类常用的有ArrayList和LinkedList。ArrayList称为数组列表,它采用类似数组存储元素的形式存储元素,不过它不需要预先定义存储容量。2024/12/24李飞——东北大学秦皇岛分校计算中心25/35ArrayList

我们可以把ArrayList看成一个可变长度的数组。每个ArrayList对象都有一个容量(capacity)。当元素添加到ArrayList时,它的容量会自动增加。2024/12/24李飞——东北大学秦皇岛分校计算中心26/35方法名说明ArrayList()构造一个初始容量为10的空表。ArrayList(Collection<?extendsE>c)用集合c的元素构造列表。ArrayList(intn)构造一个初始容量为n的空列表。trimToSize()将列表的容量调整为列表的当前大小。ensureCapacity(intminCapacity)修改列表的容量,使之可容纳minCapacity个元素例:用ArrayList实现学生成绩排序功能importjava.util.ArrayList;classStudent{//自定义的学生类 Stringname; doublescore; publicStudent(){ name=newString(); score=0; } publicStudent(Stringname,doublescore){ =name; this.score=score; }}2024/12/24李飞——东北大学秦皇岛分校计算中心27/35publicclasseg6_4{ ArrayList<Student>students; publiceg6_4(){ students=newArrayList<Student>();//利用泛型生成ArrayList对象 } publiceg6_4(intn){ students=newArrayList<Student>(n); }publicvoidlistSort(){//内部类为列表排序 Studenttemp=newStudent(); for(inti=0;i<students.size()-1;i++) for(intj=i+1;j<students.size();j++){ if(students.get(i).score<students.get(j).score){ temp=students.get(i); students.set(i,students.get(j)); students.set(j,temp); } }

}2024/12/24李飞——东北大学秦皇岛分校计算中心28/35publicstaticvoidmain(String[]args){ eg6_4eg=neweg6_4(); Students1=newStudent("张三",80); eg.students.add(s1);//向ArrayList追加元素 eg.students.add(newStudent("李四",76));//向ArrayList追加元素 eg.students.add(newStudent("王五",90)); eg.students.add(newStudent("赵六",56)); eg.listSort(); for(inti=0;i<eg.students.size();i++){//输出ArrayList System.out.println("姓名:"+eg.students.get(i).name+ "\t成绩:"+eg.students.get(i).score+ "\t名次:"+(i+1)); } }}2024/12/24李飞——东北大学秦皇岛分校计算中心29/35LinkedList类的部分方法方法名说明LinkedList()构造一个空表。addFirst(Ee)将指定元素插入列表的开头。addLast(Ee)将指定元素添加到列表的结尾。getFirst()返回列表的第一个元素。getLast()返回列表的最后一个元素。removeFirst()移除并返回列表的第一个元素removeLast()移除并返回列表的最后一个元素。LinkedList(Collection<?extendsE>c)构造一个包含集合c中的元素的列表2024/12/24李飞——东北大学秦皇岛分校计算中心30/35迭代器的使用步骤通过iterator()方法得到集合的迭代器。通过调用hasNext方法判断是否存在下一个元素。调用next方法得到当前遍历到的元素。2024/12/24李飞——东北大学秦皇岛分校计算中心31/35例6.5:定义一个类,演示Iterator的使用。importjava.util.Iterator;importjava.util.LinkedList;publicclasseg6_5{ LinkedList<String>names; publiceg6_5(){ names=newLinkedList<String>(); } publicvoidtraversal(){//遍历

Iterator<String>iterator=names.iterator(); System.out.print("姓名:"); for(inti=0;iterator.hasNext();i++){ System.out.print(iterator.next()+""); } System.out.println();

}2024/12/24李飞——东北大学秦皇岛分校计算中心32/35publicvoiddelE(Stringstr){//通过遍历找符合删除条件的元素,然后删除 Iterator<String>iterator=names.iterator(); for(inti=0;iterator.hasNext();i++){ if(iterator.next().equals(str)) iterator.remove(); } } publicst

温馨提示

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

评论

0/150

提交评论