面向对象-教案(第25讲) 泛型、集合框架;(第26讲) Set接口及实现类_第1页
面向对象-教案(第25讲) 泛型、集合框架;(第26讲) Set接口及实现类_第2页
面向对象-教案(第25讲) 泛型、集合框架;(第26讲) Set接口及实现类_第3页
面向对象-教案(第25讲) 泛型、集合框架;(第26讲) Set接口及实现类_第4页
面向对象-教案(第25讲) 泛型、集合框架;(第26讲) Set接口及实现类_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

《面向对象程序设计》教案第25讲教学对象计算机科学技术专业授课内容10.1泛型10.2集合框架10.3List接口及实现类课程标准教学目标(一)知识目标1.了解泛型的概念2.掌握泛型的定义和使用3.了解集合框架4.掌握List接口及实现类(二)能力目标1.能够学会泛型类的定义和使用2.熟练掌握ArrayList的基本操作,能够熟练使用List集合解决问题教学方法采用讲授法、演示法、讨论法、案例教学。学时及分配(第1学时50分钟)课堂讲授30分钟课堂练习20分钟10.1泛型10.2集合框架学时及分配(第2学时50分钟)课堂讲授20分钟课堂练习30分钟10.3List接口及实现类知识点分析重点:泛型类型的定义和使用ArrayList的基本操作难点:泛型接口及泛型方法集合的体系结构、迭代器教学过程设计内容方式问题导入回顾一下,我们在前边课程中定义了一个整数栈类IntStack,该类使用Integer作为栈的元素,这就限制了该类只能对Integer元素操作。如果要使这个栈类更具有通用性,我们可以使用Object作为栈的元素,因为Object类是所有类的超类,所以Object可以引用任何对象类型。然而,这种做法无法提供类型的安全性,在进行类型转换时可能发生类型不匹配异常。使用泛型就可以提高类型安全性,因为,它可以使类型转换自动地、隐式地进行。所谓泛型(generics)就是带一个或多个类型参数(typeparameter)的类或接口。对于上述讨论的对象栈,可以使用泛型定义。内容要点10.1.1泛型类泛型是带一个或多个类型参数的类或接口。【程序10-1】定义一个泛型Node类表示节点,类型参数T表示节点中存放的值。Node.javapackagecom.boda.xy;publicclassNode<T>{privateTdata;//泛型成员publicNode(){}//默认构造方法publicNode(Tdata){//带参数构造方法this.data=data;}publicTgetData(){//访问方法定义 returndata;}publicvoidsetData(Tdata){//修改方法定义 this.data=data;}//显示类型名publicvoidshowType(){ System.out.println("T的类型是:"+data.getClass().getName());}}泛型类型的使用与方法调用类似,方法调用需向方法传递参数,使用泛型需传递一个类型参数,即用某个具体的类型替换T。例如,如果要在Node对象中存放Integer对象,就需要在创建Node对象时为其传递Integer类型参数。要实例化泛型类对象,也使用new运算符,但在类名后面需加上要传递的具体类型。varintNode=newNode<Integer>();一旦创建了intNode对象,就可以调用setData()方法设置其中的Integer对象,调用getData()方法返回其中的Integer对象,如下代码所示。【程序10-2】NodeTest.javapackagecom.boda.xy;publicclassNodeTest{publicstaticvoidmain(String[]args){varintNode=newNode<Integer>();不需要强制类型转换intNode.setData(999);不需要强制类型转换varvalue=intNode.getData();System.out.println(value);intNode.showType();}}按照约定,类型参数名使用单个大写字母表示。常用的类型参数名有:E表示元素,K表示键,N表示数字,T表示类型,V表示值等。10.1.2泛型接口还可以定义泛型接口。泛型可能具有多个类型参数,但在类或接口的声明中,每个参数名必须是唯一的。【程序10-3】定义了带两个参数的泛型接口Entry。【程序10-4】定义了实现Entry接口的泛型类Pair。下面语句创建两个Pair类实例:varp1=newPair<Integer,String>(20,"twenty");varp2=newPair<String,String>("china","Beijing");10.1.3泛型方法泛型方法(genericmethod)是带类型参数的方法。类的成员方法和构造方法都可以定义为泛型方法。泛型方法的定义与泛型类型的定义类似,但类型参数的作用域仅限于声明的方法和构造方法内。泛型方法可以定义为静态的和非静态的。【程序10-5】泛型方法的定义和使用。MathUtil.java参见教材。10.1.4通配符(?)的使用泛型类型本身是一个Java类型,为泛型类型传递不同的类型参数会产生不同的类型。例如:List<Object>list1=newArrayList<Object>();List<String>list2=newArrayList<String>();List<String>并不是List<Object>的子类型。因此,把一个List<String>对象传递给一个需要List<Object>对象的方法,将会产生一个编译错误。请看下面代码。publicstaticvoidprintList(List<Object>list){for(Objectelement:list){System.out.println(element);}}如果传递给该方法一个List<String>对象,将发生编译错误。如果要使上述方法可打印任何类型的列表,可将其参数类型修改为List<?>,如下所示:publicstaticvoidprintList(List<?>list){for(Objectelement:list){System.out.println(element);}}这里,问号(?)就是通配符,它表示该方法可接受任何类型的List对象。【程序10-6】WildCardDemo.java10.1.5方法中有界参数有时需要限制传递给类型参数的类型种类,例如,要求一个方法只接受Number类或其子类的实例,这就需要使用有界类型参数(boundedtypeparameter)。有界类型分为上界和下界,上界用extends指定,下界用super指定。例如,要声明上界类型参数,应使用问号(?),后跟extends关键字,然后是上界类型。这里,extends具有一般的意义,对类表示扩展(extends),对接口表示实现(implements)。假如要定义一个getAverage()方法,它返回一个列表中所有数字的平均值,我们希望该方法能够处理Integer列表、Double列表等各种数字列表。但是,如果把List<Number>作为getAverage()方法的参数,它将不能处理List<Integer>列表或List<Double>列表。为了使该方法更具有通用性,可以限定传递给该方法的参数是Number对象或其子类对象的列表,这里Number类型就是列表中元素类型的上界(upperbound)。下面案例的getAverage()方法就是这样的参数。【程序10-7】BoundedTypeDemo.java10.2集合框架集合是指集中存放一组对象的一个对象。集合相当于一个容器,它提供了保存、获取和操作其他元素的方法。集合能够帮助Java程序员轻松地管理对象。Java集合框架由两种类型构成,一个是Collection,另一个是Map。Collection对象用于存放一组对象,Map对象用于存放一组“关键字/值”的对象。Collection和Map是最基本的接口,它们又有子接口,这些接口的层次关系如图12-5所示。10.3List接口及实现类List接口实现一种线性表的数据结构。存放在

List中的所有元素都有一个下标(从0开始),可以通过下标访问List中的元素。List中可以包含重复元素。List接口的实现类包括ArrayList、LinkedList、Vector和Stack。10.3.1List的操作List接口除继承Collection的方法外,还定义了一些自己的方法。使用这些方法可以实现定位访问、查找、迭代和返回子线性表。booleanadd(Objecte):将指定元素插入到列表末尾。voidadd(intindex,Eelement):将指定元素插入到指定下标处。Eget(intindex):返回指定下标处的元素。Eset(intindex,Eelement):修改指定下标处的元素。Eremove(intindex):删除指定下标处的元素booleanaddAll(intindex,Collection<?extendsE>c):在指定下标处插入集合c中的全部元素。intindexOf(Objecto):查找指定对象第一次出现的位置。intlastIndexOf(Objecto):查找指定对象最后一次出现的位置。List<E>subList(intfrom,intto):返回从from到to元素的一个子线性表。10.3.2ArrayList类ArrayList是最常用的列表实现类,它通过数组实现的集合对象。ArrayList类实际上实现了一个变长的对象数组,其元素可以动态地增加和删除。它的定位访问时间是常量时间。ArrayList的构造方法如下:ArrayList():创建一个空的数组列表对象,默认初始容量是10。初始容量指的是列表可以存放多少元素。当列表填满而又需要添加更多元素时,列表大小会自动增大。ArrayList(Collectionc):用集合c中的元素创建一个数组列表对象。ArrayList(intinitialCapacity):创建一个空的数组列表对象,并指定初始容量。下列代码创建一个ArrayList对象向其中插入几个元素,并使用ArrayList的有关方法对它操作。varbigCities=newArrayList<String>();bigCities.add("北京");bigCities.add("上海");bigCities.add("广州");System.out.println(bigCities.size());bigCities.add(2,"伦敦");//插入元素bigCities.set(2,"纽约");//修改元素System.out.println(bigCities.contains("北京"));System.out.println(bigCities);System.out.println(bigCities.indexOf("巴黎"));10.3.3遍历集合元素在使用集合时,遍历集合元素是最常见的任务。遍历集合中的元素有多种方法:用简单的for循环、用增强的for循环和用Iterator迭代器对象。1.使用简单的for循环使用简单的for循环可以遍历集合中的每个元素。for(vari=0;i<bigCities.size();i++){System.out.print(bigCities.get(i)+"");}2.使用增强的for循环使用增强的for循环不但可以遍历数组的每个元素,还可以遍历集合中的每个元素。下面的代码打印集合的每个元素:for(varcity:bigCities)System.out.println(city);上述代码的含义是:将集合bigCities中的每个对象存储到city变量中,然后打印输出。使用这种方法只能按顺序访问集合中的元素,不能修改和删除集合元素。3.使用迭代器迭代器是一个可以遍历集合中每个元素的对象。调用集合对象的iterator()方法可以得到Iterator对象,再调用Iterator对象的方法就可以遍历集合中的每个元素。Iterator接口定义了如下3个方法。booleanhasNext():返回迭代器中是否还有对象。Enext():返回迭代器中下一个对象。voidremove():删除迭代器中的当前对象。Iterator使用一个内部指针,开始它指向第一个元素的前面。如果在指针的后面还有元素,hasNext()方法返回true。调用next()方法,指针将移到下一个元素,并返回该元素。remove()方法将删除指针所指的元素。假设myList是ArrayList的一个对象,要访问myList中的每个元素,可以按下列方法实现:Iteratoriterator=myList.iterator();//得到迭代器对象while(iterator.hasNext()){System.out.println(iterator.next());}使用Iterator也可以用for循环访问集合元素。for(variterator=myList.iterator();iterator.hasNext();){System.out.println(iterator.next());}【程序10-8】ListDemo.java10.3.4数组转换为List对象java.util.Arrays类提供了一个asList()方法,它将数组转换成List对象:publicstatic<T>List<T>asList(T…a)该方法提供了一个方便的从多个元素创建List对象的途径,它的功能与Collection接口的toArray()方法相反。varstr=newString[]{"one","two","three","four"};varlist=Arrays.asList(str);//将数组转换为列表System.out.println(list);也可以将数组元素直接作为asList()方法的参数写在括号中,例如:varlist=Arrays.asList("one","two","three","four");数组元素还可以使用基本数据类型,如果使用基本数据类型,则转换成List对象元素时进行了自动装箱操作。在Java9中,如果希望使用几个元素创建一个集合,可以使用集合的工厂方法,从而可以避免调用add()方法。varints=Set.of(1,2,3);varstrList=List.of("first","second");注意,使用Arrays.asList()方法和集合的of()工厂方法返回的集合对象是不可变的,因此创建后再进行填加、删除等操作,将抛出UnsupportedOperationException异常。如果要实现对集合对象的操作,可以将其作为一个参数传递给另一个List的构造方法,如下所示。List<String>list=newArrayList<>(Arrays.asList(str));采用机房授课边讲边练,同时用启发式、讨论式、案例教学等教学方法。布置课外学习任务教材课后编程题:1,2教学反思《面向对象程序设计》教案第26讲教学对象计算机科学技术专业授课内容10.4Set接口及实现类10.5Queue接口及实现类10.6案例学习——用集合存储、遍历员工记录课程标准教学目标(一)知识目标1.掌握Set接口及实现类的定义和使用2.掌握Queue接口及实现类的定义和使用(二)能力目标1.熟练掌握HashSet和TreeSet集合的基本操作,能够熟练使用Set集合解决实际问题2.熟练掌握Queue接口的基本操作,能够熟练使用LinkedList解决实际问题教学方法采用讲授法、演示法、讨论法、案例教学。学时及分配(第1学时50分钟)课堂讲授30分钟课堂练习20分钟10.4Set接口及实现类学时及分配(第2学时50分钟)课堂讲授20分钟课堂练习30分钟10.5Queue接口及实现类10.6案例学习——用集合存储、遍历员工记录知识点分析重点:HashSet和TreeSet集合的基本操作ArrayDeque类和LinkedList类的使用难点:自定义比较器教学过程设计内容方式问题导入在Connection接口中,有两个重要接口List和Set,上节课已经讲解了List接口及其实现类的使用,本节课将继续讲解Connection接口的另一个子接口Set接口及其实现类的使用。内容要点10.4Set接口及实现类Set接口对象类似于数学上的集合概念,其中不允许有重复的元素。Set接口没有定义新的方法,只包含从Collection接口继承的方法。Set接口的常用实现类有:HashSet类、TreeSet类和LinkedHashSet类。10.4.1HashSet类HashSet类用散列方法存储元素,具有最好的存取性能,但元素没有顺序。HashSet类的构造方法有:HashSet():创建一个空的散列集合,该集合的默认初始容量是16,默认装填因子(loadfactor)是0.75。装填因子决定何时对散列表进行再散列。例如,如果装填因子为0.75(默认值),而表中超过75%的位置已经填入元素,这个表就会用双倍的桶数自动地进行再散列。对于大多数应用程序来说,装填因子为75%是比较合理的。HashSet(Collectionc):用指定的集合c的元素创建一个散列集合。HashSet(intinitialCapacity):创建一个散列集合,并指定集合的初始容量。下面代码演示了HashSet的使用。varwords=newHashSet<>();words.add("one");words.add("two");words.add("three");words.add("four");words.add("one");//不能将重复的元素添加到集合中for(varw:words)System.out.print(w+"");//fouronetwothree从结果可以看到,在向Set对象中添加元素时,重复的元素不能添加到集合中。另外,由于程序中使用的实现类为HashSet,它并不保证集合中元素的顺序。10.4.2TreeSet类TreeSet实现一种树集合,它使用红-黑树为元素排序,添加到TreeSet中的元素必须是可比较的,即元素的类必须实现Comparable<T>接口。它的操作要比HashSet慢。TreeSet类的默认构造方法创建一个空的树集合,其他构造方法如下。TreeSet(Collectionc):用指定集合c中的元素创建一个新的树集合,集合中的元素按自然顺序排序。TreeSet(Comparatorc):创建一个空的树集合,元素的排序规则按给定的比较器c的规则排序。【程序10-9】TreeSetDemo.java10.4.3对象顺序创建TreeSet类对象时如果没有指定比较器对象,集合中的元素按自然顺序排列。所谓自然顺序(naturalorder)是指集合对象实现了Comparable<T>接口的compareTo()方法,对象则根据该方法排序。如果试图对没有实现Comparable<T>接口的集合元素排序,将抛出ClassCastException异常。另一种排序方法是创建TreeSet对象时指定一个比较器对象,这样,元素将按比较器的规则排序。如果需要指定新的比较规则,可以定义一个类实现Comparator<T>接口,然后为集合提供一个新的比较器。字符串的默认比较规则是按字母顺序比较。假如按反顺序比较,可以定义一个类实现Comparator<T>接口,然后用该类对象作为比较器。【程序10-10】实现字符串的降序排序DescSortDemo.java10.5Queue接口及实现类Queue接口是Collection的子接口,它是以先进先出(First-In-First-Out,FIFO)的方式排列其元素,称为队列(queue)。Queue接口的子接口Deque实现双端队列,ArrayDeque和LinkedList是它的两个实现类。10.5.1Queue接口和Deque接口Queue接口除了提供Collection的操作外,还提供了插入、删除和检查操作。Queue接口的常用方法如下:booleanadd(Ee):将指定的元素e插入到队列中。Eremove():返回队列头元素,同时将其删除。Eelement():返回队列头元素,但不将其删除。Deque接口实现双端队列,它支持从两端插入和删除元素。Deque接口中定义的基本操作方法,如表10-1所示。表10-1Deque接口常用方法操作类型队首元素操作队尾元素操作插入元素addFirst(e)addLast(e)offerFirst(e)offerLast(e)删除元素removeFirst()removeLast()pollFirstpollLast()返回元素getFirst()getLast()peekFirst()peekLast()10.5.2ArrayDeque类和LinkedList类Deque的常用实现类包括ArrayDeque类和LinkedList类,前者是可变数组的实现,后者是线性表的实现。LinkedList类比ArrayDeque类更灵活,它实现了线性表的所有操作,其中可以存储null元素,但ArrayDeque对象不能存储null。可以使用增强的for循环和迭代器访问Deque的元素。varaDeque=newArrayDeque<String>();…for(varstr:aDeque){System.out.println(str);}使用迭代器访问Deque元素代码如下:varaDeque=newArrayDeque<String>();…for(variter=aDeque.iterator();iter.hasNext();){System.out.println(iter.next());}【程序10-11】演示了ArrayDeque类的使用DequeDemo.java队列的实现类一般不允许插入null元素,但LinkedList类是它允许null元素。如果需要经常在线性表的头部添加元素或在内部删除元素,就应该使用LinkedList。这些操作在LinkedList中是常量时间,在ArrayList中是线性时间。而对定位访问LinkedList是线性时间,ArrayList是常量时间。LinkedList的构造方法如下:LinkedList():创建一个空的链表。LinkedList(Collecti

温馨提示

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

评论

0/150

提交评论