1.ArrayList:
1.原理:动态数组
2.初始容量:10
3.扩容:当由于增加数据导致容量不足时,容量会添加上一次容量大小的一半(0.5) 新的容量=“(原始容量x3)/2 + 1
4.线程不安全
5.拥有Iterator 迭代器进行遍历
2.CopyOnWriteArrayList
1.原理:动态数组
2.使用lock锁 线程安全
3.add操作时先将原数组复制一份得到新数组,在新数组中增加元素,再返回新数组。(读写分离思想)
4.基于此思想可以写一个copyOnWriteMap
5.如果你希望写入的的数据,马上能读到,请不要使用CopyOnWrite容器”,因为读的是老数组
3.Vector
1.原理:动态数组
2.初始容量:10
3.扩容:当由于增加数据导致容量不足时,容量会添加上一次容量大小的一倍(1) 新的容量=(oldCapacity * 2)
4.线程安全 使用synchronized锁保证线程安全
5.拥有Iterator 迭代器进行遍历 和Integer value = null;
Enumeration enu = vec.elements();
while (enu.hasMoreElements()) {
value = (Integer)enu.nextElement();
}
4.快速失败机制
fail-fast是如何产生的!
即,当多个线程对同一个集合进行操作的时候,某线程访问集合的过程中,该集合的内容被其他线程所改变(即其它线程通过add、remove、clear等方法,
改变了modCount的值);这时,就会抛出ConcurrentModificationException异常,产生fail-fast事件。
(在CopyOnWriteArrayList的迭代器中没有比较两个modCount
如果在ArrayList中不比较两个modCount也不会爆那个异常
所以报不报异常就看有没有比较modCount、因为这个异常是比较不一致以后人为主动扔出来的
首先我们要知道ArrayList比较的目的是什么?保证数据一致性啊
现在的问题是为什么CopyOnWriteArrayList可以不比较modCount也能保证数据一致性?
好了这个大招交给我吧
因为getArray()返回的array的类型是volatile的(强制内存一致性)O(∩_∩)O~)
5.LinkedList
1.原理:双向链表
2.无初始容量
3.线程不安全
4.插入,删除快,快速查询慢。
6.HashMap
1.原理:散列表,储存内容是(key-value)的映射 无序
实现原理:首先有一个每个元素都是链表(可能表述不准确)的数组,当添加一个元素(key-value)时,
就首先计算元素key的hash值,以此确定插入数组中的位置,但是可能存在同一hash值的元素已经被放在数组同一位置了,
这时就添加到同一hash值的元素的后面,他们在数组的同一位置,但是形成了链表,所以说数组存放的是链表。而当链表长度太长时,
链表就转换为红黑树,这样大大提高了查找的效率。
自己的话:hashMap的实现实际是一个存放链表的数组,通过将key的hashCode进行运算得到元素的hashCode,在数组中进行储存,
当元素的hashCode相同时,放在那一hashCode值的元素的链表中,当链表长度大于阀值8的时候转为红黑树。这样就提高了查询效率。
2.加载因子:0.75 是对物理及空间上的折中取值结果
3.默认初始容量1<<4(2的4次方),最大容量1<<30 容量昂均为2的幂次方 传入容量过大将被这个值替换
4.实现hashCode() key.hashCode~value.hashCode(异或运算)
因此有了哈希冲突哦,jdk1.8之前解决办法:将计算出来的hashCode放在单项链表中
(组的每个元素都是一个单链表的头节点,链表是用来解决冲突的,如果不同的key映射到了数组的同一位置处,就将其放入单链表中)
如果在一个链表中查找其中一个节点时,将会花费O(n)的查找时间,会有很大的性能损失
5.hash算法:(h = key.hashCode()) ^ (h >>> 16)
计算出在桶中的位置
6.在JDK1.8之前,HashMap采用数组+链表实现,JDK1.8中,HashMap采用数组+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间
7.Hashtable
1.散列表,,储存内容是(key-value)的映射 无序
2.初始容量11,加载因子0.75
3.线程安全 用synchronized同步
8.TreeMap
1.是一个(key-value)的有序集合,通过红黑树实现的
2.非线程同步 一般用于单线程中存储有序的映射
9.HashSet
1.无序集合
2.基于HashMap实现的
3.线程不安全
10.TreeSet
1.有序集合
2.基于TreeSet实现
3.线程不安全
4.没有快速查询机制
Java集合框架整理
最新推荐文章于 2024-06-30 22:42:34 发布