通过分析JDK源代码研究Hash存储机制 - 编程入门网
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 中一个构造器的代码:
上面代码中粗体字代码包含了一个简洁的代码实现:找出大于 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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |