能够存储对象,可以获取,判断的就都可以叫集合(Collection)
![](https://i-blog.csdnimg.cn/blog_migrate/83b5e0c3a683ed941a323df12b2359aa.jpeg)
为了方便我们操作对象,java提供了一系列的api
boolean add(Object obj) //添加一个对象。
boolean addAll(Collection c) //将一个集合中的所有对象添加到此集合中。
void clear() //清空此集合中的所有对象。
boolean contains(Object o) //检查此集合中是否包含o对象。
boolean equals(Object o) //比较此集合是否与指定对象相等。
boolean isEmpty() //判断此集合是否为空。
boolean remove(Object o) //在此集合中移除单个对象。
boolean removeAll(Collection<?> c)//移除里面的c集合
boolean retainAll(Collection<?> c)//保留其中的c集合,相当取交集
int size() //返回此集合中的元素个数。
Object[] toArray() //将此集合转换成数组
Iterator<E> iterator()//迭代器
- 但是我们存储数据的需求是不一样的,在顺序,查询效率,修改效率等需求上
所以集合也为我们提供了不同的实现类,供我们去选择适合自己需求的数据结构
使用比较多的如下图,接下来要分析的就是不同实现类的特性,及原因。
![](https://i-blog.csdnimg.cn/blog_migrate/38c1d084b37c2ba1fa87d3597d2081a6.png)
List
顺序存储,有下标,元素可重复
ArrayList
特点:数组列表,底层维护数组,查询快,增删慢,线程不安全。
源码分析:
1:初始化
2:添加数据
private void ensureCapacityInternal(int minCapacity)
private static int calculateCapacity(Object[] elementData, int minCapacity) //容量计算
private void ensureExplicitCapacity(int minCapacity)
容量如果够的话,会直接 size+1 的位置添加元素 (由此可见arrayList是有序的)
private void grow(int minCapacity)
总结:
add()方法实现:
1:检查数组容量
足够 直接在后面添加
不够 扩容到之前 1.5倍 (如果大于integer最大值 会报 OutOfMemoryError)直接添加
Vector
底层也是数组,和ArrayList最大的差别就是 线程同步 是线程安全的。
扩容机制 :扩容一倍
LinkedList
底层数据结构是 双向链表 增删快,查询慢 线程不安全
LinkedList 源码较为简单,但是要理解双向链表的逻辑
简单来说 双向链表 就像 手拉手 左手 自己 右手 一边连着一个元素,这样串起来,
链表顾名思义 像链子一样 环环相扣
增删快 我们只要 在一个节点上把指向改变就好,挪动一个节点。
查询慢 需要从头开始查 一个节点 一个节点去找。
Set
特点:无序 无下标 元素不可重复
HashSet
存储结构:哈希表(数组+链表+红黑树) 允许元素为null 非线程安全
源码解读:
从构造方法可知 HashSet底层 是 HashMap 读懂hashSet 就相当于 读懂hashMap
从 hashSet 的 add()方法我们可以得出
hashSet.add(a) 相当于 hashMap.add(a,PRESENT);
hashMap key-value 键值对存储 key 是不可以重复的 这也是为什么 hashSet是不可以重复的表面原因 深层原因是 put值的时候 会有hash比较 和equals 方法 来判断
tatic final int hash(Object key)
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
boolean evict)
hashSet扩容机制:
table为空的时候 默认 16
负载因子 0.75 * 长度 当元素添加到12个的时候 进行扩容
链表元素个数到达 8 并且table大小>=64 就会进化为红黑树
链表元素到达8 table大小<64会先扩容table table*2
小结
内容太长,例如 hash值计算 技术选型 特点总结 会放在之后的文章来讲解。
文章中如果有出入的地方,欢迎评论区指出,一起讨论。