• List与Map整理


    ArrayList
    线程:不安全
    实现方式:数组
    初始大小:10
    扩容:(原数组容量+原数组容量/2),如果(原数组容量+原数组容量/2)<传入的minCapacity,则扩容到minCapacity
    数组最大值:Integer.MAX_VALUE - 8,由于有一些vms会在数组头存储一些字,为了防止内存溢出所以数组最大值为Max-8
    fast-fail:迭代器实现了fast-fail截止,防止在迭代过程中修改集合导致并发问题,通过判断List中的mod修改次数,与迭代器初始化的mod修改次数做比较,如果不相同则抛出concurrentModificationException,迭代器类下remove与next方法会检查fast-fail快速失败错误
    排序:原来使用归并排序方法,最新使用插入排序优化后的归并排序
     
    CopyOnWriteArrayList
    线程:安全,ReentrantLock,对数组进行修改时,把当前对象的数组拷贝一份newElements,先对newElements进行操作,操作完再复制给对象的数组,减少对查询类操作的锁定
    实现方式:数组,数组使用volatile修饰,每次getArray方法都能获得最后一修改后的数组
    初始化大小:0
    扩容:添加元素时,都是通过Arrays.copyOf()方法新创建一个长度等于(当前长度+1)的新数组
    迭代器:使用COWIterator内部类,遍历时直接访问CopyOnWriteArrayList的数组,可以实时获得数组的最新值
    readObject方法:从一个流中反序列化集合时,会重新初始化锁,UNSAFE.putObjectVolatile(this, lockOffset, new ReentrantLock());
     
    LinkedList
    线程:不安全
    实现方式:单向链表,定义了head与tail节点,
    初始大小:0,初始化时head与tail都是Null
    peek():查看head节点信息
    poll():获得head信息,并且从链表中删除掉
    offer(E e):添加到tail节点后
    fast-fail:迭代器实现了fast-fail截止,防止在迭代过程中修改集合导致并发问题,通过判断List中的mod修改次数,与迭代器初始化的mod修改次数做比较,如果不相同则抛出concurrentModificationException,迭代器类下remove与next方法会检查fast-fail快速失败错误
    1、定了first头节点(first.pre=null && first.item != null)、last尾节点(last.next=null && last.item != null)
    2、clear()清空链表,设置first=last=null,每个节点值设置为null,每个节点next以及每个节点pre设置为null,
    3、Node<E> node(int index)获得index位置的节点Node,技巧:先判断index是在size/2之前还是之后,减少一半的查询次数
     
    Vector
    线程:安全,通过synchronized实现
    实现方式:数组
    初始大小:10
    扩容:如果capacityIncrement=0,原数组容量*2,否则新容量为原数组容量+capacityIncrement,然后通过Arrays.copyOf()新建数组复制给原有的数组引用
    数组最大值:Integer.MAX_VALUE - 8,由于有一些vms会在数组头存储一些字,为了防止内存溢出所以数组最大值为Max-8
    fast-fail:迭代器实现了fast-fail截止,防止在迭代过程中修改集合导致并发问题,通过判断List中的mod修改次数,与迭代器初始化的mod修改次数做比较,如果不相同则抛出concurrentModificationException,迭代器类下remove与next方法会检查fast-fail快速失败错误
     
     
    Stack
    线程:安全,通过synchronized实现
    实现方式:数组,通过继承Vector实现主要功能
    初始大小:10
    peek():查看栈顶信息(不删除)
     
     
    HashMap
    线程:不安全
    实现方式:JDK1.8开始,链地址法(数组+单向链表),如果单向链表数量大于阈值8,则使用红黑树方式保存(红黑树优点是查询效率高,O(NlogN));如果单向链表数量小于8则使用链表保存。
    初始大小:16
    扩容:原数组长度*2
     
     
    Hashtable
    key、value不能为空
    线程:安全,通过synchronized实现
    实现方式:链地址法(数组+单向链表)
    初始大小:11
     
    TreeMap
    线程:安全,通过synchronized实现
    实现方式:红黑树
     
    ConcurrentHashMap
    线程:安全,通过compareAndSwapObject+synchronized方式,自旋+synchronized方式保证线程安全。
    实现方式:链地址法(数组+单向链表),数组使用volatile修饰(volatile Node<K,V>[] table),数组大小为2的倍数,如果单向链表数量大于阈值8,则使用红黑树方式保存(红黑树优点是查询效率高,O(NlogN));如果单向链表数量小于8则使用链表保存。
    初始大小:16
    迭代器:直接访问数组
     
    HashSet
    线程:不安全
    实现方式:使用HashMap实现的
    初始大小:16
    扩容:原数组长度*2
     
    收藏文章数量从多到少与“把书读薄”是一个道理
  • 相关阅读:
    回流和重绘
    php 异常捕获的坑
    每周散记 20180806
    转: Linux mount/unmount命令
    python http 请求 响应 post表单提交
    每周散记 20180723
    优惠劵产品分析
    c++ 软件版本比较函数
    每周散记
    转: 系统问题排查思路
  • 原文地址:https://www.cnblogs.com/use-D/p/9717668.html
Copyright © 2020-2023  润新知