WEB开发网
开发学院软件开发Java 通过分析 JDK 源代码研究 Hash 存储机制 阅读

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

 2009-11-28 00:00:00 来源:WEB开发网   
核心提示: //以指定初始化容量、负载因子创建HashMappublicHashMap(intinitialCapacity,floatloadFactor){//初始容量不能为负数if(initialCapacity<0)thrownewIllegalArgumentException("

 // 以指定初始化容量、负载因子创建 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。

initialCapacity 与 HashTable 的容量

创建 HashMap 时指定的 initialCapacity 并不等于 HashMap 的实际容量,通常来说,HashMap 的实际容量总比 initialCapacity 大一些,除非我们指定的 initialCapacity 参数值恰好是 2 的 n 次方。当然,掌握了 HashMap 容量分配的知识之后,应该在创建 HashMap 时将 initialCapacity 参数值指定为 2 的 n 次方,这样可以减少系统的计算开销。

上一页  1 2 3 4 5 6 7 8 9 10  下一页

Tags:通过 分析 JDK

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接