欢迎来到天天文库
浏览记录
ID:59417286
大小:459.50 KB
页数:35页
时间:2020-09-19
《Java程序设计-10-集合ppt课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
Java程序设计第10章集合框架 学习目标理解集合的框架什么是集(Set)、列表(List)和映射(Map),掌握他们之间的差异。掌握利用迭代顺序访问集合中元素的方法掌握通过泛型机制限制集合元素类型的方法通过集合访问,进一步理解基于接口编程的概念掌握如何构建自定义有序集合的方法了解并发访问集合可能的风险 集合框架接口:这是一些抽象的数据类型,通过抽象接口定义,允许操纵集合独立于它的具体实现。实现:满足各种各样要求的集合类具体实现了这些接口的定义,本质上,这些类定义了满足不同要求的数据结构。算法:算法满足了各种计算要求,例如检索、排序、插入、获取等,为适应不同目的的集合提供了同名但不同的算法实现(多态性)。 10.1.2集合的接口Java提供的集合类很多,每个集合类都有自己特定的实现,应用在特定的场合,但幸运的是,应用程序可以通过接口发布自己的实现,使得外部程序可以通过公用接口来访问集合内对象,而不用考虑内部是怎么实现的。set(集)、sequence(序列)、map(映射)和Queue(队列) HashSet的继承和实现层次 集(set)中的对象通常不按任何特定的方式排列,而且集中不允许有重复的元素。序列(sequence)或者列表(list)的主要特性是其元素以线性方式排列,与set不同,列表通常允许重复的元素。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。映射(map)与集和序列有显著区别,因为映射中的每项都是形式出现的,这种方式也被称为字典。一个映射不能包含重复的键;每个键最多只能映射一个值。Queue(队列)基本上就是一个先入先出(FIFO)的数据结构。 迭代器—IteratorIteratoriterator();获得一个集合的迭代器Iteratoriterator=collectionName.iterator();常用方法说明hasNext()如果仍有元素可以迭代,则返回trueEnext()返回迭代的下一个元素remove()迭代器指向的集合中移除迭代器返回的最后一个元素(可选操作) 10.2列表—ListList是有序的collection(也称为列表)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。它的特性主要包括:List是有序的,可以通过整数索引(从0开始)访问列表中的元素。列表通常允许重复的元素。List接口提供了特殊的迭代器,称为ListIterator,除了允许Iterator接口提供的正常操作外,该迭代器还允许元素插入和替换,以及双向访问。某些实现List接口的列表类,对是否允许null在列表中的存在有不同的规定。在目前的Java版本中,实现了List接口的类有AbstractList、ArrayList、Stack、Vector、AbstractSequentialList、、CopyOnWriteArrayList、LinkedList。 List的方法常用方法说明add(intindex,Eelement)列表的指定位置插入指定元素addAll(intindex,Collectionc)将指定collection中的所有元素都插入到列表中指定位置get(intindex)返回列表中指定位置的元素indexOf(Objecto)回列表中首次出现指定元素的索引,或者如果列表不包含此元素,则返回-1lastIndexOf(Objecto)listIterator()返回以正确顺序在列表的元素上进行迭代的列表迭代器listIterator(intindex)返回列表中元素的列表迭代器(以正确的顺序),从列表的指定位置开始remove(intindex)移除列表中指定位置的元素set(intindex,Eelement)用指定元素替换列表中指定位置的元素subList(intfromIndex,inttoIndex)返回列表中指定的fromIndex(包括)和toIndex(不包括)之间的部分视图 10.2.3ArrayListArrayListList是接口,而ArrayList是一个实现List接口,且大小可变的数组,它实现了所有可选列表操作,并允许包括null在内的所有元素。每个ArrayList实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向ArrayList中不断添加元素,其容量也自动增长。另外,ArrayList实例不是同步保护的。Listlist=Collections.synchronizedList(newArrayList(...)); publicclassArrayListDemo{ListstudentList=newArrayList();//接收学生对象,插入到列表中publicsynchronizedvoidaddStudent(Studentstudent){studentList.add(student);}publicintgetCount(){//获得学生总数returnstudentList.size();}publicvoidlist(){//顺序列出所有学生名单for(Studento:studentList){System.out.println(o);}}publicvoidlist(intfromIndex){//从指定位置开始列出所有学生名单intsize=studentList.size();for(inti=fromIndex;ic)如果set中没有指定collection中的所有元素,则将其添加到此set中(可选操作)clear()移除set中的所有元素(可选操作)contains(Objecto)如果set包含指定的元素,则返回trueisEmpty()如果set不包含元素,则返回trueiterator()返回在此set中的元素上进行迭代的迭代器remove(Objecto)如果set中存在指定的元素,则将其移除(可选操作)size()返回set中的元素数(其容量) Set的实现类HashSet此类实现Set接口,由哈希表(实际上是一个HashMap实例)支持,假定哈希函数将这些元素正确地分布在桶中,此类为基本操作(add、remove、contains和size等)提供了稳定的性能。它不保证集合的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用null元素。 创建集对象Setroster=newHashSet();这种方法创建的集默认初始容量是16,装填因子是0.75。Setroster=newHashSet(100,0.6);创建的集初始容量是100,装填因子是0.6。Setroster=newHashSet(100);创建的集初始容量是100,默认装填因子是0.75。获得迭代器Iteratorit=roster.iterator();这种方法可以获得集对象roster的迭代器,以便对roster中的元素顺序访问。 publicclassSetDemo{Setstudents=newHashSet();publicsynchronizedvoidadd(Eo){//接收学生对象,插入到列表中students.add(o);}publicvoidlist(){//顺序列出所有学生名单for(Eo:students){System.out.println(o);}}publicstaticvoidmain(String[]args){SetDemoroster=newSetDemo();roster.add(newStudent("001","Zhang-hua","CS"));roster.add(newStudent("002","Song-xin","CS"));roster.add(newStudent("003","Li-feng","MATH"));roster.add(newStudent("004","Huang-shan","MATH"));System.out.println("Totalis"+roster.getCount());System.out.println("Showall....");roster.list();}} 映射—Map映射(Map)是另外一种存储数据的方法,这种方法具有较快的查找速度。每个对象都有一个关键字与之对应,关键字决定了这个对象引用的存储位置,并且关键字和对象都存储在映射中,在应用中,只要给出关键字,总能直接或间接找到存储在映射中的相应对象。所以这种应用有时也称为"字典"。 Map的主要实现类 创建HashMapMaproster=newHashMap();这种方法创建的映射默认初始容量是16,装填因子是0.75。Maproster=newHashMap(100,0.6);创建的映射初始容量是100,装填因子是0.6。Maproster=newHashMap(100);创建的映射初始容量是100,默认装填因子是0.75。对象的存储:下面的例子,选择了学生的学号作关键字将学生对象存储到映射roster中。Studentstudent=newStudent("001","Zhang-hua","CS");roster.put(student.studentid,student); 检索对象在HashMap实例中检索一个对象,只需指定对应的关键字,如下面语句:student=roster.get(studentid);如果对应的位置没有找到对象或者是null,返回null。删除对象删除HashMap实例中的一个对象,同样需指定对应的关键字,如下面语句:student=roster.remove(studentid); 获得映射中的元素获得映射中的元素有三种办法,每种办法都返回对应元素的Set/Collection视图。获得关键字集合Setkeys=roster.keySet();这种方法可以获得所有对象的关键字集。获得对象集合Collectionvalues=roster.values();values()方法返回映射中的所有对象集合获得映射中关键字/对象集合:在Java语言中,映射中的每一个元素都是一个包含"关键字-对象"的Map.Entry类型对象。Set>entrys=roster.entrySet();Map.Entry提供了获得每个Map.Entry对象的key和value的方法:getKey()和getValue()。 示例:获得映射中关键字/对象集合Maproster=newHashMap();….Set>entrys=students.entrySet();for(Map.Entryentry:entrys){System.out.println(entry.getKey()+"/"+entry.getValue());} 泛型在集合中的应用作为参数化的一种应用,泛型在集合中应用的尤为突出。声明集合类型的变量时,加上泛型定义,可以指明集合中存储的对象类型,如Setstudents=newHashSet();这个声明指明该集合只允许存储Student及其子类的对象。通过泛型的应用,简化了我们应用编程中对于几何元素类型的判断及转化中的可能错误 排序集合元素Comparable和Comparator接口常被用来对集合元素进行排序Comparable此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo方法被称为它的自然比较方法。实现此接口的对象列表(和数组)可以通过Collections.sort(和Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。Comparator强行对某个对象collection进行整体排序的比较函数。可以将Comparator传递给sort方法(如Collections.sort或Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用Comparator来控制某些数据结构(如有序set或有序映射)的顺序,或者为那些没有自然顺序的对象collection提供排序 实现比较接口的实例:publicclassStudentimplementsComparable{privateStringsid;privateStringname;privateDatebirthDate;publicintcompareTo(Objecto){Students=(Student)o;returnsid.compareTo(s.sid);}…} Comparator一个类只能实现一种比较机制,如果在不同环境下需要对同样的对象采用不同的比较策略进行排序时,就需要用到此接口,例如可以用成绩对Student排序,也可以用学号、姓名、出生日期等进行排序。方法分别创建不同的Comparator实现类 实现了Comparator接口的实现类importjava.util.Comparator;publicclassSIDComparatorimplementsComparator{publicintcompare(Objecto1,Objecto2){Students1=(Student)o1;Students2=(Student)o2;returns1.getSid().compareTo(s2.getSid());}}注:学生类无需实现比较接口 利用SIDComparator实现有序集合importjava.util.Comparator;importjava.util.TreeSet;publicclassComparatorTest{publicstaticvoidmain(String[]args){Comparatorc=newSIDComparator();TreeSetstudentSet=newTreeSet(c);studentSet.add(newStudent("002","Mike"));studentSet.add(newStudent("001","Mike"));for(Students:studentSet){System.out.println(s.getSid());}}} 总结Java的集合特点Set、List、Map、QueueVector(ArrayList)就是一个可以动态增长的、线程安全的数组Statck继承于Vector,实现了后进先出HashSet,一个无序的集,没有重复对象HashMap定义了一个散列映射,实现了基于关键字存取对象Iterator是一个用于从集合中按顺序检索对象的接口Comparator接口,可以使集合按照某种排序策略进行排序Comparable接口,使得实现接口的对象具有某种排序策略
此文档下载收益归作者所有
举报原因
联系方式
详细说明
内容无法转码请点击此处