Java集合框架整理

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.没有快速查询机制


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值