集合类存放在 java.util 中,主要有三种:Set、List、Map
Collection:是List、Set、Queue的最基础接口。
Iterator:迭代器,可以通过迭代器遍历集合中的数据
Map:映射表的基础接口
-
List
- ArrayList:
- 特点: 有序、可重复、查询速度快、更新速度慢
- 底层实现: 数组
- 线程安全性: 线程不安全
- 扩容机制: 当容量不足时扩充当前容量的1.5倍
- Vector:
- 特点: 有序、可重复、查询速度快、更新速度慢
- 底层实现: 数组
- 线程安全性: 线程安全(线程同步,只有获得同步锁的线程才能写Vector)
- 扩容机制: 当容量不足时扩充当前容量的1倍
- LinkedList
- 特点: 有序、可重复、查询速度慢、更新速度快
- 底层实现: 链表
- 线程安全性: 线程不安全
- 区别: 专门定义了操作表头和表尾的元素,可实现堆、栈、队列和双向队列的功能。
- ArrayList:
-
Set
- HashSet:
- 特点: 无序、不可重复、存取速度快
- 底层实现: Hash表
- 存储特点: 根据hashCode判断是否为同一对象
- 解决hash冲突的方法: 若hashCode相同,则采用拉链法;若hashCode不同,则采用hash表顺延的方式,直到有空位置
- TreeSet:
- 特点: 有序、不可重复、存取速度快
- 底层实现: 排序二叉树
- 存储对象的排序特点: Integer和String对象采用默认的排序规则,自定义对象必须实现
Comparable
接口,并且覆写compareTo()
才能进行排序。
- LinkedHashSet:
- 特点: 无序、不可重复、存取速度快
- 底层实现: hash表+双向队列
- 结构特点: 基于LinkedHashMap的HashSet接口,LinkedHashMap存储数据,操作方法上继承了HashSet。
- HashSet:
-
Queue
- 特点: 无序、可重复、存取速度快
- 底层实现: 数组或链表
-
Map
- HashMap:
- 特点: key-value映射、key和value允许null值
- 底层实现: 数组+链表+红黑树(JDK 1.8引入)、数组+链表(JDK 1.7引入)
- 线程安全性: 线程不安全
- 结构特点: 一个hash表,元素是Entry链表,Entry对象包含四个属性:key、value、hashCode、nextNode
- capacity: 当前数组容量,始终保持2^n,每次扩容为当前数组的一倍。
- loadFactor: 负载因子,默认为0.75
- threshold: 扩容阈值,等于 capacity * loadFactor
- 链表与红黑树的转换机制: 当链表元素数为8个或以上,则自动将链表转换为红黑树;当树节点少于8个,则自动转换为链表进行存储。
- Hashtable:
- 特点: key-value映射、key唯一、value可重复
- 底层实现: hash表存储键值对
- 线程安全性: 线程安全(采用线程同步锁的方式保证线程安全)
- TreeTable:
- 特点: key-value映射,默认按照键排序,可指定比较器进行排序
- 底层实现: 二叉树
- LinkedHashMap
- **特点:**按照添加顺序进行存储
- ConcurrentHashMap
- 特点: 并发存储数据
- 线程安全性: 线程安全(采用分段锁Segment,分段锁继承重入锁ReentranLock特点)
- 结构特点: 整个Map是由Segment组成的,每次线程操作该map时,都只是操作一个segment,其它segment不受其影响。
- concurrencyLevel: 并行级别,默认为16,初始化后不可扩容,是该Map组成的segment数,可同时支持16个线程并发写
- Java 8 的并发Map: 引入了红黑树,主要是针对每个segment存储的HashMap进行改进。
- HashMap: