用VB.net编写的Windows服务管理程序(堪称经典)全部源代码,提供了全部的服务功能,绝对值得下载。
文件:590m.com/f/25127180-498774168-58a1db(访问密码:551685)
以下内容无关:
-------------------------------------------分割线---------------------------------------------
想要理解HashMap底层数据的存储形式,底层原理,最好的形式就是读它的源码,但是说实话,源码的注释说明全是英文,英文不是非常好的朋友读起来真的非常吃力,我基本上看了差不多七八遍,还结合网上的一些解析,才觉得自己有点理解。
我先画了一个图,HashMap数据存储的结构图,先有个理解,再来看看下面的代码解析可能会好理解些。
HashMap的数据结构
image-20210403232719038
HashMap静态属性
/**
* The default initial capacity - MUST be a power of two.
* 默认的数组容量16
*/
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
/**
* 最大的容量
*/
static final int MAXIMUM_CAPACITY = 1 << 30;
/**
* The load factor used when none specified in constructor.
* 负载因子,用于扩容,当数组的容量大于等于 0.75*DEFAULT_INITIAL_CAPACITY时,就要扩容
*/
static final float DEFAULT_LOAD_FACTOR = 0.75f;
/**
* 每个桶中数据结构转变为树的链表长度界限,当链表长度为为8时,转成红黑树
*/
static final int TREEIFY_THRESHOLD = 8;
/**
* 当树的结点等于小于等于6时,又转会链表
*/
static final int UNTREEIFY_THRESHOLD = 6;
static final int MIN_TREEIFY_CAPACITY = 64;
存储的对象
/**
* Basic hash bin node, used for most entries. (See below for
* TreeNode subclass, and in LinkedHashMap for its Entry subclass.)
*/
static class Node<K,V> implements Map.Entry<K,V> {
final int hash;
final K key;
V value;
Node<K,V> next;
Node(int hash, K key, V value, Node<K,V> next) {
this.hash = hash;
this.key = key;
this.value = value;
this.next = next;
}
……省略
}