![](https://i-blog.csdnimg.cn/blog_migrate/9b83d7d7eea911c9eaaba5e82faed603.png)
前言
排坑排到集合了,想看源码很久了,终于如愿以偿
@TOC
集合
架构体系
单列集合
双列集合
单列集合
List接口实现类
ArrayList
- Arraylist中维护了一个Object类型的数组(transient object[] elementData;// transient表示瞬间短暂的,表示该属性不会被序列化与反序列化)
- 当创建 ArrayList对象时,如果使用的是无参构造器,则初始容量为0,第1次添加,则扩容 elementData为10,如需要再次扩容,则扩容 elementData为1.5倍
- 如果使用的是指定大小的构造器,则初始 elementData容量为指定大小,如果需要扩容,则直接扩容 elementData为1.5倍。
Vector
-
Vector底层也是一个对象数组,protected Object[] elementData。
-
Vector是线程同步的,即线程安全, Vector类的操作方法带有 synchronized。
public synchronized E get(int index) {
if (index >= elementCount)
throw new ArraylndexOutofBoundsException (index);
return elementData(index)
}
- 在开发中,需要线程同步安全时,考虑使用 Vector。
LinkedList
- 实现双向链表和双端队列。
- 线程不安全
对比
底层结构 | 线程安全 | 效率 | 扩容倍数 | |
---|---|---|---|---|
ArrayList | 可变数组 | 不安全 | 查找O(1)效率高 | 1.5倍(初始容量默认为10) |
Vector | 可变数组 | 安全 | 查找O(1)效率低 | 2倍(初始容量默认为10) |
LinkedList | 双向链表 | 不安全 | 查找O(n),修改O(1) |
Set接口实现类
HashSet
-
不保证有序,顺序取决于Hash
-
底层是HashMap(HashMap底层是数组 + 链表 + 红黑树)
-
添加元素的实现原理(减少了Set中equals的次数,提高了效率)
- 获取hash值
- 遍历table,产看索引是否有元素
- 没有就加入
- 有,调用equals比较,相同放弃添加,不同添加到链表末尾
- Java8以后,链表长度大于等于8,会转换为红黑树
- 建议看源码
TreeSet
1. 二叉树算法实现的有序Set
LinkedHashSet
HashSet的链表实现
双列集合
Map接口实现类
HashMap
- 实现原理,见HashSet
- 非线程安全,如果需要满足线程安全,可以用 Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap。
TreeMap
- 可以排序
- 对其中的元素使用Comparable接口
- 自定义比较器Comparator
HashTable
- 线程安全
- key和value都不允许有null
ConcurrentHashMap
- 支持并发,原理是分段锁的实现(一个 Segment 数组,它的内部细分了若干个小的 HashMap)
Properties
- 继承自HashTable类并实现了Map接口,也是一种k-v行是保存数据
- 使用与hashtable类似
- 可以用于从.properties文件中加载数据到Propertis类对象并进行读取和修改
Collections工具类
常见方法
1)reverse(List) //反转List元素的顺序
2)shuffle(List) //对List集合元素进行随机排序
3)sort(List) //升序排序
4)sort(List, Comparator) //根据指定比较器排序
5)swap(List, int, int) //交换
小结
开发中如何选择集合的实现类
-
判断储存类型(一组对象【单列】,一组键值对【双列】)
-
单列
- 允许重复:List
- 修改多:LinkedList
- 查询多:ArrayList
- 不允许重复:Set
- 无序:HashSet(底层HashMap,维护数组 + 链表 + 红黑树)
- 有序:TreeSet
- 插入和取出顺序一致:LinkedHashSet(数组 + 双向链表)
- 允许重复:List
-
双列:Map
- 键无序:HashMap
- 键有序:TreeMap
- 出入一致:LinkedHashMap
- 读取文件参数:Properties