Skip to content

集合

集合是我们日常开发中最常用的对象,集合是可以容纳 Java 对象的对象,便利、简单是它最大的优点

概念

当我们刚入门学习 Java 时,第一个接触的数据结构应该是数组,数组是存放一组相同类型对象的容器,然而我们学习数组时可以发现,元素的存取都不是通过数组自己的 API 实现,而是通过索引进行访问。

由于数组使用起来不方便,且只能表示一种线性序列的结构,所以 Java 推出了集合这一类数据结构,极大地降低数据操作难度,还带来了双列结构的集合,而且可以使用面向对象的方式进行开发,可以说是一次技术的革新!

Java 中的集合主要包含两大类:Collection 和 Map,引用一下网上大神集合的架构图~

Collection

Collection 是单列集合,也就是说集合中的一个空间只存储一个对象,比较有代表性的实现有Set、List、Queue

Set

特点:集合中的元素是唯一的

HashSet

Set 的常用实现类,基于哈希表实现,支持快速查找,但不支持有序性操作。并且失去了元素的插入顺序信息,也就是说使用 Iterator 遍历 HashSet 得到的结果是不确定的。

LinkedHashSet

除了具有 HashSet 的查找效率,并且内部使用双向链表维护元素的插入顺序

TreeSet

基于红黑树实现,支持有序性操作,例如根据一个范围查找元素的操作。但是查找效率不如 HashSet,HashSet 查找的时间复杂度为 O(1),TreeSet 则为 O(logN)。

List

有索引、有顺序的集合,允许存储重复的元素

ArrayList

基于数组及动态扩容的机制实现,允许随机访问。

LinkedList

基于双向链表实现,只能顺序访问,但可以方便地在集合中间增删元素。LinkedList 可以用作栈、队列的具体实现。

Vector

与 ArrayList 原理类似,但是是线程安全的。

Queue

Queue 接口定义了队列数据结构,元素是有序的(按插入顺序),先进先出

PriorityQueue

优先队列,底层使用数组实现了堆的结构。和普通的队列的 FIFO 特性不同,优先队列内部维护着一个堆,每次取数据的时候都从堆顶拿数据(堆顶的优先级最高)。每次集合中有数据添加或删除的时候都会对堆进行调整。

Deque

Deque (Double-ended queue) 是一个继承了 Queue 的子接口,可以创建双向队列,灵活性更强,可以前向或后向迭代,在队头队尾均可插入或删除元素。它的两个主要实现类是 ArrayDeque 和 LinkedList。

ArrayDeque

实现了 DeQueue 接口,双向队列,底层是用循环数组实现。虽然 Java 有提供栈的数据结构,但是开发中一般使用 ArrayDeque 进行栈功能的实现,更高效。

Map

Map 是双列集合,集合中一个空间存储着一个键值对(两个对象),比较有代表性的实现有HashMap

HashMap

基于一个哈希表来实现键值对的存储,但是元素是无序的。

LinkedHashMap

在 HashMap 的基础上,使用双向链表来维护元素的顺序,顺序为插入顺序或者最近最少使用(LRU)顺序。

HashTable

和 HashMap 的功能类似,但是是线程安全的。不过现在已经不推荐使用它了,因为它里面大部分方法都是使用了 synchronized 修饰,性能不高。推荐使用 ConcurrentHashMap 来支持线程安全,因为内部使用了分段锁,性能更高。

TreeMap

基于红黑树实现键值对的存储。