在Java中,我们经常听到Collections框架、Collection类以及Collections类。这三者名字相似,但是从概念上讲却是不同的。Collections框架泛指Java中用于存储和操作集合的类库总和,其中包括了List、Set和Map等。但是在具体实现上,由于Map中装的是Key-Value的键值对元素,其接口形式和其他(比如List)接口不一样,因此在Java中Map被区分对待了。总的来看,位于Java Collections框架中最顶层的接口有两个,Collection类和Map类,此时整个Java Collections框架的类层级如下:
Java中存在不少泛化的方法能够直接对Collection接口进行操作,而不用关心具体的实现类是什么,比如在查找一个集合中的最大值元素的时候——即实现一个max()方法,此时我们并不需要知道这个集合具体的实现类是ArrayList还是HashSet,而只需要知道这是一个Collection集合即可。另外,这个max()方法对于所有具体实现类来说其实原理是一样的,因此没有必要让每一个集合实现类自己再去实现一份。基于此,Java引入了一个Collections工具类来辅助实现这些方法,比如操作集合和创建集合等。由于名字和Collection相似,Collections通常给程序员们带来误解,这一点需要注意。当然,Java 8中引入了“默认方法”(Default Method)的技术,使得理论上诸如max()这样的方法可以直接实现在Collection接口上。
集合类的选用
在平时开发中,程序员们使用最多了莫过于ArrayList、HashSet和HashMap了。在多数情况下,这三个实现类已经能够满足我们的大部分需求,但是如果稍加分析我们可能会发现另外一些集合实现类能更好的满足我们的需要。比如,当你需要一个有顺序的Set时,可以考虑选用LinkedHashSet而不是HashSet。关于集合类是选用,可以参考下图:
equals()和hashCode()方法