目录
概述
集合是一个放数据容器,它主要包括Collection接口类集合和Map接口类集合。
(1)集合只能存放对象,Java中每一种基本数据类型都有对应的引用类型。例如在集合中存储一个int型数据时,要先自动转换成Integer类后再存入;
(2)集合存放的是对对象的引用,对象本身还是存放在堆内存中;
(3)集合可以存放不同类型、不限数量的数据类型。
一、Collection接口
单列集合,集合中仅保存值。
1. List接口
特点:有序,允许值重复。
非线程安全类:ArrayList类、LinkedList类;
线程安全类:Vector类、Stack类、CopyOnWriteArrayList类。
1.1 ArrayList类
1.1.1 数据结构
ArrayList基于Object[ ]数组实现 ==> Object[ ] elementData
1.1.2 扩容方式
(1)初始化
public ArrayList():无参构造方法,将内部数组初始化为长度为0的空数组DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
public ArrayList(int initialCapacity):有参构造方法,按照指定容量initialCapacity进行数组初始化。
(2)扩容
1)如果数组默认为空数组,当第1次添加元素时,数组容量扩容为10;
2)如果当数组容量不足时,按照原容量的1.5倍进行扩容增长;
3)数组的最大容量在Integer.MAX_VALUE-8至Integer.MAX_VALUE之间,如果超出,则抛出OutOfMemoryError错误。
1.1.3 适用场景
ArrayList 适合数据连续性遍历,读多写少的场景。
1.1.4 常用方法
1.2 LinckedList类
1.2.1 数据结构
LinkedList是基于双向链表实现,链表中的每个节点都是一个Node类型的对象,Node对象由item、prev、next三部分组成。
1.2.2 扩容方式
由于采用链表结构,每次添加元素,都会创建新的Node节点并分配空间,所以不存在扩容。
1.2.3 适用场景
适合数据频繁添加删除操作,写多读少的场景。
1.2.4 常用方法
1.3 Vector类
线程安全:通过synchronized同步锁实现;性能较差;扩容方式:自定义扩容或扩容2倍。
1.4 Stack类
基于FILO先进后出实现的栈;继承自Vector类,所以也是线程安全的集合。
1.5 CopyOnWriteArrayList类
数据结构:基于数组Object[ ]实现;
线程安全:通过ReentrantLock实现COW读写分离思想,允许多个线程并发读取,但只能有一个线程写入。
2. Set接口
特点:无序,值唯一。
非线程安全类:HashSet类、LinkedHashSet类、TreeSet类;
线程安全类:CopyOnWriteArraySet类。
2.1 HashSet类
特点:无序;
数据结构:创建HashSet时,其构造方法创建维护了一个HashMap来进行存储,元素值保存在HashMap的key位置;
常用方法:
2.2 LinckedHashSet类
特点:有序;
数据结构:创建LinkedHashSet时,其构造方法调用父类构造方法,在内部创建维护了一个LinkedHashMap,用于维持元素的有序性。
2.3 TreeSet类
特点:排序;
数据结构:创建TreeSet时,其构造方法创建了一个TreeMap,用于保存元素。由于TreeMap可以自动排序,所以TreeSet中的元素也按照排序特点保存。
2.4 CopyOnWriteArraySet类
数据结构:CopyOnWriteArrayList<E> al ==> Object[ ];
线程安全:通过ReentrantLock实现COW读写分离思想,允许多个线程并发读取,但只能有一个线程写入。
3. Queue接口
特点:FIFO先进先出。
3.1 实现类
有界队列:ArrayBlockingQueue类,阻塞队列;
无界队列:LinkedBlockingQueue类,阻塞队列;
优先队列:PriorityQueue,基于小顶堆或大顶堆的实现优先队列,确保队头元素(根元素)是目前集合元素中的最小或最大元素。
3.2 子接口
子接口 ==> Deque接口
特点:双端队列,队头和队尾都能进行入队和出队操作;
实现类:LinkedList类。
3.3 常见方法
二、Map接口
关键特点:键值对集合,集合中按Key-Value键值对方式存储。
非线程安全类:HsahMap类、LinckedHashMap类、TreeMap类;
线程安全类:HashTabel类、ConcurrentHashMap类。
1. HashMap类
1.1 特点
无序、key唯一、value允许重复、key和value允许为null。
1.2 数据结构
1.3 扩容方式
1.4 常用方法
2. LinckedHashMap类
关键特点:键值对按照有序方式存储;
数据结构:在HashMap的基础上,多维护了一条双向链表,用于存储顺序。
3. TreeMap类
关键特点:按照key排序后存储;
数据结构:使用红黑树存储。
4. Hashtable类
关键特点:无序、key唯一、key和value不允许为null、线程安全;
数据结构:哈希表 = 数组 + 单向链表。
5. ConcurrentHashMap类
关键特点:无序、key唯一、key和value不允许为null、线程安全;
三、Collections类
集合算法工具类,封装了集合的常用功能算法。
常用方法: