摘要:
简介 TreeSet底层是采用TreeMap实现的一种Set,所以它是有序的,同样也是非线程安全的。 源码解析 经过前面我们学习HashSet和LinkedHashSet,基本上已经掌握了Set实现的套路了。 所以,也不废话了,直接上源码: package java.util; // TreeSet 阅读全文
摘要:
简介 上一节我们说HashSet中的元素是无序的,那么有没有什么办法保证Set中的元素是有序的呢? 答案是当然可以。 我们今天的主角LinkedHashSet就有这个功能,它是怎么实现有序的呢?让我们来一起学习吧。 源码分析 LinkedHashSet继承自HashSet,让我们直接上源码来看看它们 阅读全文
摘要:
简介 集合,这个概念有点模糊。 广义上来讲,java中的集合是指java.util包下面的容器类,包括和Collection及Map相关的所有类。 中义上来讲,我们一般说集合特指java集合中的Collection相关的类,不包含Map相关的类。 狭义上来讲,数学上的集合是指不包含重复元素的容器,即 阅读全文
摘要:
简介 跳表是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表。 跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找。 跳表不仅能提高搜索性能,同时也可以提高插入和删除操作的性能。 存储结构 跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找。 源码分析 主要内部类 阅读全文
摘要:
何为跳表? 跳表是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表。 跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找。 跳表不仅能提高搜索性能,同时也可以提高插入和删除操作的性能。 跳表详解 有序链表 考虑一个有序链表,我们要查找3、7、17这几个元素,我们只能从头开始遍 阅读全文
摘要:
简介 ConcurrentHashMap是HashMap的线程安全版本,内部也是使用(数组 + 链表 + 红黑树)的结构来存储元素。 相比于同样线程安全的HashTable来说,效率等各方面都有极大地提高。 各种锁简介 这里先简单介绍一下各种锁,以便下文讲到相关概念时能有个印象。 (1)synchr 阅读全文
摘要:
简介 WeakHashMap是一种弱引用map,内部的key会存储为弱引用,当jvm gc的时候,如果这些key没有强引用存在的话,会被gc回收掉,下一次当我们操作map的时候会把对应的Entry整个删除掉,基于这种特性,WeakHashMap特别适用于缓存处理。 类图 可见,WeakHashMap 阅读全文
摘要:
简介 LinkedHashMap内部维护了一个双向链表,能保证元素按插入的顺序访问,也能以访问顺序访问,可以用来实现LRU缓存策略。 LinkedHashMap可以看成是 LinkedList + HashMap。 类图 LinkedHashMap继承HashMap,拥有HashMap的所有特性,并 阅读全文
摘要:
简介 HashMap采用key/value存储结构,每个key对应唯一的value,查询和修改的速度都很快,能达到O(1)的平均时间复杂度。它是非线程安全的,且不保证元素存储的顺序; 类图 HashMap实现了Cloneable,可以被克隆。 HashMap实现了Serializable,可以被序列 阅读全文
摘要:
简介 CopyOnWriteArrayList是ArrayList的线程安全版本,内部也是通过数组实现,每次对数组的修改都完全拷贝一份新的数组来修改,修改完了再替换掉老数组,这样保证了只阻塞写操作,不阻塞读操作,实现读写分离。 类图 CopyOnWriteArrayList实现了List, Rand 阅读全文