概述
一个集合,即collection,有时也被称为一个容器,是将多个元素聚集成一个单元的对象。Collections常被用来存储、检索、操纵聚集数据以及聚集数据间的通信。一般来说,Collections表示一组自然类群的数据项,比如一手扑克牌、一个信箱(由很多信件组成)或者电话簿(一组姓名到电话号码的映射)。 如果你熟悉Java语言或者任何一门其他编程语言,你可能已经对Collections比较熟悉了。
什么是集合框架?
一个集合框架是一个统一的构架,用于表示和操纵集合。所有集合框架都包含下面几项:
接口:即表示集合的抽象数据类型,ADT。接口使得在使用集合时不需要关注集合的实现细节。在面向对象语言中,接口一般会形成层次结构。
实现:集合接口的具体实现。实际上它们是可复用的数据结构。
算法:在实现集合接口的对象上进行的各种有意义的计算,如搜索、排序。实际上,算法是可复用的功能单元。
除了Java集合框架以外,其他有名的集合框架有C++ STL和Smalltalk语言的集合层次架构。历史上,集合框架因为他们相当复杂而具有相当陡峭的学习曲线,并因此而恶名昭著。Java集合框架则打破了这个传统。
使用Java集合框架的好处
Java集合框架提供了下面的好处:
减轻编程负担:集合框架通过提供有用的数据结构和算法,使得我们从底层算法中解脱出来而能更专注于代码逻辑。
提高编程效率和编程质量:Java集合框架提供了各种有用的数据结构算法的高性能、高质量实现。因为程序员从自己实现各种数据结构的艰苦工作中解放出来,因此有更多时间用来改善程序质量和程序性能。
允许互操作性
减少了学习和使用新API的负担
减少了设计新API的负担
促进软件复用:符合标准集合接口的新数据结构天生可复用。操作于实现集合接口的对象上的新算法亦然。
接口
核心集合接口封装了不同类型的集合,如下图所示。这些接口使得我们可以操作集合而不必关心它们的具体实现细节。核心集合接口是Java集合框架的基础。正如我们可以从下图看到的,核心集合接口形成了层次结构:
图1 核心集合接口
Set是一种特殊的集合,而一个SortedSet是一种特殊的Set,以此类推。注意上图的层次结构中包含两棵独立的树 — Map不是一个真正意义上的集合。
注意所有的核心集合接口都是泛型化的(generic)。例如下面是Collection接口的声明:
- public interface Collection<E>...
<E>语法告诉我们这个接口是泛型化的。当我们声明一个集合实例时,我们可以也必需指定集合中对象的类型。指定类型使得编译器能在编译时验证集合中的元素的类型都是正确的,从而减少运行时错误。如果想获取更多的关于泛型的信息,敬请参考Java Generic Turtorial 。
当你学会使用这些接口后,你就了解了Java集合框架中的大部分内容。本章讨论关于如何有效使用这些接口的一些建议,包括何时使用何种接口。我们也将学会每个接口的一些习惯用法。
为了保证核心集合接口的数量可控,Java平台没有为每一种集合类型的变种(如不可变集合、固定大小集合以及只可追加集合)都提供单独的接口。相反,每个集合接口上的修改操作都被设计成可选的,也就是某个集合接口的实现可能不会支持所有的修改操作。如果调用集合不支持的一个操作,将抛出UnsupportedOperationException。集合接口的实现必需用文档记录它支持哪些可选操作。
http://blog.youkuaiyun.com/zhoudaxia/article/details/27869981
https://zhidao.baidu.com/question/690821537522407564.html
1.常用集合框架结构
2. List
2.1 ArrayList
Collections.synchronizedList
方法将该列表“包装”起来。这最好在创建时完成,以防止意外对列表进行不同步的访问:
List list = Collections.synchronizedList(new ArrayList(...));
2.2 LinkedList
List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。LinkedList可以根据索引来访问集合中的元素,此外还实现了Deque接口,所以也可以当成双端队列来使用,即可当“栈”(先进后出),也可以当作队(先进先出);内部是以线性表和链表实现的,保证输入的顺序。通常用Iterator遍历。
Collections.synchronizedList
方法来“包装”该列表。
如下所示:
List list = Collections.synchronizedList(new LinkedList(...));
3. Set
3.1 HashSet
注意,此实现不是同步的。如果多个线程同时访问一个哈希 set,而其中至少一个线程修改了该 set,那么它必须 保持外部同步。这通常是通过对自然封装该 set 的对象执行同步操作来完成的。如果不存在这样的对象,则应该使用 Collections.synchronizedSet
方法来“包装” set。最好在创建时完成这一操作,以防止对该 set 进行意外的不同步访问:
Set s = Collections.synchronizedSet(new HashSet(...));
3.2 LinkedHashSet
add
、
remove
和
contains
)
提供受保证的 log(n) 时间开销。
注意,此实现不是同步的。如果多个线程同时访问一个 TreeSet,而其中至少一个线程修改了该 set,那么它必须外部同步。这一般是通过对自然封装该 set 的对象执行同步操作来完成的。如果不存在这样的对象,则应该使用Collections.synchronizedSortedSet
方法HashMap线程不安全,允许null作为key,HashTable线程安全,但是古老少用,不允许null作为key。来“包装”该 set。此操作最好在创建时进行,以防止对 set 的意外非同步访问:
SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...));
4. Map
4.1 HashMap
最好在创建时完成这一操作,以防止对映射进行意外的非同步访问,如下所示:
Map m = Collections.synchronizedMap(new HashMap(...));
-
http://blog.youkuaiyun.com/sdauzxl/article/details/52067042、
http://www.cnblogs.com/cathyqq/p/5279859.html
http://www.cnblogs.com/dashi/p/3597937.html