常用集合框架结构
- List
- ArrayList
List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括
null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于Vector 类,除了此类是不同步的。)
每个ArrayList 实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向 ArrayList 中不断添加元素,其容量也自动增长。并未指定增长策略的细节,在添加大量元素前,应用程序可以使用ensureCapacity 操作来增加ArrayList 实例的容量。这可以减少递增式再分配的数量。
注意,此实现不是同步的。如果多个线程同时访问一个
ArrayList 实例,而其中至少一个线程从结构上修改了列表,那么它必须 保持外部同步。(结构上的修改是指任何添加或删除一个或多个元素的操作,或者显式调整底层数组的大小;仅仅设置元素的值不是结构上的修改。)应该使用
Collections.synchronizedList 方法将该列表“包装”起来。这最好在创建时完成,以防止意外对列表进行不同步的访问:
List list = Collections.synchronizedList(new ArrayList(...));
LinkedList
List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括null)。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 get、remove 和insert 元素提供了统一的命名方法。LinkedList可以根据索引来访问集合中的元素,此外还实现了Deque接口,所以也可以当成双端队列来使用,即可当“栈”(先进后出),也可以当作队(先进先出);内部是以线性表和链表实现的,保证输入的顺序。通常用Iterator遍历。
注意,此实现不是同步的。如果多个线程同时访问一个链接列表,而其中至少一个线程从结构上修改了该列表,则它必须 保持外部同步。(结构修改指添加或删除一个或多个元素的任何操作;仅设置元素的值不是结构修改。)这一般通过对自然封装该列表的对象进行同步操作来完成。如果不存在这样的对象,则应该使用
Collections.synchronizedList 方法来“包装”该列表。
如下所示:
List list = Collections.synchronizedList(new LinkedList(...));
Set
HashSet
此类实现 Set 接口,由哈希表(实际上是一个
HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。
注意,此实现不是同步的。如果多个线程同时访问一个哈希 set,而其中至少一个线程修改了该 set,那么它必须 保持外部同步。这通常是通过对自然封装该 set 的对象执行同步操作来完成的。如果不存在这样的对象,则应该使用 Collections.synchronizedSet 方法来“包装” set。最好在创建时完成这一操作,以防止对该 set 进行意外的不同步访问:
Set s = Collections.synchronizedSet(new HashSet(...));
LinkedHashSet
具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。此实现与
HashSet 的不同之外在于,后者维护着一个运行于所有条目的双重链接列表。
同样,此实现不是同步的。需要
Set s = Collections.synchronizedSet(new LinkedHashSet(…));进行包装
TreeSet
此实现为基本操作(add、remove 和
contains)提供受保证的 log(n) 时间开销。
注意,此实现不是同步的。如果多个线程同时访问一个 TreeSet,而其中至少一个线程修改了该 set,那么它必须 外部同步。这一般是通过对自然封装该 set 的对象执行同步操作来完成的。如果不存在这样的对象,则应该使用 Collections.synchronizedSortedSet 方法HashMap线程不安全,允许null作为key,HashTable线程安全,但是古老少用,不允许null作为key。来“包装”该 set。此操作最好在创建时进行,以防止对 set 的意外非同步访问:
SortedSet s = Collections.synchronizedSortedSet(new TreeSet(…));
Map
HashMap
HashMap线程不安全,允许null作为key和Value,HashTable线程安全,但是古老少用,不允许null作为key。
最好在创建时完成这一操作,以防止对映射进行意外的非同步访问,如下所示:
Map m = Collections.synchronizedMap(new HashMap(...));