如果程序只包含固定数量的对象,并且其生命周期都已知,那么这个程序就实在太简单了。
通常,你的程序会根据运行时才知道的条件创建新对象。不到运行期,不会知道所需对象
的数量,甚至不知道确切的类型。为解决这个普遍的编程问题,需要能够在任意时刻,任
意位置,创建任意数量的对象。所以,你就不能指望创建具名的引用来持有每一个对象:
MyObject myReference;
因为你不知道实际上会需要多少这样的引用。
大多数语言都提供了某种方法来解决这个基本问题。Java 有多种方式保存对象(应该说是
对象的引用 reference)。例如前面曾经学习过的数组,它是语言内置的类型。Java 实用
类库还提供了一套相当完整的容器类(也称为集合类,但由于 Java 2 的类库中使用了
Collection 来指代该类库的一个特殊子集,所以我使用“容器”称呼它们)。容器提供了
近乎完美的方式来保存和操纵对象。
只有三种容器:Map,List 和 Set,它
们各有两到三个实现版本。常用的容器用黑色粗线框表示。看到这里,容器应该没有那么
可怕了吧。
回顾一遍 Java标准类库提供的容器:
1. 数组将数字与对象联系起来。它保存类型明确的对象,查询对象时,不需要对
结果做类型转换。它可以是多维的,可以保存基本类型的数据。但是,数组
一旦生成,其容量就不能改变。
2. Collection 保存单个的元素,而 Map 保存相关联的键值对。
3. 像数组一样,List 也建立数字与对象的关联,可以认为数组和 List 都是排好序
的容器。List能够自动扩充容量。但是List不能保存基本类型,只能保存Object的引用,
因此必须对从容器中取出的 Object 结果做类型转换。
4. 如果要进行大量的随机访问,就使用 ArrayList;如果要经常从 List中间插入或
删除元素,则应该使用 LinkedList。
5. 队列、双向队列以及栈的行为,由 LinkedList提供支持。
6. Map 是一种将对象与对象相关联的设计。HashMap着重于快速访问;TreeMap
保持“键”始终处于排序状态,所以没有 HashMap 快。LinkedHashMap 保
持元素插入的顺序,也可以使用 LRU算法对其重排序。
7. Set不接受重复元素。HashSet提供最快的查询速度,TreeSet保持元素处于排
序状态。LinkedHashSet以插入顺序保存元素。
8. 新程序中不应该使用过时的 Vector、Hashtable和 Stack。
容器是你每天都会用到的工具,它可以使你的程序更简洁、更强大、更高效。