一、单列集合:Collection
1.List
有序可重复
1)ArrayLIst
允许添加所有元素,包括null,可以多个null;以数组来实现存储结构;线程不安全,随机查询效率高;尾部增删效率高,其他增删效率低。
- transient Object[] elementData;
- 此属性为数据缓冲区,缓冲区的大小就是ArrayList的容量。
- 主要依赖此属性对数据进行操作。
- 番外:transient 瞬时的、短暂的,此关键字描述的属性不参与序列化。
- 构造器
- public ArrayList() 无参构造器,会将elementData属性赋值为空数组;
- public ArrayList(int initialCapacity) 带初始容量的构造器,将elementData属性赋值为已传入参数为容量的Object数组,参数必须大于或等于0;
- public ArrayList(Collection<? extends E> c),将c的内容拷贝到elementData中。
- ArrayList 扩容机制
- 初始容量
- new ArrayList(),初始容量为0。
- new ArrayList(initialCapacity),初始容量为 initialCapacity,initialCapacity 为 int。
- new ArrayList(c),初始容量为 c.size(),c为Collection<? extends E>类型。
- 扩容
- 如果原数组elementData容量不够用,进行扩容。
- 如果原容量为0,直接扩容至10。
- 如果原容量大于0,扩容至原容量的1.5倍,即 原容量 + (原容量 / 2)。
- 最大容量为Integer.MAX_VALUE,即 2147483647(2³¹-1)。
- 初始容量
2)Vector
允许添加所有元素,包括null,可以多个null;以数组来实现存储结构;线程同步的,即线程安全的,Vector公开的方法基本都用synchronized来修饰的
- protected Object[] elementData;
- 此属性为数据缓冲区,此属性的长度就是Vector的容量,以此来操作数据
- 构造器
- public Vector();
- 初始容量为10,默认扩容机制。
- public Vector(int initialCapacity);
- 初始容量为 initialCapacity ,默认扩容机制。
- public Vector(int initialCapacity, int capacityIncrement);
- 初始容量为 initialCapacity,扩容机制为 capacityIncrement。
- public Vector();
- 扩容机制
- 原数组elementData容量不够用,进行扩容。
- protected int capacityIncrement;
- 此属性为Vector的扩容机制
- 当扩容机制为0时,翻倍扩容,即 原容量 + 原容量
- 当扩容机制不为0时,增量为扩容机制,即 原容量 + 扩容机制(capacityIncrement)
3)LinkedList
允许添加所有元素,包括null,可以多个null;以双向链表来实现存储结构;线程不安全的,随机查询效率低;头尾增删效率高,其他增删效率低。
2.set
不可重复
1)HashSet
底层以HashMap实现;无法保证取出的顺序与添加的顺序一致;无法通过索引获取;线程不安全;可以存null(只能有一个)
① LinkedHashSet
继承HashSet,实现Set;底层以LinkedHashMap实现;取出的顺序添加时的顺序一致;线程不安全的;可以存null
2)TreeSet
底层以红黑树实现;
二、双列集合(一般为键值对形式):Map
1.HashMap
底层以数组+链表+红黑树实现
- 扩容机制
- 默认情况(使用无参构造器创建HashMap):添加第一个元素时,初始table容量为16,扩容阈值为12(当HashMap内的元素个数超过12时,进行扩容)
- 扩容因子:默认0.75(可以在使用构造器HashMap(int initialCapacity, float loadFactor)指定扩容因子);用于计算扩容阈值,table容量 * 扩容因子;如table容量为16,扩容因子为0.75,扩容阈值为16 * 0.75=12.
- 当某一条链表的元素达到8个时,如果table的容量大于等于64,进行红黑树树化,否则对table进行扩容
- 当HashMap的元素个数超过了扩容阈值,对table进行扩容
- table扩容:原容量 << 1(原容量*2)
- 树的退化
- 扩容时,如果发生的树的拆分,当树的元素个数<=6时退化为链表
- 删除树结点时,如果根结点、根结点的左子结点、根结点的右子结点、根结点的左子结点的左子结点当中有一个节点为null,退化为链表
1)LinkedHashMap
继承HashMap实现Map;底层以数组+双向链表实现
2.TreeMap
3.Hashtable
1)Properties