6 集合类与泛型
6.0 本章主要内容 集合框架与Collection 接口 SET接口及子类实现 List接口及子类实现 Map接口及子类实现 集合的遍历与Iterator接口 泛型 Collections和Arrays
6.1 集合框架与Collection 接口 集合(Collection) 在程序设计中是一种重要的数据结构,是一系列对象的聚集。java.util包提供了多种重要的集合类的接口和实现,这些集合构成了Java集合框架。 Java集合框架给出了几个简单通用的集合定义. Collection --- A group of objects with no specific ordering; duplicates are permitted, also known as a bag or a multiset List --- ordered collection, duplicates are permitted. Set --- no duplicates are permitted, unordered collection Map --- A map is a collection of arbitrary associations between a key object and a value object
6.1 集合框架与Collection 接口 Collection是最基本的集合接口,它定义了集合框架中一些最基本的方法。
6.2 Set接口及子类实现 Set(集)是一个不包含重复元素的集合,Set接口中的方法都是从Collection继承而来。 HashSet、TreeSet和LinkedHashSet是Set接口的实现类。 比较常用的是HashSet和TreeSet。这两个类相比,HashSet要快,但不提供排序功能,而TreeSet提供排序功能。 TestHashSet.java TestTreeSet.java
6.3 List接口及子类实现 List (列表)是有序的集合 List接口继承了Collection,但又添加了许多按索引操作元素的方法。 ArrayList、Vector和LinkedList是List接口的实现类。 ArrayList和Vector都采用数组来实现,查询集合中的元素快,增加和删除慢。两者不同的是,采用Vector,线程是安全的;采用ArrayList,线程是不安全的,Vector性能上比ArrayList要差。 LinkedList采用链表来实现,增加和删除元素快,查询慢。 TestArrayList.java
6.3 List接口及子类实现(Vector类) Vector(向量)类功能与ArrayList类的功能基本相同,这两个类的多数方法相同。 Vector类实际上可以理解为一个变长的数组。 Vector可以存放各种不同的数据对象。 示例: 向量中保存了5个计算机科学家的姓名。TestVector.java
6.4 Map接口及子类实现 Map (映射)由键值(Key-Value)对组成,Key不可重复,Value可重复,每个Key只能映射一个Value。关键字-值的集合,数据成对装入容器. Map的实现类主要有Hashtable和HashMap。 Map接口是一个独立的接口,不继承Collection接口,和Collection同级接口。 方法:JDK文档 put(),get();remove();
6.4 Map接口及子类实现 TestHashMap.java 作业:Map的一个具体应用,功能是统计字符串数组中单词出现的次数。TestNumberofWords.java
6.5 Collections API- Iterator 每个集合对象都提供一个遍历器,遍历器对象实现Iterator接口,支持前向遍历,而ListIterator支持双向遍历。 问题:用遍历的方法显示前面的HashSet,TreeSet,ArrayList. 见集合遍历例子(Traversing.java)。 TreeSet集合实现了Set接口,它同时还保证元素遍历顺序是升序的。也就是说TreeSet集合中的元素提供比较的算法。 方法 boolean hasNext() Object next(); void remove();
6.6 泛型 Sun公司在JDK1.5之后推出泛型,主要目的是可以建立具有类型安全的集合框架。泛型本质上是指参数化类型,即类、接口、方法中所使用的变量类型由一些参数所指定,分别称为泛型类、泛型接口和泛型方法。 1 泛型类 2 泛型接口 3 泛型类在集合框架中的应用 BasicGeneric.java
6.6 泛型(类) 可以使用“class 名称<泛型列表>”声明一个泛型类,为了与普通类区别,后面加一个“<>”,其内部是泛型参数列表。下面是泛型类声明的例子。 class A<T>; //A是泛型类,T是泛型参数。 class B<T1, T2>; //B是泛型类,T1、T2是泛型参数。
6.7 Collections和Arrays Collections类 排序和查找 TestCollectionsSort.java
6.7 Collections和Arrays TestMethodofCollections .java
6.7 Collections和Arrays Arrays类 Java.util包中提供了专门用于操作数组的Arrays类,该类提供的静态方法实现对数组的操作,主要包括数组的填充、二分查找、排序等。 详解 TestArraySort1.java Arrays类有一个sort(T[ ]a,Comparator c)方法,可以实现对象数组的排序,但定义对象的类需要定义好被排序对象的大小规则,即提供java.util.Comparator接口的实现或对象本身实现java.lang.comparable接口。 TestArraysSortWithComparator.java
选用什么集合? 对于List,它们提供有序集合,如果想通过索引来访问元素,那么这是最佳的选择。数据添加速度快,Vector, ArrayList, LinkedList差不多,LinkedList稍慢一点。对于数据检索,List则很差。 尽管Set集合添加数据的效率稍慢了一些,但它们的检索速度太出众了。不过Set集合拒绝重复元素,并且无序。
总结 1个图 Collection和Map及其子类 5个接口 Collection,Set,List,Map,Iterator,Comparable 2个类 Collections,Arrays 泛型的重点是泛型在集合类中的应用。