Java集合复习大作战
java 集合框架图
List
ArrayList
- 底层数据结构可变大小的数组。它允许所有元素,包括null。
- 有序
- 线程不安全
- 查询快,增删慢
- 可以重复元素
get() 直接读取第几个下标,复杂度 O(1)
add(E) 添加元素,直接在后面添加,复杂度O(1)
add(index, E) 添加元素,在第几个元素后面插入,后面的元素需要向后移动,复杂度O(n)
remove()删除元素,后面的元素需要逐个移动,复杂度O(n)
LinkedList
- 底层数据结构是双向链表,
- 线程不安全,
- 可以存储重复元素
- 查询慢,增删快
利用LinkedList实现栈(stack)、队列(queue)、双向队列(double-ended queue )。
它具有方法addFirst()、addLast()、getFirst()、getLast()、removeFirst()、removeLast()等
LinkedList 是链表的操作
get() 获取第几个元素,依次遍历,复杂度O(n)
add(E) 添加到末尾,复杂度O(1)
add(index, E) 添加第几个元素后,需要先查找到第几个元素,直接指针指向操作,复杂度O(n)
remove()删除元素,直接指针指向操作,复杂度O(1)
Vector
- 底层数据结构是数组
- 查询快,增删慢
- 线程安全,效率低
- 可以存储重复元素
Queue
Queue接口与List、Set同一级别,都是继承了Collection接口。LinkedList实现了Deque接口。
- ArrayBlockingQueue :一个由数组支持的有界队列。
- LinkedBlockingQueue :一个由链接节点支持的可选有界队列。
- PriorityBlockingQueue :一个由优先级堆支持的无界优先级队列。
- DelayQueue :一个由优先级堆支持的、基于时间的调度队列。
- SynchronousQueue :一个利用 BlockingQueue 接口的简单聚集(rendezvous)机制。
Set
元素无序的、不可重复
HashSet
hashSet是通过HasMap来实现的,HashMap的输入参数有Key、Value两个组成,在实现HashSet的时候,保持HashMap的Value为常量,相当于在HashMap中只对Key对象进行处理。
- 无序
- 存储唯一元素并允许空值
- 由HashMap支持
- 线程不安全的
TreeSet
- 底层红黑树
- 有序
- 不可重复
Map
HashMap
- 数组链表红黑树
- 无序
- 可重复可为null
- 线程不安全
hashMap存储流程
1.判断数组是否为空,为空进行初始化;
2.不为空,计算 k 的 hash 值,通过(n - 1) & hash计算应当存放在数组中的下标 index;
3.查看 table[index] 是否存在数据,没有数据就构造一个Node节点存放在 table[index] 中;
4.存在数据,说明发生了hash冲突(存在二个节点key的hash值一样), 继续判断key是否相等,相等,用新的value替换原数据(onlyIfAbsent为false);
5.如果不相等,判断当前节点类型是不是树型节点,如果是树型节点,创造树型节点插入红黑树中;
6.如果不是树型节点,创建普通Node加入链表中;判断链表长度是否大于 8, 大于的话链表转换为红黑树;
插入完成之后判断当前节点数是否大于阈值,如果大于开始扩容为原数组的
注意:加载因子越大节省内存但查找效率低,加载因子越小耗内存但查找效率高,系统默认加载因子为0.75,一般情况下我们是无需修改的。
TreeMap
- 底层数据结构是红黑树。
- 有序
TreeMap因为是通过红黑树实现,红黑树结构天然支持排序,默认情况下通过Key值的自然顺序进行排序;
红黑树规则特点:
节点分为红色或者黑色;
根节点必为黑色;
叶子节点都为黑色,且为null;
连接红色节点的两个子节点都为黑色(红黑树不会出现相邻的红色节点);
从任意节点出发,到其每个叶子节点的路径中包含相同数量的黑色节点;
新加入到红黑树的节点为红色节点;
红黑树自平衡基本操作:
变色:在不违反上述红黑树规则特点情况下,将红黑树某个node节点颜色由红变黑,或者由黑变红;
左旋:逆时针旋转两个节点,让一个节点被其右子节点取代,而该节点成为右子节点的左子节点
右旋:顺时针旋转两个节点,让一个节点被其左子节点取代,而该节点成为左子节点的右子节点
字 | 底层结构 | 初始值 | 扩容 | 是否有序 | 是否可重复 | 是否可存空值 |
---|---|---|---|---|---|---|
ArrayList | 数组 | 10 | jdk1.7 扩容1.5 | 是 | 是 | |
LinkedList | 双向链表 | 无 | 一直在前面或者后面新增 | 是 | 是 | |
Vector | 数组 | 10 | 1:当元素个数超过容量1倍 | 是 | 是 | |
HashMap | 散列表 | 16 | 元素个数 超过 容量长度的0.75倍 时,进行扩容原容量的 1 倍 | 否 | 否 | |
TreeMap | 红黑树 | 无 | 无 | 是 | key唯一,值随意 | |
HashTable | 散列表 | 11 | 两倍+1 | 否 | 否 | |
HashSet | hashMap | 16 | 同hashMap | 否 | 否 | |
TreeSet | TreeMap | 无 | 无 | 是 | 否 |