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

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

时间: 2024-08-02 22:56:00

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

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

BiMap HashBiMap<K,V> 实现了两份哈希表数据结构(本类独立实现),分别负责两个方向的映射. EnumBiMap<K,V> 两个EnumMap对象分别负责两个方向的映射. EnumHashBiMap<K,V> 一个EnumMap对象负责K到V映射,一个HashMap对象负责V到K的影身. MultiMap HashMultimap<K,V> 使用HashMap<K,HashSet<V>>对象实现. TreeMultim

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

通常,Tree是Tree,List是List,两者不太可能混在一起.但apache-commons库却用tree实现了实现了List的接口,也就是TreeList类.与标准的LinkedList相比,TreeList稍微浪费一点空间,但常用操作的时间复杂度均降低到了O(log N),值得在开发中权衡利弊.合理应用. 内部数据结构 TreeList内部包含了一个Thread AVL Tree.AVL Tree很常见了,是一种典型的Balanced Binary Tree,但下面简单介绍下Threa

java复习汇总之面试篇

这些个人感觉都是基础,希望看的园友不要喷. 1.什么是servlet线程安全,如何解决? 2.spring事物管理,在项目中你是怎么管理事物的? 3.java中的有几种线程? 4.java有几种锁? 5.怎么理解java中的多态,项目中何时用到抽象类? 6.如何处理js,sql注入? 7.struts2拦截器的原理? 8.如何理解spring AOP? 11.java中常用的集合,在项目中用到时,有什么需要注意的? 12.如果优化项目中sql,为什么要那样优化? 13.java性能优化? 14.

java集合类深入分析之Queue篇

简介 Queue是一种很常见的数据结构类型,在java里面Queue是一个接口,它只是定义了一个基本的Queue应该有哪些功能规约.实际上有多个Queue的实现,有的是采用线性表实现,有的基于链表实现.还有的适用于多线程的环境.java中具有Queue功能的类主要有如下几个:AbstractQueue, ArrayBlockingQueue, ConcurrentLinkedQueue, LinkedBlockingQueue, DelayQueue, LinkedList, PriorityB

Java集合类学习记录

被标记为transient的属性在对象被序列化的时候不会被保存int[] arr1 = {1, 2, 3, 4, 5}; int[] arr2 = Arrays.copyOf(arr1, new_length);//Arrays是数组的工具类//ArrayList的转化为静态数组的toArray方法就是这个原理//ArrayList的扩容原理也是Arrays.copyOf()方法//新建了一个数组定义一个数组int[] a={3,1,4,2,5}; int[] b=a; 数组b只是对数组a的又一

java集合类汇总

一.几种重要的接口和类简介 1.List(有序.可重复)List里存放的对象是有序的,同时也是可以重复的,List关注的是索引,拥有一系列和索引相关的方法,查询速度快.因为往list集合里插入或删除数据时,会伴随着后面数据的移动,所有插入删除数据速度慢. 2.Set(无序.不能重复)Set里存放的对象是无序,不能重复的,集合中的对象不按特定的方式排序,只是简单地把对象加入集合中. 3.Map(键值对.键唯一.值不唯一)Map集合中存储的是键值对,键不能重复,值可以重复.根据键得到值,对map集合

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

Java集合类学习总结 这篇总结是基于之前博客内容的一个整理和回顾. 这里先简单地总结一下,更多详细内容请参考我的专栏:深入浅出Java核心技术? https://blog.csdn.net/column/details/21930.html 里面有包括Java集合类在内的众多Java核心技术系列文章. 以下总结不保证全对,如有错误,还望能够指出,谢谢. 最后,如果想要更好地完成这部分内容的学习,建议大家还是去看一下原文. Colletion,iterator,comparable 一般认为Co

Java 集合类入门篇

开门见山地说吧,Java 提供了一套完整的集合类(也可以叫做容器类)来管理一组长度可变的对象(也就是集合的元素),其中常见的类型包括 List.Set.Queue 和 Map.从我个人的编程经验来看,List 的实现类 ArrayList 和 Map 的实现类 HashMap 使用频率最高,其它实现类只能望其项背了. <!--more--> List.Set 和 Queue 都是 Collection 的子接口,但各有各的好.List 按照插入的顺序保存元素,Set 不会有重复的元素,Queu

java 集合类基础问题汇总

 1.Java集合类框架的基本接口有哪些? 参考答案 集合类接口指定了一组叫做元素的对象.集合类接口的每一种具体的实现类都可以选择以它自己的方式对元素进行保存和排序.有的集合类允许重复的键,有些不允许.Java集合类提供了一套设计良好的支持对一组对象进行操作的接口和类.Java集合类里面最基本的接口有:Collection:代表一组对象,每一个对象都是它的子元素.Set:不包含重复元素的Collection.List:有顺序的collection,并且可以包含重复元素.Map:可以把键(key)