前言
很早之前就想梳理一下Java的集合框架了,而且也早早的把专栏申请了下来,但是却不知道从何处讲起,以何种方式梳理,网上的总是千篇一律,博主又希望能够站站在一个初学者的视角去详细展开Java的集合框架,就这样,种种原因使得博主迟迟未动手更新。虽然博主还是很忙,但博主还是决定从今天开始,在一到两个月的时间内将Java集合框架系列专栏完成。种一棵树最好的时间是十年前,其次是现在。望各位同学监督。
为什么会有Java集合框架?没有Java集合框架行不行?
当我们第一次接触Java的时候,老师肯定会告诉你,Java有两个超基类的接口,一个是Map,一个是Collection;Map是什么,Collection是什么;Map能干什么,Collection能干什么;Map有哪些实现,各个实现又有什么区别,Collection又有哪些实现,各个实现之间又有什么区别等等。没错,老师说的是对的。但是我们有没有问过自己:为什么会有Java集合框架?没有Java集合框架行不行?这两个问题很关键。为什么会有Java集合框架呢?
- 因为我们需要组织我们的数据,而组织数据的方式是多种多样的,这个就对应着数据结构,而Java集合框架就是组织数据结构的通用解决方式的框架,同时Java集合框架又为我们提供了许多的操作数据结构的各种各样的算法。所以,Java集合框架是Java提供的关于数据结构和算法的通用的解决方案和工具。
那没有Java集合框架行不行呢?
- 答案是肯定的。我们可以自己去写各种数据结构在Java中的实现,同时使用Java的语法去书写操作这些数据结构的算法。即使是现在你也可以这样去做,而且这个过程会使你受益颇丰。但是,为了开发方便和项目的可开发性,因为一个项目会不断迭代,参与进来的人一定走一批又来一批,不能你写的数据结构和算法工具其他人不知道,所以有必要定义一套统一的工具去囊括这些数据结构和算法,这样,Java集合框架就应运而生了。
官方怎么定义
What Is a Collections Framework?
A collections framework is a unified architecture for representing and manipulating collections. All collections frameworks contain the following:
- Interfaces: These are abstract data types that represent collections. Interfaces allow collections to be manipulated independently of the details of their representation. In object-oriented languages, interfaces generally form a hierarchy.
- Implementations: These are the concrete implementations of the collection interfaces. In essence, they are reusable data structures.
- Algorithms: These are the methods that perform useful computations, such as searching and sorting, on objects that implement collection interfaces. The algorithms are said to be polymorphic: that is, the same method can be used on many different implementations of the appropriate collection interface. In essence, algorithms are reusable functionality.
Java集合框架是用于表示和操纵集合的一个统一的架构。所有集合框架包含以下内容:
- 接口:表示集合的抽象数据类型。接口允许独立于其实现细节来操纵集合。
- 实现:集合接口的具体实现。实质上,它们是可重用的数据结构。
- 算法:对实现集合接口的对象执行计算(如搜索和排序)的方法。算法被认为是多态的:也就是说,相同的方法可以用在适当的集合接口的许多不同实现上。实质上,算法是可重用的功能。
一句话概括:接口定义数据类型,不同的集合实现类使用自己的方式实现接口定义的数据类型,同时在各个集合实现类中和一些公共工具类中提供了许多可以操作集合实现类的方法。
集合框架的组成
- 集合接口:表示不同类型的集合,这些接口构成了框架的基础,例如List、Set、Map、Queue、Deque等
- 接口实现
- 抽象实现:实现集合接口中的部分方法,方便自定义实现,更利于适配,例如:AbstractCollection、AbstractList、AbstractQueue等
- 通用的实现:集合接口的最常见的主要的实现,例如:PriorityQueue 、ArrayList、TreeMap等
- 遗留的实现:早期版本中遗留下来并被改进的集合实现类,例如:Vector、Hashtable等
- 特殊场景的实现:专为在特殊情况下使用而设计的实现,例如:EnumSet、WeakHashMap、CopyOnWriteArrayList 等
- 高并发情景下的实现:为高度并发使用而设计的实现,例如:ConcurrentLinkedQueue、ArrayBlockingQueue、ConcurrentHashMap等
- 包装实现:用于其他实现的功能增强实现,仅通过静态工厂方法访问,例如:通过Collections.synchronizedCollection返回一个具有同步功能的集合SynchronizedCollection
- 便利实现:集合接口的高性能“迷你实现”,例如:Arrays.asList()返回一个ArrayList(此ArrayList非彼ArrayList)、Collections.emptyList()返回一个EmptyList
- 算法:在集合上执行有用功能的静态方法,例如:sort(List) 、min(Collection) 等
- 基础架构:为集合接口提供必要支持的接口和类
- 迭代器
- Iterable:实现此接口的对象可以通过调用iterator()方法返回该对象的迭代器
- Iterator:对其next方法的连续调用返回该系列的连续元素。除此之外还允许用户使用定义良好且有用的语义从支持集合中删除元素
- ListIterator:用于列表的迭代器。除了 Iterator接口的功能外,还支持双向迭代,元素替换,元素插入和索引检索
- 排序
- Comparable:为实现它的类赋予自然顺序。自然排序可用于排序一个List、维护Set中的各个元素和Map中键的顺序
- Comparator:与Comparable很相似,它可以覆盖继承了Comparable接口的类的自然排序规则,同时可以对未实现 Comparable接口的类型的对象进行排序
- 运行异常
- UnsupportedOperationException:当对集合调用不支持的操作时会抛出该异常
- ConcurrentModificationException:如果在迭代进行过程中试图更改集合结构,则由迭代器抛出该异常
- 性能
- RandomAccess:它是一个标记接口,继承这个接口的List的实现类表明该实现支持快速随机访问。这使得通用算法可以更改其行为,以便在应用于随机或顺序访问列表时提供良好的性能。例如ArrayList就实现了该接口,而LinkedList则没有
- 迭代器
- 数组工具:用于基本类型和引用对象数组的实用工具,例如:Arrays
那些我们最熟悉的实现
接口 | 哈希表 | 可变长数组 | 平衡树 | 链表 | 哈希表 + 链表 |
---|---|---|---|---|---|
Set | HashSet | TreeSet | LinkedHashSet | ||
List | ArrayList | LinkedList | |||
Map | HashMap | TreeMap | LinkedHashMap | ||
Queue | ArrayBlockingQueue | LinkedBlockingDeque | |||
Deque | ArrayDeque | LinkedList |
以上除了Queue都是通用实现,它们支持集合接口中的所有可选操作(有些实现是可以声明不支持某些方法操作的),并且对它们可能包含的元素没有任何限制。它们是不同步的,但Collections类包含被称为同步包装器的静态工厂,可用于向许多未同步的集合添加同步(即将上面的集合转化为一个同步的集合)。这些通用实现都具有快速失败的迭代器(遇到异常直接抛出),它可以检测无效的并发修改,并且可以快速,干净地(而不是表现不正常)失败。
总结
以上是博主对于Java集合框架的一个概览和综述,其中一部分来自于博主的理解,一部分来自于官方的解释。后面博主将根据概览的描述,对整个集合框架进行展开描述。