开发国外优惠卷网站如何做,step7用法fc州网站建设,wordpress连不上数据库,网站程序是什么?JDK 的代码是开源的#xff0c;我们打开idea开发工具#xff0c;引入jdk1.8 找到hashmap
HashMap 是基于 HashTable 的一种数据结构#xff0c;在普通哈希表的基础上#xff0c;它支持多线程操作以及空的 key 和 value。
在 HashMap 中定义了几个常量:
static final in…JDK 的代码是开源的我们打开idea开发工具引入jdk1.8 找到hashmap
HashMap 是基于 HashTable 的一种数据结构在普通哈希表的基础上它支持多线程操作以及空的 key 和 value。
在 HashMap 中定义了几个常量:
static final int DEFAULT_INITIAL_CAPACITY 1 4; // aka 16
static final int MAXIMUM_CAPACITY 1 30;
static final float DEFAULT_LOAD_FACTOR 0.75f;
static final int TREEIFY_THRESHOLD 8;
static final int UNTREEIFY_THRESHOLD 6;
static final int MIN_TREEIFY_CAPACITY 64;
依次解释以上常量:
DEFAULT_INITIAL_CAPACITY: 初始容量也就是默认会创建 16 个箱子箱子的个数不能太多或太少。如果太少很容易触发扩容如果太多遍历哈希表会比较慢。MAXIMUM_CAPACITY: 哈希表最大容量一般情况下只要内存够用哈希表不会出现问题。DEFAULT_LOAD_FACTOR: 默认的负载因子。因此初始情况下当键值对的数量大于 16 * 0.75 12 时就会触发扩容。TREEIFY_THRESHOLD: 上文说过如果哈希函数不合理即使扩容也无法减少箱子中链表的长度因此 Java 的处理方案是当链表太长时转换成红黑树。这个值表示当某个箱子中链表长度大于 8 时有可能会转化成树。UNTREEIFY_THRESHOLD: 在哈希表扩容时如果发现链表长度小于 6则会由树重新退化为链表。MIN_TREEIFY_CAPACITY: 在转变成树之前还会有一次判断只有键值对数量大于 64 才会发生转换。这是为了避免在哈希表建立初期多个键值对恰好被放入了同一个链表中而导致不必要的转化。
学过概率论的读者也许知道理想状态下哈希表的每个箱子中元素的数量遵守泊松分布: 当负载因子为 0.75 时上述公式中 λ 约等于 0.5因此箱子中元素个数和概率的关系如下:
数量概率00.6065306610.3032653320.0758163330.0126360640.0015795250.0001579560.0000131670.0000009480.00000006
这就是为什么箱子中链表长度超过 8 以后要变成红黑树因为在正常情况下出现这种现象的几率小到忽略不计。一旦出现几乎可以认为是哈希函数设计有问题导致的。
Java 对哈希表的设计一定程度上避免了不恰当的哈希函数导致的性能问题每一个箱子中的链表可以与红黑树切换。