集合
集合是我们日常开发中最常用的对象,集合是可以容纳 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
基于红黑树实现键值对的存储。