您好,欢迎访问三七文档
当前位置:首页 > 金融/证券 > 投融资/租赁 > 11 使用泛型和集合框架_Java
第11章使用泛型和集合框架Sun服务使用泛型和集合框架第11章2/46目标当完成本章后,你应该能够:•了解集合•了解并使用List接口•了解并使用Set接口•了解并使用Map接口•了解遗留的集合类•通过实现Comparable和Comparator接口创建自然排序和自定义排序•使用泛型集合•了解泛型类中类型参数的使用•重构已存在的非泛型代码•编写对集合进行迭代的程序•了解增强型for循环Sun服务使用泛型和集合框架第11章3/46Collection与Map接口•集合(collection)是个管理一组对象的单一对象。在集合内的对象称之为元素(elements)。通常,集合可以处理很多种类型的对象,这些类型的对象都属于一个特定的类型(也就是说,它们具有共同的父类型)。•集合API包含了如下将对象组为一体的接口:Collection——一组称之为元素的对象;其实现决定了是否有特定的顺序和是否允许有重复元素。List——有顺序的集合;可允许元素重复Set——没有顺序的集合;不允许元素重复Sun服务使用泛型和集合框架第11章4/46元素的类型•在JavaSE5.0发布以前,集合维护对Object类型的对象的引用。这可以使任何对象存放在集合内。从集合中获取对象后,在使用之前必须先正确使用强制类型转换。但是,到了JavaSE5.0平台和以后版本,可以使用泛型集合功能指定要存放在集合中的对象类型。避免了获取时做强制类型转换的麻烦。Sun服务使用泛型和集合框架第11章5/46Sun服务使用泛型和集合框架第11章6/46Map接口Sun服务使用泛型和集合框架第11章7/46通用集合实现Sun服务使用泛型和集合框架第11章8/46列表List•列表List是一个有顺序的Collection,允许有重复元素,主要实现类包括ArrayList和LinkedList,前者是顺序表,后者是链表。•程序11-1的示例中,程序声明了一个被赋予新的ArrayList对象的List类型的变量(list)。然后添加一些元素,将list印到标准输出。因为List允许有重复元素,程序11-1的第10行和第11行的add方法返回true。Sun服务使用泛型和集合框架第11章9/46列表List1importjava.util.*;2publicclassArrayListExample{3publicstaticvoidmain(String[]args){4Listlist=newArrayList();5list.add(one);6list.add(second);7list.add(3rd);8list.add(newInteger(4));9list.add(newFloat(5.0F));10list.add(second);//重复,被添加11list.add(newInteger(4));//重复,被添加12System.out.println(list);13}14}Sun服务使用泛型和集合框架第11章10/46集合Set•程序11-2的示例中,程序声明了一个已初始化为newHashSet的Set类型的变量(set)。然后添加一些元素,并将set打印到标准输出中。程序11-2的第10行和第11行尝试对set添加重复的值。因为重复值无法添加到Set,所以add方法返回false。Sun服务使用泛型和集合框架第11章11/46集合Set1importjava.util.*;2publicclassSetExample{3publicstaticvoidmain(String[]args){4Setset=newHashSet();5set.add(one);6set.add(second);7set.add(3rd);8set.add(newInteger(4));9set.add(newFloat(5.0F));10set.add(second);//重复,不被添加11set.add(newInteger(4));//重复,不被添加12System.out.println(set);13}14}Sun服务使用泛型和集合框架第11章12/46映射Map•Map有时称之为关联数组。Map对象描述了键(key)与值(value)的映射关系。根据定义,Map对象不允许重复键或空键,一个键最多只能对应一个值。•Map接口提供使映射内容被视为集合的三个方法:entrySet–返回包括所有键值对的集合keySet–返回映射所有键的集合values–返回包含映射内所有值的集合Sun服务使用泛型和集合框架第11章13/46Map•Map接口并没有继承Collection接口,因为它代表了映射,而非对象的集合。SortedMap接口继承Map接口。实现Map接口的一些类有HashMap、TreeMap、IdentityHashMap和WeakHashMap。这些映射集合实现的迭代器所表示的顺序只针对每个特定的迭代器。Sun服务使用泛型和集合框架第11章14/46映射Map•程序11-3的示例中,程序声明了一个Map类型的变量map,并赋予它新的HashMap对象。然后通过使用put操作添加一些元素。为了证明map不允许有重复键,程序尝试使用存在的键添加新的值。这将导致以前添加的值被新的值取代。随后程序使用集合查看操作keySet、values和entrySet获取map的内容。Sun服务使用泛型和集合框架第11章15/461importjava.util.*;2publicclassMapExample{3publicstaticvoidmain(Stringargs[]){4Mapmap=newHashMap();5map.put(one,1st);6map.put(second,newInteger(2));7map.put(third,3rd);8//重写前面的赋值9map.put(third,III);10//返回键的集合11Setset1=map.keySet();12//返回值的集合13Collectioncollection=map.values();14//返回键值映射的集合15Setset2=map.entrySet();16System.out.println(set1+\n+collection+“\n”+set2);17}18}Sun服务使用泛型和集合框架第11章16/46遗留的集合类•JDK1.0和1.1版本的集合类仍然以同样的接口存在于当前的JDK中,但它们已经被重组以便与新的集合API交互。Vector类实现List接口。Stack类是Vector的扩展,添加了典型的堆栈操作Hashtable类是Map的实现。Properties类是Hashtable的扩展•上述的每个集合都有返回枚举对象的elements方法。Enumeration同Iterator接口类似但不兼容。例如hasNext由枚举接口中的hasMoreElements替代。Sun服务使用泛型和集合框架第11章17/46排序集合•Comparable和Comparator接口对于排序集合非常有用。Comparable接口为实现它的类提供自然排序。Comparator接口用于指定顺序关系。也可以用于覆盖自然排序。这些接口对于集合元素的排序非常有用。Sun服务使用泛型和集合框架第11章18/46Comparable接口•Comparable接口为java.lang包内的成员。当声明类时,JVM实现无法确定此类对象所需的顺序。通过实现Comparable接口,可以为任意类的对象提供排序。可以将包含实现Comparable接口的类的对象排序。实现Comparable接口的一些Java类的示例有Byte、Long、String、Date和Float。其中,number类使用数字实现;String类则使用字母实现,Date类使用时间顺序实现。将包含String类型元素的ArrayList传递给集合类的静态排序方法,将返回按照字母顺序排序的列表。包含Date类型元素的列表按时间顺序排序。包含Integer类型元素的列表按数值大小排序。要编写自定义的Comparable类型,需要实现Comparable接口的compareTo方法。•程序11-4展示了如何实现Comparable接口。Student类实现Comparable接口以便此类的对象可以互相比较。Sun服务使用泛型和集合框架第11章19/46运行结果•StudentList程序输出结果为:Name=KellyGrantID=0GPA=2.3Name=JohnLynnID=0GPA=2.8Name=JimMaxID=0GPA=3.6Name=MikeHauffmamnID=0GPA=4.0•由观察得到学生是依照GPA进行比较的。这是因为当在TreeSet集合中排序时,TreeSet查看对象是否有自然顺序,并且在这种情况下,使用compareTo方法比较对象。Sun服务使用泛型和集合框架第11章20/46Comparator接口•有些集合,例如TreeSet是被排序的。TreeSet实现需要知道如何将元素排序。假如元素已经有自然排序,TreeSet使用自然排序。否则,必须协助排序。例如,TreeSet类有将Comparator接收为参数的以下构造器:TreeSet(Comparatorcomparator)•此构造器会创建一个新的空树集合,依照指定的Comparator来排序。下面将会进一步讨论Comparator接口的使用。Sun服务使用泛型和集合框架第11章21/46Comparator接口•Comparator接口对排序功能提供了很大的灵活性。例如,如果认为以前描述的Student类的排序受限于GPA的分类,根据名字或一些其它标准对学生排序不太可能。本部分将会展示使用Comparator接口改善排序的灵活性。•Comparator接口是java.util包的成员。它用于在自定义排序而非自然排序中比较对象。例如,它可以按照自然顺序以外的其它顺序将对象排序。也可以用于将未实现Comparable接口的对象分类。•要编写自定义的Comparator,需要提供接口中compare方法的实现:intcompare(Objecto1,Objecto2)这个方法会比较两个参数的顺序。如果第一个参数小于第二个参数则返回负数,如果两个相等返回零,如果第一个参数大于第二个参数则返回正数。Sun服务使用泛型和集合框架第11章22/46Comparator接口实现示例•按firstName进行比较1importjava.util.*;2publicclassNameCompimplementsComparator{3publicintcompare(Objecto1,Objecto2){4return5(((Student)o1).firstName.compareTo(((Student)o2).firstName));6}7}Sun服务使用泛型和集合框架第11章23/46按GPA比较1importjava.util.*;2publicclassGradeCompimplementsComparator{3publicintcompare(Objecto1,Objecto2){4if(((Student)o1).GPA==((Student)o2).GPA)5return0;6elseif(((Student)o1).GPA((Student)o2).GPA)7return-1;8else9return1;10}11}Sun服务使用泛型和集合框架第11章24/461importjava.util.*;2publicclassComparatorTest{3publicstaticvoidmain(String[]args){4Comparatorc=newNameComp();5TreeSetstudentSet=newTreeSe
本文标题:11 使用泛型和集合框架_Java
链接地址:https://www.777doc.com/doc-4270003 .html