Java集合类汇总记录--JDK篇
接口类图
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 Node<E> Node<E> } |
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篇的更多相关文章
- Java集合类汇总记录--guava篇
BiMap HashBiMap<K,V> 实现了两份哈希表数据结构(本类独立实现).分别负责两个方向的映射. EnumBiMap<K,V> 两个EnumMap对象分别负责两个方 ...
- Java集合类汇总记录-- apache.commons4(TreeList)
通常.Tree是Tree,List是List,两者不太可能混在一起.但apache-commons库却用tree实现了实现了List的接口,也就是TreeList类.与标准的LinkedList相比. ...
- java集合类深入分析之Queue篇
简介 Queue是一种很常见的数据结构类型,在java里面Queue是一个接口,它只是定义了一个基本的Queue应该有哪些功能规约.实际上有多个Queue的实现,有的是采用线性表实现,有的基于链表实现 ...
- java集合类深入分析之Queue篇(Q,DQ)
简介 Queue是一种很常见的数据结构类型,在java里面Queue是一个接口,它只是定义了一个基本的Queue应该有哪些功能规约.实际上有多个Queue的实现,有的是采用线性表实现,有的基于链表实现 ...
- JAVA集合类汇总
一.集合与数组 数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用. 集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下使用. ...
- JAVA集合类汇总 - 转载
一.集合与数组 数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用. 集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下使用. ...
- Java集合类学习记录
被标记为transient的属性在对象被序列化的时候不会被保存int[] arr1 = {1, 2, 3, 4, 5}; int[] arr2 = Arrays.copyOf(arr1, new_le ...
- Java集合类常见面试知识点总结
微信公众号[Java技术江湖]一位阿里Java工程师的技术小站 Java集合类学习总结 这篇总结是基于之前博客内容的一个整理和回顾. 这里先简单地总结一下,更多详细内容请参考我的专栏:深入浅出Java ...
- java 集合类基础问题汇总
1.Java集合类框架的基本接口有哪些? 参考答案 集合类接口指定了一组叫做元素的对象.集合类接口的每一种具体的实现类都可以选择以它自己的方式对元素进行保存和排序.有的集合类允许重复的键,有些不允许 ...
随机推荐
- $("[lay-id='"+this.id+"']")
$("[lay-id='"+this.id+"']") $("[lay-id='"+this.id+"'] .layui-tabl ...
- [bzoj4816][Sdoi2017]数字表格 (反演+逆元)
(真不想做莫比乌斯了) 首先根据题意写出式子 ∏(i=1~n)∏(j=1~m)f[gcd(i,j)] 很明显的f可以预处理出来,解决 根据套路分析,我们可以先枚举gcd(i,j)==d ∏(d=1~n ...
- maven release插件将一版本发布到仓库中时Return code is: 401, ReasonPhrase:Unauthorized
需要在maven的setting.xml中配置servers.server节点,其值为nexus的对应的repository的id以及用户名及密码 <servers> <server ...
- url编码函数encodeURI和encodeURIComponent
var url = "http://www.wrox.com/illegal value.html#start";encodeURIComponent(url) //" ...
- 在计算机中简单的hello程序的运行
我之前很好奇就是你所写的代码到底是如何在计算机中执行的,到底是怎样开始,从哪里开始,在哪里执行,到哪里结束,之间到底是怎么的一个过程,带着这些问题,逐渐看这方面的书籍,最近买的<深入理解计算机系 ...
- [Python3网络爬虫开发实战] 3.2.2-高级用法
在前一节中,我们了解了requests的基本用法,如基本的GET.POST请求以及Response对象.本节中,我们再来了解下requests的一些高级用法,如文件上传.cookie设置.代理设置等. ...
- (十三)python 3 集合
定义: 1.不同元素组成 2.无序 3.集合中的元素必须是不可变类型 创建集合 s = {1,2,3,4,5,6,7,8} 1.定义可变集合 >>> set_test = set(' ...
- codeforces 407 div1 B题(Weird journey)
codeforces 407 div1 B题(Weird journey) 传送门 题意: 给出一张图,n个点m条路径,一条好的路径定义为只有2条路径经过1次,m-2条路径经过2次,图中存在自环.问满 ...
- 【Codeforces 1041D】Glider
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 二分. 枚举每一个上升区的起始位置作为起点(这样做肯定是最优的),然后如果没有掉在地上的话就尽量往右二分(只有上升区之间的间隙会让他往下掉) ...
- Python xml文件处理
什么是XML文件? xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. 从结构上,很像HTML超文本标记语言.但他们被设计的目的是不同的,具体如 ...