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

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

 2009-11-28 00:00:00 来源:WEB开发网   
核心提示: 根据上面 put 方法的源代码可以看出,当程序试图将一个 key-value 对放入 HashMap 中时,通过分析 JDK 源代码研究 Hash 存储机制(4),程序首先根据该 key 的 hashCode() 返回值决定该 Entry 的存储位置:如果两个 Entry 的 key 的 has

根据上面 put 方法的源代码可以看出,当程序试图将一个 key-value 对放入 HashMap 中时,程序首先根据该 key 的 hashCode() 返回值决定该 Entry 的存储位置:如果两个 Entry 的 key 的 hashCode() 返回值相同,那它们的存储位置相同。如果这两个 Entry 的 key 通过 equals 比较返回 true,新添加 Entry 的 value 将覆盖集合中原有 Entry 的 value,但 key 不会覆盖。如果这两个 Entry 的 key 通过 equals 比较返回 false,新添加的 Entry 将与集合中原有 Entry 形成 Entry 链,而且新添加的 Entry 位于 Entry 链的头部——具体说明继续看 addEntry() 方法的说明。

当向 HashMap 中添加 key-value 对,由其 key 的 hashCode() 返回值决定该 key-value 对(就是 Entry 对象)的存储位置。当两个 Entry 对象的 key 的 hashCode() 返回值相同时,将由 key 通过 eqauls() 比较值决定是采用覆盖行为(返回 true),还是产生 Entry 链(返回 false)。

上面程序中还调用了 addEntry(hash, key, value, i); 代码,其中 addEntry 是 HashMap 提供的一个包访问权限的方法,该方法仅用于添加一个 key-value 对。下面是该方法的代码:

void addEntry(int hash, K key, V value, int bucketIndex) 
{ 
  // 获取指定 bucketIndex 索引处的 Entry 
  Entry<K,V> e = table[bucketIndex];  // ① 
  // 将新创建的 Entry 放入 bucketIndex 索引处,并让新的 Entry 指向原来的 Entry 
  table[bucketIndex] = new Entry<K,V>(hash, key, value, e); 
  // 如果 Map 中的 key-value 对的数量超过了极限 
  if (size++ >= threshold) 
    // 把 table 对象的长度扩充到 2 倍。 
    resize(2 * table.length);  // ② 
} 

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

Tags:通过 分析 JDK

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