Java世界中,泛型和集合容器的存在大大的提高了程序员的编程能力,是开发者技能百宝箱中的重要武器之一,、因此掌握集合框架的实现原理及内部结构变得非常的重要。本文主要对集合框架体系中日常开发经常遇到的接口、抽象类及其实现类进行梳理,从宏观上去理解整个集合框架体系,具体实现类的源码实现原理分析在单独的博客中进行详述。
-
集合框架简图
Collection接口及其实现类
Collection:Collection接口代表存储一组独立元素序列的容器,其代表的容器主要有Set(无序无重复元素)、List(元素按添加的顺序存储,可重复)、Queue(按先进先出的顺序存储元素,多线程环境中常用作队列)。
Map接口及其实现类
Map:Map接口又称为关联数组其代表键值对的存储结构,代表的容器主要有HashMap(采用哈希存储,无序但查找性能最快)、TreeMap(有序,可自定义排序方式,查找性能逊色于HashMap)、LinkedHashMap(性能上在HashMap和TreeMap之间折中,内部使用链表结构存储,遍历时按插入顺序排序)。
-
常用容器类及接口分析
List
List可将元素维护在特定的序列中,其在Colletion接口的基础上添加了大量方法,使得可以在List中间添加或删除元素。List接口的实现类主要有ArrayList(底层基于数组)和LinkedList(底层基于双向链表),具体特性如下:
-
- ArrayList(随机访问元素性能较高、向指定位置添加元素需要移动元素,不适用于需要频繁添加或删除元素的场景)
- LinkedList(添加或删除元素性能较高、随机访问元素代价较高、特性集较ArrayList更为强大)
图示方法均继承自Collection接口,属于日常开发中常用方法,其中LinkedList同时实现了Deque接口(基于双端队列),相比ArrayList功能上更为强大,可用作栈(Stack)或队列(Queue).
Set
Set可确保添加元素的唯一性,不允许添加重复元素,其实现类主要有HashSet(底层基于HashTable)、LinkedHashSet(底层基于链表)、TreeSet(底层基于树结构),具体特性如下:
-
- HashSet(基于Hash存储,查找元素性能优良,应该作为Set实现类的默认选择)
- LinkedHashSet(具有HashSet查找元素的性能,内部使用链表维护元素有序性)
- TreeSet(底层基于树结构,该接口维护元素的有序性,默认按照自然顺序排序,也可以自定义排序规则,元素必须实现Comparable接口)
Queue
Queue是典型的先进先出(FIFO)容器,主要有LinkedList(基于链表)和Priority(优先级队列),具体特性如下:
-
- PriorityQueue(优先级队列,可定义排列顺序)
Map
Map是基于键值对的数据结构,可以用键来查找值,标准的Java类库中包含了Map的几种实现,包括:HashMap、TreeMap、LinkedHashMap、WeakHashMap、ConcurrentHashMap、IdentityHashMap,各自实现类的行为特性各不相同,主要表现在效率、键值对的保存及呈现次序、对象的保存周期、映射表如何在多线程程序中工作和判定“键”的等价等策略方面。
-
-
HashMap(基于Hash存储,查找元素性能优良,应该作为Map实现类的默认选择)
-
TreeMap(底层基于树结构,该接口维护元素的有序性,默认按照自然顺序排序,也可以自定义排序规则,元素必须实现Comparable接口)
-
LinkedHashMap(具有HashSet查找元素的性能,内部使用链表维护元素有序性)
-
HashMap是使用hashCode()进行快速查询的,此方法能够显著提升性能。
-
集合元素比较
如前所述,日常开发的许多场景都需要维护元素的有序性,对于Integer、String等基本类型可以采用默认自然排序,但对于对象排序,为了实现对象间的大小比较,通常采用实现Comparable接口和自定义比较器并实现Comparator接口2种方式,详细用法如下:
-
- 实现Comparable接口
采用这种方式非常接单,只要实现compareTo(T o)方法即可。
public int compareTo(T o);
-
- 自定义比较器并实现Comparator接口
int compare(T o1, T o2);
compareTo(T o)方法和compare(T o1,T o2)方法实现需要定义与目标对象的比较规则,方法返回0表示两对象相等;返回小于0表示当前对象小于目标对象;返回大于0表示大于目标对象。
-
Collection与Collections区别
java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。
java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架,Collection与Collectins看起来很像,其实有本质的区别,使用过程中要谨慎对待。
-
完整的容器分析方法
此图罗列了完整的集合框架图 ,日常开发掌握以上的容器实现类足够了,特定的类查阅官网API即可。
-
具体实现类源码分析
本文仅仅从宏观角度去分析了Java标准类库中集合框架常用接口及其实现类,具体更为细节的源码分析,将以系列文章的形式呈现,具体链接如下: