前言
本文主要介绍java的Collection与Map相关的所有接口和类的关系,并对这些接口做一些总体的介绍。通过本文我们可以对java的Collection与Map相关的接口和类有一个宏观的把控,也能总体窥探出每个类的一些特征,从而在今后的实践应用过程中,我们可以有的放矢,针对应用的场景选择某个特定的Collection与Map相关的类。至于每个类的具体实现方法,我们这里并没有触及,有兴趣的朋友可以自行去研究。
1. Collection相关类
1.1 Collection相关类图
1.2 Collection相关接口
Collection(容器)里面可以存放各种各样的对象,对这些对象唯一的约束的是这些对象是同一的类型。
Set(集合)继承了Collection并扩展了一些新的方法。Set就是数学中集合的概念,集合中不存在重复的元素。
SortedSet继承了Set并扩展了一些新方法。存放在集合中的元素将会被排序。
NavigableSet继承了SortedSett并扩展了一些新方法。对集合中的元素可以根据数据之间的大小关系,更加方便的检索数据。
List继承了Collection并扩展了一些新的方法,List是有序的Collection,使用List能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。和下面要Set不同,List允许有相同的元素。
Queue(队列)继承了Collection并扩展了一些新的方法,Queue是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
Deque(双端队列)继承了Queue并扩展了一些新的方法,Deque是一种具有队列和栈的性质的数据结构。Deque中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。
BlockingQueue继承了Queue并扩展了一些新方法。当从队列中取出元素数,如果队列中没有元素,取元素的操作将会被阻塞,直到队列中有元素。当存放元素到队列中时,如果队列已满,存放的操作也将被阻塞,直到队列有空间存放元素。
BlockingDeque继承了Deque并扩展了一些新方法。同样当从队列中取出元素数,如果队列中没有元素,取元素的操作将会被阻塞,直到队列中有元素。当存放元素到队列中时,如果队列已满,存放的操作也将被阻塞,直到队列有空间存放元素。
TransferQueue继承了BlockingQueue并扩展了一些新方法。生产者会一直阻塞直到所添加到队列的元素被某一个消费者所消费(不仅仅是添加到队列里就完事)。
以上都是Collection相关的抽象的接口和类,针对这些接口和类,就需要各自具体的实现,而实现的方式各不相同,这样就会演变成一些不同的具体实现类。
1.3 Set实现类
HashSet 是哈希表实现的,HashSet中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,就如数据库中唯一约束。
LinkedHashSet继承了HashSet,同样是根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序。这样使得元素看起 来像是以插入顺 序保存的,也就是说,当遍历该集合时候,LinkedHashSet将会以元素的添加顺序访问集合的元素。
TreeSet继承了NavigableSet,是二差树实现的,Treeset中的数据是自动排好序的,不允许放入null值。
EnumMap是Set的一种实现,用于枚举类型元素专用Set实现。
CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。
ConcurrentSkipListSet和TreeSet一样也继承了NavigableSet,但ConcurrentSkipListSet是线程安全的有序的集合,适用于高并发的场景。
1.4 List实现类
ArrayList是List的实现,ArrayList的实现是基于动态数组的数据结构。
ArrayList是List的实现,LinkedList的实现是基于链表结构。
CopyOnWriteArrayList是List的实现,是基于CopyOnWrite理念来实现的,详细可以参考CopyOnWrite 详解。
1.5 BlockingQueue实现
ArrayBlockingQueue是BlockingQueue的一种实现,是一个基于数组的BlockingQueue实现。
LinkedBlockingQueue是BlockingQueue的一种实现,是一个基于链表的BlockingQueue实现。
PriorityBlockingQueue是BlockingQueue的一种实现,但是PriorityBlockingQueue是带优先级的无界阻塞队列,每次出队都返回优先级最好或者最低的元素,内部是平衡二叉树堆的实现。
SynchronousQueue是BlockingQueue的一种实现,SynchronousQueue和其他的BlockingQueue不同的是SynchronousQueue的capacity是0,即SynchronousQueue不存储任何元素,也就是说SynchronousQueue的每一次insert操作,必须等待其他线性的remove操作。而每一个remove操作也必须等待其他线程的insert操作。
DelayQueue是BlockingQueue的一种实现,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。
1.6 TransferQueue的实现
LinkedTransferQueue是TransferQueue的一种实现,是一个基于链表的TransferQueue实现。
1.7 Queue的实现
ConcurrentLinkedQueue是Queue的一种实现,是一个基于链表的Queue实现,并且支持高并发。
1.8 Deque实现
LinkedBlockingDeque是BlockingDeque的一种实现,是一个基于链表的BlockingDeque实现。
2 Map相关类
2.1 Map相关类图
2.2 Map相关接口
Map 接口中键和值一一映射,可以通过键来获取值。
SortedMap继承Map,主要提供有序的Map实现
NavigableMap继承SortedMap,在有序的基础上还支持快速搜索符合条件的最近的元素,逆序访问等功能。
ConcurrentMap继承Map,使得Map支持高并发。
ConcurrentNavigableMap继承了ConcurrentMap和NavigableMap,是ConcurrentMap和NavigableMap两者的结合,也就是一个高并发的NavigableMap。
以上都是Map相关的抽象的接口或类,针对这些接口和类,就要需要具体的实现。而实现的方式各不相同,这样就会演变成一些不同的具体实现类。
2.3 Map相关接口的实现
HashMap是Map的一种实现,是基于哈希表实现的。
HashMap是NavigableMap的实现,是基于树结构实现的。
EnumMap是Map的实现,用于枚举类型键的专用Map实现
HashMap继承了HashMap,是一个基于链表实现的HashMap。
WeakHashMap是Map的一种实现,不过WeakHashMap的键是“弱键”。在 WeakHashMap 中,当某个键不再正常使用时,会被从WeakHashMap中被自动移除。更精确地说,对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的丢弃,这就使该键成为可终止的,被终止,然后被回收。某个键被终止时,它对应的键值对也就从映射中有效地移除了。
IdentityHashMap是Map的一种实现,IdentityHashMap和HashMap一样也是利用哈希表实现Map接口,不同的是,其比较键(或值)时,使用引用相等性代替对象相等性。换句话说,在IdentityHashMap中,当且仅当k1 == k2时,才认为两个键相等,而在正常的Map实现中(比如HashMap),当且仅当两个键k1和K2满足:k1 == null ? k2 == null:k1.equals(k2)时,两个键才相等。
HashTable是Map的一种实现,它是与HashMap类似,也是基于哈希算法实现的,不允许key-value为NULL值,但又一点值得注意的是HashTable是线程安全的。
ConcurrentSkipListMap是ConcurrentNavigableMap的实现。
ConcurrentHashMap是ConcurrentMap的实现,是基于哈希算法实现的,可以看作是支持高并发的HashMap。
3 参考文章
- HashSet 与TreeSet和LinkedHashSet的区别
- CopyOnWrite 详解
- Java多线程系列–“JUC集合”06之 ConcurrentSkipListSet
- ArrayList和LinkedList的区别、优缺点以及应用场景
- java集合(五)Queue集合之PriorityBlockingQueue详解
- SynchronousQueue详解
- DelayedQueue学习笔记
- NavigableMap
- Java集合(八)–EnumMap简析
- 一文搞懂WeakHashMap工作原理(java后端面试高薪必备知识点)
- WeakHashMap的详细理解
- IdentityHashMap简介
- JAVA学习-Hashtable详解
- 哈希表、Java中HashMap