1、List、Set和Map
List是有序的,可重复的;
Set是无序的,不可重复的;
Map根据键值来存储数据,key是不可重复的,无序的;value是无序的,可重复的。
2、ArrayList、LinkedList和Vector
(1) ArrayList底层结构是Object数组,线程不安全,查询速度快,增删改指定位置速度慢,可通过下标直接访问,预留空间造成浪费。默认初始化大小为10,扩容为原数组大小的1.5倍。
(2) LinkedList,底层是双向链表(jdk1.6是循环链表,jdk1.7后取消循环),线程不安全,增删改查速度都相对较慢。无法高效的随机查询,每个节点都指向前后节点造成空间浪费。
(3)Vector,底层是Object数组,线程安全,大部分与ArrayList相似,在主要功能上加了关键字synchronized来实现同步(线程安全)。
注:RandomAccess 接口只是一个标识,标识这个类具有随机访问功能。是否具有随机访问功能并非与RandomAccess有直接关系,而是跟底层数据结构有关,数组支持随机访问,链表不支持。
3、HashMap、Hashtable和HashSet
HashMap | Hashtable | HashSet | |
线程是否安全 | 非线程安全 | 线程安全 | 非线程安全 |
效率 | 高 | 低 | 高 |
支持null | key和value都支持null | key和value都不支持null,否则抛NullPointerException | 允许null值 |
初始化大小 | 默认16 | 默认11 | 默认16 |
扩容 | >0.75时,扩容2倍 | >0.75时,扩容2倍+1 | >0.75时,扩容2倍 |
底层数据结构 | 数组+链表,jdk1.8后加了红黑树 | 数组+链表 | 用HashMap的 |
实现接口 | Map | Map | Set |
添加函数 | put() | put() | add() |
4、ConcurrentHashMap和Hashtable
ConcurrentHashMap | Hashtable | |
加锁方式 | jdk1.7每个数组 ReetrantLock分段锁(Segment ),jdk1.8 synchronized+CAS锁细化 | HashMap的关键方法上+synchronized |
底层结构 | jdk1.7 数组+链表;jdk1.8 数组+链表+红黑树 | 数组+链表 |
访问速度 | 快 | 慢 |
增删改速度 | 快 | 慢 |
5、HashSet、LinkedHashSet和TreeSet
HashSet | LinkedHashSet | TreeSet | |
实现接口 | Set | HashSet | Set |
底层 | HashMap | HashMap | 红黑树 |
查询方式 | 随机遍历 | 按添加顺序遍历 | 可按添加顺序遍历或自定义顺序遍历 |
排序方式 | 随机排序 | 按添加顺序排序 | 自然排序和定制排序 |
特点 | 无序,唯一,线程不安全 | 有序,唯一,线程不安全 | 有序,唯一,线程不安全 |