下图展示了Java容器类库的完备图,包括抽象类和遗留构件(不包括Queue的实现)。
常用的容器用黑色粗线框表示,点线框表示接口,虚线框表示抽象类,实线框表示类,空心箭头表示实现关系。Produce表示任意的Map对象可以生成Collection对象,任意的Collection对象可以生成Iterator对象。
最后以表格的形式总结List、Set、Map接口及各实现类的特性:
特性 |
实现类 |
实现类特性 |
对放置的元素的要求 |
|
List |
线性、有序的存储容器,可通过索引访问元素get(n) |
ArrayList |
数组实现。非同步。 |
|
Vector |
类似ArrayList,同步。 |
|
||
LinkedList |
双向链表。非同步。 |
|
||
Set |
元素不能重复,元素必须定义equals()方法 |
HashSet |
为快速查找设计的Set |
元素必须定义hashCode() |
TreeSet |
保持次序的Set,底层为树结构 |
元素必须实现Comparable接口 |
||
LinkedHashSet |
内部使用链表维护元素的顺序(插入的次序) |
元素必须定义hashCode() |
||
Map |
保存键值对成员,Map中的所有键必须定义equals()方法 |
HashMap |
基于哈希表的 Map 接口的实现,满足通用需求 |
键必须有恰当的hashCode(),如果修改了equals方法,需同时修改hashCode方法 |
TreeMap |
默认根据自然顺序进行排序,或者根据创建映射时提供的 Comparator进行排序 |
键成员要求实现caparable接口,或者使用Comparator构造TreeMap。键成员一般为同一类型。 |
||
LinkedHashMap |
类似于HashMap,但迭代遍历时取得“键值对”的顺序是其插入顺序或者最近最少使用的次序 |
与HashMap相同 |
||
IdentityHashMap |
使用==取代equals()对“键值”进行比较的散列映射 |
成员通过==判断是否相等 |
||
WeakHashMap |
弱键映射,允许释放映射所指向的对象 |
|
||
ConcurrentHashMap |
线程安全的Map |
|
(1)各种Queue和Stack的行为,完全可以LinkedList提供支持,上述表格不包含Queue。
(2)但凡是和hash相关的,必然会设计到hashCode方法,因为要根据返回的哈希码去计算该对象在哈希表中的位置;但凡是和Tree相关的,必然会设计到Comparable接口,因为要涉及到排序。
(3)如果要进行大量的随机访问,就是用ArrayList;如果要经常从表中间插入或删除元素,则应该用LinkedList。遍历的时候,对于ArrayList优先选择get方式,LinkedList优先选择iterator方式。
(4)Collection继承了Iterable接口,故所有的Collection对象都可以使用foreach方式,对元素进行遍历。所有的Collection对象都hiuforeach循环可以与任何实现了Iterable接口的对象一起工作。