集合类是 Java基础技术中十分重要的内容。 Java集合类封装了集合中常用数据结构和算法,它犹如哪咤的烽火轮,功能强大,而且不用亲自制造 (Made in America) 。
首先看下面这张表,本文即通过它展开相关内容。
Implementations
Hash Table
Resizable Array
Balanced Tree
Linked List
Hash Table + LinkedList
Interfaces
Set
HashSet
TreeSet
LinkedHashSet
List
ArrayList
LinkedList
Map
HashMap
TreeMap
LinkedHashMap
图 1
Java 集合类的种类
注意图 1第二列, Java在设计集合结构时,把集合划成 3类:第一种 Set,普通的无序集;第二种 List,偏序集;第三种 Map,有序对的集合。其中 Set和 List都继承自 Collection接口, Map没有从 Collection继承。这样做也是没办法的事,因为 Map并不是一个通常意义的集合,它的元素是一个 key-value-pair,而 Collection根本就不是 Map,它还没有 key的概念。虽然 Collection和 Map彼此没有继承关系,但它们有大量同名的方法。值得注意的是, Map提供了 keySet()和 values()两个方法,分别返回一个 key的集合和值的集合。
示例 1 : 通过对一个 HashSet 对象和一个 ArrayList 对象中元素使用跌代器可以显示 Set 与 List 中元素之间的顺序关系: Set 中元素是无序的, List 不是。
import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; public class ElementOrder ... { public static void main(String[] args) ... { Iterator it = null ; Set ht = new HashSet(); ht.add( " htA " ); ht.add( " htB " ); ht.add( " htC " ); ht.add( " htD " ); it = ht.iterator(); while (it.hasNext()) ... { System.out.println(it.next()); } List al = new ArrayList(); al.add( " alA " ); al.add( " alB " ); al.add( " alC " ); al.add( " adD " ); it = al.iterator(); while (it.hasNext()) ... { System.out.println(it.next()); } } }
示例 2 : Map 类型的集合对象通过 keySet() 和 values() 两个方法,分别返回一个 key 的集合 (Set 类型 ) 和值的集合 (Collection 类型 ) 。
import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class TestMap ... { public static void main(String[] args) ... { Iterator it = null ; Map tm = new HashMap(); tm.put( " a " , new Integer( 1 )); tm.put( " b " , new Integer( 2 )); tm.put( " c " , new Integer( 3 )); Set tk = tm.keySet(); it = tk.iterator(); while (it.hasNext()) ... { System.out.println(it.next()); } Collection tv = tm.values(); it = tv.iterator(); while (it.hasNext()) ... { System.out.println(it.next()); } } }
Java 集合类基于的常见数据结构
注意到图 1 的第二行,是 Java集合类基于的常见数据结构,它是集合对象中元素的组织方式。不同数据结构的类都有一些特定操作,参见示例。
示例 3 List 的一些排序操作。来自 The Java Developers Almanac 1.4
// Create a list String[] strArray = new String[] ... { " z " , " a " , " C " } ; List list = Arrays.asList(strArray); // Sort Collections.sort(list); // C, a, z // Case-insensitive sort Collections.sort(list, String.CASE_INSENSITIVE_ORDER); // a, C, z // Reverse-order sort Collections.sort(list, Collections.reverseOrder()); // z, a, C // Case-insensitive reverse-order sort Collections.sort(list, String.CASE_INSENSITIVE_ORDER); Collections.reverse(list); // z, C, a
区别与联系
图 1种各类的区别和联系很明显:同行同集合类性,同列同数据结构。
操作
根据 Java集合框架的体系,不同的集合类在拥有父类型的操作时由于本身的集合类型和数据结构类型的不同,都有其特有的方法。兄弟类之间有同名的方法也可能因为同样的原因有不同的实现,这正好体现了 OO的多态性。
其他
不可忽视的是 java.util.Collections提供很多操作集合对象的静态方法。集合在 Java还有其他非官方实现形式,如开源的 Trove等。值得一提的是,示例 1中 Set ht = new HashSet(); 的定义方式体现了 DIP(Dependence Inversion Principle,依赖倒转原则 )。