• Java集合类汇总记录--JDK篇


    接口类图

    Java Collection由两套并行的接口组成,一套是Collection接口,一套是Map接口。例如以下图


    公共抽象类AbstractCollection

    要求派生类实现iterator()方法,AbstractCollection依据得到的Iterator实现全部能够支持的方法,比方remove()、contains()、toArray()、toString()等。

    当然,Map系列的类并不从AbstractCollection派生。


    List实现



    AbstractList

    要求子类实现get(int)和size()方法,AbstractList利用这两个模板方法,实现出完整的仅仅读List。

    ArrayList

    利用Object[]实现的List。

    AbstractSequentialList

    利用ListIterator接口,实现get(index)、set(index)、remove(index)、add(index, value)等随机訪问的方法。

    LinkedList

    单向链表。以下是链表中每一个节点的定义:

        privatestaticclass Node<E> {

            E item;

            Node<E> next;

            Node<E> prev;

        }

    Vector

    线程安全的List,採用synchronized(this)进行加锁。内部採用Object[]实现。

    Stack

    对Vector进行的简单封装。

    CopyOnWriteArrayList

    注意此类直接从Object派生。

    线程安全。每一个add、set等改动操作。都会导致对内部数组进行全新复制。Iterator()函数返回的迭代器对象,包括了当前array的一个快照。因此,对CopyOnWriteArrayList对象的改动,不会影响已经生成的迭代器对象,仅仅是迭代器对象看到的快照有可能是过时的。


    Queue实现

    ArrayDeque

    用环形数组实现的Deque。自己主动增长数组大小。

    不能接受null元素。

    非线程安全。

    AbstractQueue

    抽象类。利用模板函数实现了几个功能,比方addAll()

    ConcurrentLinkedQueue

    线程安全。

    但这仅仅是表示并发操作不会破坏内部结构,可是toArray()、迭代器、addAll()等操作不是原子的。

    不能接受null元素。

    用单向链表实现。

    使用了非JDK类sun.misc.Unsafe。

    PriorityQueue

    优先队列。利用优先堆实现。

    非线程安全。

    增加的元素必须支持全排序。

    不能接受null元素。

    DelayQueue

    实现的时候用到了PriorityQueue。

    非线程安全。

    支持Blocking操作。

    能够用于连接超时自己主动移除、缓存超时自己主动移除等场景。

    注意事项:假定DelayQueue中的元素类型为T。

    1.        T.getDelay()应该返回超时值

    2.        T必须能够全排序

    3.        T最好是依据超时值进行全排序。而且全排序一旦排好,比較结果不应该随着Delay值变化而变化。

    SynchronousQueue

    线程安全。

    不接收null元素。

    特点是put和take函数必须同一时候运行。才干所有返回;不论什么一个单独运行仅仅会导致等待。

    PriorityBlockingQueue

    带有Blocking功能的优先队列。

    LinkedBlockingQueue

    带有Blocking功能的Queue

    用单向链表实现。

    创建的时候能够指定容量,没有指定容量就是Integer.MaxValue。容量在创建后不能改动。

    已满状态运行put会导致等待。

    为空状态下运行take会导致等待。

    ArrayBlockingQueue

    带有Blocking功能的Queue

    用Array实现。

    创建的时候必须指定容量。而且创建后不能改动。

    已满状态运行put会导致等待。

    为空状态下运行take会导致等待。


    Set实现


    AbstractSet

    抽象基类。通过Iterator实现几个通用方法。

    HashSet

    内部包括了一个HashMap对象。

    向HashSet中加入一个元素X,相当于向HashMap对象加入一个<X,DummyObject>二元组。

    非线程安全。

    接收null元素。

    LinkedHashSet

    内部包括了一个LinkedHashMap对象。

    非线程安全。

    接收null元素。

    採用Iterator迭代的时候。依据元素加入的顺序排序。

    TreeSet

    内部包括了一个TreeMap对象。

    向TreeSet中加入一个元素X,相当于向TreeMap对象加入一个<X,DummyObject>二元组。

    非线程安全。

    不接受null元素。

    ConcurrentSkipListSet

    内部包括了一个ConcurentSkipListMap。

    线程安全。

    不接收null元素。

    CopyOnWriteArraySet

    内部包括了一个CopyOnWriteArrayList做实际的数据存储,因此这实际上是一个Array。


    Map实现

    AbstractMap

    抽象类。利用entrySet()模板方法实现了一些通用方法。

    HashMap

    哈希表

    Key和Value都能够为null。

    非线程安全。

    LinkedHashMap

    从HashMap派生,整个哈希结构都是利用了HashMap来实现

    每一个插入的Value。都通过一个双向链表连接起来。

    能够指定链表的顺序是依照插入时间排序、还是依照訪问时间排序。

    假设是依照訪问时间排序,每次訪问都要调整链表。

    TreeMap

    基于红黑树实现的Map。

    非线程安全。

    ConcurrentHashTable

    基于哈希表实现。

    构造函数中能够指定并发程度,也就是预期有多少更新线程。

    ConcurrentSkiptListMap

    支持并发的跳跃表

    IdentityHashMap

    哈希表

    内部採用==推断key的相等性。

    EnumMap

    接收Key为Enum类型的Map。

    内部用数组来存储Value,即Value == this.Vals[Key.ordinal]。效率高。

    WeakHashMap

    每一个Key用WeakReference管理。当Key对象符合弱引用的回收条件时。就被回收。

    Size()方法返回的是还没有被回收的Key对象的数量。

    假设Key已经被回收,get方法放回null。

    利用哈希表实现。

    实现上,每一个<Key,Value>相应一个Entry。每一个Entry都是WeakReference的派生类对象。该Entry对象也就是Key的WeakReference。

     

    集合类的区分因素

    1.        支持哪些操作接口

    2.        内部实现的数据结构。及其对应的时空复杂度

    3.        是否对插入元素的数量有限制

    4.        是否支持插入null元素

    5.        是否线程安全

    6.        是否支持堵塞





  • 相关阅读:
    小程序双重for循环实现tab切换小demo
    小程序基础操作小总结
    一道关于类型转换的面试题的研究
    面试准备(6)vue专题
    面试准备(5)一道关于循环,事件执行顺序的题进行剖析
    微信小程序弹出授权用户信息和手机号
    面试准备(4) 作用域 预解析 字面量 arguments 等考察点练习
    ABC135
    CodeForces 1288C
    P4170
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7147767.html
Copyright © 2020-2023  润新知