转载自:http://www.ibm.com/developerworks/cn/java/l-collection/
4.1.1.主体结构
我们用下表来描述j2sdk的集合框架的主体结构:
接口
| 简述
| 实现
| 操作特性
| 成员要求
|
Set
| 成员不能重复
| HashSet
| 外部无序地遍历成员。
| 成员可为任意Object子类的对象,但如果覆盖了equals方法,同时注意修改hashCode方法。
|
TreeSet
| 外部有序地遍历成员;
附加实现了SortedSet, 支持子集等要求顺序的操作
| 成员要求实现caparable接口,或者使用
Comparator构造TreeSet。成员一般为同一类型。
|
LinkedHashSet
| 外部按成员的插入顺序遍历成员
| 成员与HashSet成员类似
|
List
| 提供基于索引的对成员的随机访问
| ArrayList
| 提供快速的基于索引的成员访问,对尾部成员的增加和删除支持较好
| 成员可为任意Object子类的对象
|
LinkedList
| 对列表中任何位置的成员的增加和删除支持较好,但对基于索引的成员访问支持性能较差
| 成员可为任意Object子类的对象
|
Map
| 保存键值对成员,基于键找值操作,compareTo或compare方法对键排序
| HashMap
| 能满足用户对Map的通用需求
| 键成员可为任意Object子类的对象,但如果覆盖了equals方法,同时注意修改hashCode方法。
|
TreeMap
| 支持对键有序地遍历,使用时建议先用HashMap增加和删除成员,最后从HashMap生成TreeMap;
附加实现了SortedMap接口,支持子Map等要求顺序的操作
| 键成员要求实现caparable接口,或者使用Comparator构造TreeMap。键成员一般为同一类型。
|
LinkedHashMap
| 保留键的插入顺序,用equals
方法检查键和值的相等性
| 成员可为任意Object子类的对象,但如果覆盖了equals方法,同时注意修改hashCode方法。
|
IdentityHashMap
| 使用== 来检查键和值的相等性。
| 成员使用的是严格相等
|
WeakHashMap
| 其行为依赖于垃圾回收线程,没有绝对理由则少用
|
|
总的说来,Java API中所用的集合类,都是实现了Collection接口,他的一个类继承结构如下:
{对API的组织架构图要非常地清楚才行!}
Collection<--List<--Vector
Collection<--List<--ArrayList
Collection<--List<--LinkedList
Collection<--Set<--HashSet
Collection<--Set<--HashSet<--LinkedHashSet
Collection<--Set<--SortedSet<--TreeSet
Vector
:
基于Array的List,其实就是封装了Array所不具备的一些功能方便我们使用,它不可能走入Array的限制。性能也就不可能超越Array。所
以,在可能的情况下,我们要多运用Array。另外很重要的一点就是Vector“sychronized”的,这个也是Vector和
ArrayList的唯一的区别。
ArrayList:同Vector一样是一个基于Array上的链表,但是不同的是ArrayList不是同步的。所以在性能上要比Vector优越一些,但是当运行到多线程环境中时,可需要自己在管理线程的同步问题。
LinkedList:LinkedList
不同于前面两种List,它不是基于Array的,所以不受Array性能的限制。它每一个节点(Node)都包含两方面的内容:1.节点本身的数据
(data);2.下一个节点的信息(nextNode)。所以当对LinkedList做添加,删除动作的时候就不用像基于Array的List一样,
必须进行大量的数据移动。只要更改nextNode的相关信息就可以实现了。这就是LinkedList的优势。
List总结:
1. 所有的List中只能容纳单个不同类型的对象组成的表,而不是Key-Value键值对。例如:[ tom,1,c ];
2. 所有的List中可以有相同的元素,例如Vector中可以有 [ tom,koo,too,koo ];
3. 所有的List中可以有null元素,例如[ tom,null,1 ];
4. 基于Array的List(Vector,ArrayList)适合查询,而LinkedList(链表)适合添加,删除操作。
HashSet:
虽然Set同List都实现了Collection接口,但是他们的实现方式却大不一样。List基本上都是以Array为基础。但是Set则是在
HashMap的基础上来实现的,这个就是Set和List的根本区别。HashSet的存储方式是把HashMap中的Key作为Set的对应存储项。
看看HashSet的add(Object obj)方法的实现就可以一目了然了。
public boolean add(Object obj)
{
return map.put(obj, PRESENT) == null;
}
这个也是为什么在Set中不能像在List中一样有重复的项的根本原因,因为HashMap的key是不能有重复的。
LinkedHashSet:HashSet的一个子类,一个链表。
TreeSet:SortedSet的子类,它不同于HashSet的根本就是TreeSet是有序的。它是通过SortedMap来实现的。
Set总结:
1. Set实现的基础是Map(HashMap);
2. Set中的元素是不能重复的,如果使用add(Object obj)方法添加已经存在的对象,则会覆盖前面的对象;
阅读(982) | 评论(0) | 转发(0) |