接口类图

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

最新文章

  1. Python中获取异常(Exception)信息
  2. AJAX学习
  3. 文件夹文件遍历并插入数据库的操作,IO Directory File的递归操作
  4. chown命令
  5. 关于强制类型转换(c语言)
  6. [Java] 通过文件流拷贝文件
  7. FPGA使用技巧
  8. POJ 2533-Longest Ordered Subsequence(DP)
  9. sql新建数据库表,及添加多个主键
  10. 内存管理 &amp; 内存优化技巧 浅析
  11. javascript代码的小小重构
  12. FTP&amp;samba 服务简单部署
  13. 智能指针std::weak_ptr
  14. Delphi 开发手机 App 与其他工具之间的比较分析
  15. 使用 Chrome DevTools 调试 JavaScript
  16. 学习笔记71—Python 报错处理集
  17. webapi 控制json的字段(key)显示顺序
  18. 乐观锁和悲观锁及CAS实现
  19. MySQL 5.7 Replication 相关新功能说明 (转)
  20. mac 打印机无法打印

热门文章

  1. python练习1 登录和三级菜单
  2. 时间戳显示格式为几天前、几分钟前、几秒前---vue过滤器
  3. 【讲●解】火车进出栈类问题 &amp; 卡特兰数应用
  4. Python之trutle库-五角星
  5. python链家网高并发异步爬虫and异步存入数据
  6. Python 字典(2)
  7. 【HDU 2196】 Computer(树的直径)
  8. uva 12096 The SetStack Computer(STL set的各种库函数 交集 并集 插入迭代器)
  9. UVA 213 信息解码(二进制&amp;位运算)
  10. 【01】emmet系列之基础介绍