AlstonWilliams's Blog

Thinking will not overcome fear but action will.

Java集合框架源码研读-LinkedHashMap

上一篇文章中,我们已经介绍了一个很重要的集合类-HashMap.我们也提到了它的一个特性,就是不是按我们插入的顺序来读取元素.那么,今天我们就来介绍一个能够按照我们插入的顺序来读取元素的HashMap的变体,LinkedHashMap. 其实LinkedHashMap和HashMap的实现并没有什么差别,LinkedHashMap是HashMap的一个子类.从源码中,我们可以看到,很多方法...

Java集合框架源码研读-HashSet

HashSet是一种Set的实现. 为什么需要Set这种数据结构呢?因为假设我们想要存储不能重复的元素,我们会怎么做?会选择哪种数据结构?数组还是链表? 选用数组或者链表,我们都需要时间复杂度为O(n)的检查操作来检查元素有没有重复. “等一下”,你可能会说. “我们可以选择BST啊,这样我们只需要时间复杂度为O(logn)的检查操作.” 确实可以这样做,但是还有没有更好的解决方案...

Java集合框架源码研读-HashMap

写这篇文章之前,当我在研究HashMap的源码的时候,发现源码中有几处用到了一些我完全理解不了的算法,于是,从网上搜索相关的内容,期望能够理解这些算法,以及为什么这样做是正确的. 最后,误打误撞,发现了一篇跟HashMap工作原理相关的文章.找到这篇文章之后,我也是参考着这篇文章来深入的理解了一遍源码.这篇文章非常浅显易懂,如果你有尝试过阅读HashMap的源码的话. 有了那篇文章,本...

Java集合框架源码研读-EnumMap

前面已经介绍了好多Map了,今天再来介绍一个,跟Enum相关的Map, EnumMap. 那么这个Map跟之前介绍的那些Map有什么区别呢? EnumMap的key,必须是Enum类型的. 实际上,它实现起来非常简单. 我们可以通过Enum类型的values()方法来获取到一个Enum中所有数据的数组. 那这不就很简单了吗? EnumMap中维护着一个key的数组(keyUniv...

Java集合框架源码研读-CopyOnWriteArrayList

今天我们再来研究一个List-CopyOnWriteArrayList. 我们首先从类注释来大致了解一下这个类: 从中我们可以提取出来几点关键点: 它先当于一个线程安全的ArrayList 向其中添加数据或者删除数据的操作,都是线程安全的 它在添加数据或者删除数据方面效率有点低 Iterator不会反应出新增加的元素 在接下来的文章中,我们将会回答以下几个问题...

Java集合框架源码研读-ConcurrentHashMap(JDK7)

基础的集合框架,前面已经介绍的差不多了,现在我们还是介绍几个高级一些的. 首先介绍的是我们应该都熟悉的ConcurrentHashMap. 各位在看各种资料的时候,或多或少应该都会看到过它的身影,我曾经也看了好多次网上关于他的文章,但是并没有深入研究过. 注意 这里我们介绍的是JDK8之前的版本中的ConcurrentHashMap,在此之前的版本的实现方式应该都差不多,实际上,我阅...

Java集合框架源码研读-ArrayList

在理解了ArrayList的父类AbstractList的实现之后,我们就要开始动手理解ArrayList. ArrayList实现了List接口,其中定义了列表应该有的操作,还实现了RandomAccess, Cloneable, Serializable接口,分别让List具有能够随机读取,可复制,可以序列化的能力. RandomAccess这个接口,是一个空接口,它其中没有任何方法...

Java集合框架源码研读-ArrayDeque

前面介绍过一个队列的实现-PriorityQueue,现在我们介绍一下ArrayDeque. 从它的名字中,我们可以看到,其内部结构是一个数组,并且它是一个Deque. 我们首先看一下这个类的文档注释: 从中我们可以提取出来几点重要信息: 内部数组的容量会自动增加,如果必要的话 这个类不是线程安全的 这个类是Fail-Fast的 如果把它当做栈来使用,那么它比S...

Java集合框架源码研读-ArrayBlockingQueue

今天我们来介绍一个BlockingQueue的实现,ArrayBlockingQueue. 从其名字中,我们就能得知,首先,这是一个队列,其次,这个队列能够被阻塞,最后,它的底层数据结构是一个数组. 老规矩,我们还是先贴上来ArrayBlockingQueue的类注释: 从类注释中,我们可以发现几点我们刚才没有提到的: 这个队列会按照FIFO的顺序来处理数据(这也是队列的一...

Java集合框架源码研读-AbstractList

本想先阅读ArrayList的源码,但是ArrayList继承于AbstractList这个抽象类,于是就先阅读这个抽象类了. 在这个抽象类中,我们可以发现,很多方法的实现,都是抛出一个UnsupportedOperationException异常,等待具体的实现类来实现. 在indexOf方法的实现中,我们可以看到,它是采用的顺序遍历的方式,这是最常见但是同时效率也是最低的遍历方式...