一、什么是集合
- 概念:对象的容器,定义了对多个对象进行操作的常用方法。可实现数组的功能
- 和数组的区别- 1、数组的长度是固定的,集合长度不固定
- 2、数组可以存储基本数据类型和引用类型。集合只能存储引用类型
 
二、Collections集合

2.1 Collection是一个接口,是高度抽象出来的集合,它包含了集合的基本操作和属性。
Collection包含了List和Set两大分支

- (01) List是一个有序的队列,每一个元素都有它的索引。第一个元素的索引值是0。 - List的实现类有LinkedList, ArrayList, Vector, Stack。 
- (02) Set是一个不允许有重复元素的集合。 - Set的实现类有HastSet和TreeSet。HashSet依赖于HashMap,它实际上是通过HashMap实现的;TreeSet依赖于TreeMap,它实际上是通过TreeMap实现的。 
三 、List接口
- 特点:有序、有下标、元素可以重复
- 左移n位就相当于乘以2的n次方
- 右移n位相当于除以2的n次方
1、ArrayList
- 数组接口实现、查询快、增删慢 
- jdk1.2版本,运行效率快、线程不安全 - 源码分析部分
- 默认容量大小为 DEFAULT_CAPACITY = 10 
- 注意:如果集合中未添加元素,容量为0 
- emementData 存放元素 
- size 元素大小 
- 默认大小为10 一次扩容后变为原来的1.5倍 - 1 
 2
 3
 4
 5
 6- public boolean add(E e) { 
 //size默认0
 ensureCapacityInternal(size + 1); // Increments modCount!!
 elementData[size++] = e;
 return true;
 }
| 1 | private void ensureCapacityInternal(int minCapacity) { | 
| 1 | private void ensureExplicitCapacity(int minCapacity) { | 
| 1 | private void grow(int minCapacity) { | 
2、LinkedList
- 链表结构实现、查询慢,增删快 
- 双向链表 - 源码分析部分- 1 
 2
 3
 4
 5- //添加元素 
 public boolean add(E e) {
 linkLast(e);
 return true;
 }- 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14- /** 
 * Links e as last element.
 */
 void linkLast(E e) {
 final Node<E> l = last;
 final Node<E> newNode = new Node<>(l, e, null);
 last = newNode;
 if (l == null)
 first = newNode;
 else
 l.next = newNode;
 size++;
 modCount++;
 }
3、Vector
- 数组结构实现、查询快、增删慢
- JDK1.0出现,运行效率慢,线程安全
四、Set 集合
- 特点:无序、无下标、元素不可重复
1、HashSet
- 基于hashCode计算元素位置 
- 当存放的元素哈希码相同时,会调用equals进行确认,如果为true,则拒绝后者存入 
- 存储结构为哈希表(数组+链表+红黑树) - 存储过程 - 1、根据hashCode计算保存的位置,如果此位置为空,直接保存
- 2、在执行equal方法,如果equals方法为true,则认为重复,否则形成链表
- 重写了hashCode方法,一定要重写equals方法
 
2、TreeSet
- 基于排序顺序实现元素不重复 
- 实现了sortedSet接口,对集合元素自动排序 
- 元素对象类型必须实现comparable接口,指定排序规则 
- 基于红黑树 - 存储结构 - 红黑树
 
五、Map
1、HashMap
- 基于哈希表实现(数组+链表+红黑树) 
- 线程不安全,运行效率快;允许为key value为null - 哈希map源码分析 - 1、刚创建时是null,添加元素后,默认初始容量 16 
- 2、默认加载因子0.75 (每次扩容为原来的2倍(目的是减少调整元素的个数),在什么时候扩容,当容量达到16*0.75时,扩容) 
- 3、jdk1.8 如果数组的大小>=64 且链表的长度大于8,则会把链表转成红黑树 
- 4、jdk1.8 当树的节点数小于6时,转为链表结构 
- 5、jdk1.8 以前,链表是头插入 1.8以后是尾插入 
 
2、HashTable
- 线程安全,运行效率低;不允许key和value为null
- 默认容量11 加载因子0.75
3、TreeMap
- 实现了SortedMap接口(是Map的子接口),可以对key自动排序
- 基于红黑树实现的
 
         
              