AlstonWilliams's Blog

Thinking will not overcome fear but action will.

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方法的实现中,我们可以看到,它是采用的顺序遍历的方式,这是最常见但是同时效率也是最低的遍历方式...

Java获取Unsafe实例

Unsafe是JDK中的一个内置的类,用于直接根据内存地址访问元素.它也提供了很多好用的方法,比如,用volatile的方式设置数组中的元素. 但是,这个类的作者,不希望我们使用它,因为我们虽然我们获取到了对底层的控制权,但是也增大了风险,安全性正是Java相对于C++/C的优势. 这个类,默认情况下,只能被由BootstrapClassLoader加载器加载的类所使用. 那我们要是想...