快速业务通道

通过分析JDK源代码研究Hash存储机制 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
resize(2 * table.length); // ② }

上面方法的代码很简单,但其中包含了一个非常优雅的设计:系统总是将新 添加的 Entry 对象放入 table 数组的 bucketIndex 索引处——如果 bucketIndex 索引处已经有了一个 Entry 对象,那新添加的 Entry 对象指向原 有的 Entry 对象(产生一个 Entry 链),如果 bucketIndex 索引处没有 Entry 对象,也就是上面程序①号代码的 e 变量是 null,也就是新放入的 Entry 对象指向 null,也就是没有产生 Entry 链。

通过分析JDK源代码研究Hash存储机制(3)

时间:2010-12-08 IBM 李刚

Hash 算法的性能选项

根据上面代码可以看出,在同一个 bucket 存储 Entry 链的情况下,新放入 的 Entry 总是位于 bucket 中,而最早放入该 bucket 中的 Entry 则位于这个 Entry 链的最末端。

上面程序中还有这样两个变量:

size:该变量保存了该 HashMap 中所包含的 key-value 对的数量。

threshold:该变量包含了 HashMap 能容纳的 key-value 对的极限,它的值 等于 HashMap 的容量乘以负载因子(load factor)。

从上面程序中②号代码可以看出,当 size++ >= threshold 时,HashMap 会自动调用 resize 方法扩充 HashMap 的容量。每扩充一次,HashMap 的容量 就增大一倍。

上面程序中使用的 table 其实就是一个普通数组,每个数组都有一个固定的 长度,这个数组的长度就是 HashMap 的容量。HashMap 包含如下几个构造器:

HashMap():构建一个初始容量为 16,负载因子为 0.75 的 HashMap。

HashMap(int initialCapacity):构建一个初始容量为 initialCapacity, 负载因子为 0.75 的 HashMap。

HashMap(int initialCapacity, float loadFactor):以指定初始容量、指 定的负载因子创建一个 HashMap。

当创建一个 HashMap 时,系统会自动创建一个 table 数组来保存 HashMap 中的 Entry,下面是 HashMap 中一个构造器的代码:

// 以指定初始化容量、负载因子创建 HashMap   public HashMap(int initialCapacity, float loadFactor)   {   // 初始容量不能为负数   if (initialCapacity < 0)    throw new IllegalArgumentException(   "Illegal initial capacity: " +    initialCapacity);   // 如果初始容量大于最大容量,让出示容量   if (initialCapacity > MAXIMUM_CAPACITY)    initialCapacity = MAXIMUM_CAPACITY;   // 负载因子必须大于 0 的数值   if (loadFactor <= 0 || Float.isNaN(loadFactor))    throw new IllegalArgumentException(    loadFactor);   // 计算出大于 initialCapacity 的最小的 2 的 n 次方值。   int capacity = 1;   while (capacity < initialCapacity)    capacity <<= 1;   this.loadFactor = loadFactor;   // 设置容量极限等于容量 * 负载因子   threshold = (int)(capacity * loadFactor);   // 初始化 table 数组    table = new Entry[capacity]; // ①   init();   }

上面代码中粗体字代码包含了一个简洁的代码实现:找出大于 initialCapacity 的、最小的 2 的 n 次方值,并将其作为 HashMap 的实际容 量(由 capacity 变量保存)。例如给定 initialCapacity 为 10,那么该 HashMap 的实际容量就是 16。

通过分析JDK源代码研究Hash存储机制(4)

时间:2010-12-08 IBM 李刚

initialCapacity 与 HashTable 的容量

创建 HashMap 时指定的 initialCapacity 并不等于 HashMap 的实际容量, 通常来说,HashMap 的实际容量总比 initialCapacity 大一些,除非我们指定 的 initialCapacity 参数值恰好

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号