集合类是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.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.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
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,依赖倒转原则)。