用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; } ……省略 }