Code Walkthrough是我们新的一个系列,主要以阅读,分析源代码为主要目的,特此介绍一下。我们先以最经典的JDK-HashMap来拆解,相信很多我们极客小伙伴自己也读过源码,不要紧,就当温故而知新吧,况且我们是庖丁解牛,逐行阅读,或许会有新发现。
总目录
-
HashMap总览
-
作者简介
-
类变量定义
-
构造器
-
内部数据结构
-
hash / index
-
核心代码
-
其他代码
-
总结
HashMap, 无需多介绍,几乎每个Java程序员都使用过,并且可以说几乎每天都差不多要与之接触,或直接使用或间接使用,其重要性可见一斑,我们直接进入正题,让我们来看看这个不算注释不超过1000行的代码如何实现那么多神奇的功能,同时我们可以看看自己项目中的代码,反思一下。这里假设极客朋友们都非常熟悉HashMap本身用法,同时至少知道HashMap是由数组Bucket再加上链表构成,这样我们下面解牛的时候,至少可以区分大腿与小腿骨头了。:)哈哈。
1. HashMap总览
按照我们的习惯,由大局观开始俯视整体架构。当然,前提是我们假设所有人都已经非常清楚HashMap本身的用途,当然类的注释不可少。
包结构:
package java.util;
部分注释:
多么清晰直白啊,实现了Map接口;与Hashtable的核心差异是非同步并且支持null K/V; 简直就是Java必备面试题啊?哈哈。若干年前也经常会在面试中问别人。
类结构总览:
类的总结构比较清晰,继承自AbstractMap, 主要实现了Map接口,以及包含几个构造器。其中核心功能代码都是实现Map接口,包括put/get, entrySet;
好,心里略有把控,我们继续细细拆解。
2. 作者简介
作者及类定义:
老习惯,我们还是要稍微关注一下原作者。我们看到了熟悉的Doug Lea大教授,大名鼎鼎的Java Concurrent包作者,可以参考我们写的Deep Dive - Concurrency,其中有专门篇幅介绍老先生。
还有大名鼎鼎的Josh Bloch, 我们熟悉的整个Java Collection框架,math包都是打造于其之手,可惜后来在Java 1.5 Tiger 2004时,加入了当时如日中天的Google, 并正值当年Google IPO, 想想也不需要可惜,应该说其慧眼,哈哈。
类的定义没有花头,继承AbstractMap, 实现Map, Cloneable, Serializable接口。