接口类图

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmdmdXFpYW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

公共抽象类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实现

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmdmdXFpYW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

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.        是否支持堵塞

Java集合类汇总记录--JDK篇的更多相关文章

  1. Java集合类汇总记录--guava篇

    BiMap HashBiMap<K,V> 实现了两份哈希表数据结构(本类独立实现).分别负责两个方向的映射. EnumBiMap<K,V> 两个EnumMap对象分别负责两个方 ...

  2. Java集合类汇总记录-- apache.commons4(TreeList)

    通常.Tree是Tree,List是List,两者不太可能混在一起.但apache-commons库却用tree实现了实现了List的接口,也就是TreeList类.与标准的LinkedList相比. ...

  3. java集合类深入分析之Queue篇

    简介 Queue是一种很常见的数据结构类型,在java里面Queue是一个接口,它只是定义了一个基本的Queue应该有哪些功能规约.实际上有多个Queue的实现,有的是采用线性表实现,有的基于链表实现 ...

  4. java集合类深入分析之Queue篇(Q,DQ)

    简介 Queue是一种很常见的数据结构类型,在java里面Queue是一个接口,它只是定义了一个基本的Queue应该有哪些功能规约.实际上有多个Queue的实现,有的是采用线性表实现,有的基于链表实现 ...

  5. JAVA集合类汇总

    一.集合与数组 数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用. 集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下使用. ...

  6. JAVA集合类汇总 - 转载

    一.集合与数组 数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用. 集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下使用. ...

  7. Java集合类学习记录

    被标记为transient的属性在对象被序列化的时候不会被保存int[] arr1 = {1, 2, 3, 4, 5}; int[] arr2 = Arrays.copyOf(arr1, new_le ...

  8. Java集合类常见面试知识点总结

    微信公众号[Java技术江湖]一位阿里Java工程师的技术小站 Java集合类学习总结 这篇总结是基于之前博客内容的一个整理和回顾. 这里先简单地总结一下,更多详细内容请参考我的专栏:深入浅出Java ...

  9. java 集合类基础问题汇总

     1.Java集合类框架的基本接口有哪些? 参考答案 集合类接口指定了一组叫做元素的对象.集合类接口的每一种具体的实现类都可以选择以它自己的方式对元素进行保存和排序.有的集合类允许重复的键,有些不允许 ...

随机推荐

  1. 【东软实训】SQL多表链接

    如果一个查询同时涉及两个以上的表,则称之为链接查询,链接查询是关系数据库中最主要的查询,主要包括等值链接查询.非等值链接查询.自身链接查询.外链接查询和复合条件链接查询. 这篇博文我们来对多表链接进行 ...

  2. Python机器学习——DBSCAN聚类

    密度聚类(Density-based Clustering)假设聚类结构能够通过样本分布的紧密程度来确定.DBSCAN是常用的密度聚类算法,它通过一组邻域参数(ϵϵ,MinPtsMinPts)来描述样 ...

  3. vue mixins应用场景

    学习知识得在应用场景中去应用,这样才能真正学到东西,记忆也深刻,以后碰到类似的东西就会了. 1.在assets文件夹下创建一个js文件 // 创建一个需要混入的对象 export const mixi ...

  4. 动态规划----最长公共子序列(C++实现)

    最长公共子序列 题目描述:给定两个字符串s1 s2 … sn和t1 t2 … tm .求出这两个字符串的最长公共子序列的长度.字符串s1 s2 … sn的子序列指可以表示为 … { i1 < i ...

  5. 「 Luogu P2657 」 windy数

    # 题目大意 给出区间 $[a,b]$,求出区间中有多少数满足下列两个条件 不含有前导 $0$. 相邻两个数字之差的绝对值至少是 $2$. # 解题思路 数位 $DP$,用记忆化搜索来实现.设 $dp ...

  6. EZOJ 宝石迷阵 建图+网络流匹配

    题面: 封印恶魔的地方可以看作是一个 n*m 的矩形,包含了 n*m 个祭坛,并且其 中有一些祭坛已经损坏了. 如果 i+j 为偶数,那么第 i 行第 j 列的祭坛只要没有损坏,就一定会封印有一个恶魔 ...

  7. 秋招复习-C++( 一)

    Linux/Unix编程部分 1.进程间通信方式:信号,信号量,消息队列,共享内存,套接字Socket 2.ipcs: Linux/Unix下的命令,可以用来查看当前系统中所使用的进程间通信方式的各种 ...

  8. sql分组和连接

    SELECT mr.member_id, mr.username, GROUP_CONCAT(DISTINCT jb.company,jb.start_time,jb.end_time)company ...

  9. 使用ajax解析后台json数据时:Unexpected token o in JSON at position 1

    json数据解析异常 今天在做json数据的时候,出现了如下错误,说是解析异常. VM1584:1 Uncaught SyntaxError: Unexpected token o in JSON a ...

  10. VMWare NAT网络配置

    1. 打开CMD,输入以下命令 ipconfig -all 2. 设置主机Wi-Fi网络对VMnet8虚拟网卡的网络共享 3. 虚拟机NAT模式配置 4. 配置虚拟机网卡信息 切换到ROOT cd / ...