外观
Java 常用数据结构有哪些
Collection
: 是所有单列集合的根接口,继承 Iterable
,支持迭代访问,主要包含 List
,set
,queue
List
继承自Collection
接口,代表有序的可重复的数据列表。常见的实现类有ArrayList
、LinkedList
、Vector
、Stack
ArrayList
是容量可变的非线程安全列表,其底层使用数组实现。当发生扩容时,会创建更大的数组,并把原数组复制到新数组。ArrayList支持对元素的快速随机访问,但插入与删除速度很慢。LinkedList
本质是一个双向链表,与ArrayList
相比,其插入和删除速度更快,但随机访问速度更慢。Vector
与ArrayList
类似,底层也是基于数组实现,特点是线程安全,但效率相对较低,因为其方法大多被synchronized
修饰Stack
表示后进先出的数据结构。它继承自Vector
,因此它也是一个线程安全的动态数组
Set
代表无序的不重复的数据集合。其实现类主要包括HashSet
、TreeSet
、LinkedHashSet
HashSet
通过HashMap
实现,HashMap
的Key
即HashSet
存储的元素,所有Key
都是用相同的Value
,一个名为PRESENT
的Object
类型常量。使用Key
保证元素唯一性,但不保证有序性。由于HashSet
是HashMap
实现的,因此线程不安全。LinkedHashSet
继承自HashSet
,通过LinkedHashMap
实现,使用双向链表维护元素插入顺序。TreeSet
通过TreeMap
实现的,添加元素到集合时按照比较规则将其插入合适的位置,保证插入后的集合仍然有序。
Queue
表示一种先进先出的数据队列。其实现类还要Deque
Map
: 与 Collection
接口并列,代表的是 key-value
类型的映射表,常见的实现类有 HashMap
、TreeMap
、LinkedHashMap
HashMap
:JDK1.8
之前HashMap
由数组+链表组成的,数组是HashMap
的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突),JDK1.8
以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8
)时,将链表转化为红黑树,以减少搜索时间LinkedHashMap
:LinkedHashMap
继承自HashMap
,所以它的底层仍然是基于拉链式散列结构即由数组和链表或红黑树组成。另外,LinkedHashMap
在上面结构的基础上,增加了一条双向链表,使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的操作,实现了访问顺序相关逻辑。HashTable
:数组+链表组成的,数组是HashMap
的主体,链表则是主要为了解决哈希冲突而存在的TreeMap
:红黑树(自平衡的排序二叉树)ConcurrentHashMap
:Node
数组+链表+红黑树实现,线程安全的