当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:15:00  来源:本站整理

通过解析JDK源代码研究Hash存储机制[Java编程]

赞助商链接



  本文“通过解析JDK源代码研究Hash存储机制[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

通过 HashMap、HashSet 的源代码解析其 Hash 存储机制

调集和引用

就像引用范例的数组一样,当我们把 Java 对象放入数组之时,并非真正 的把 Java 对象放入数组中,只是把对象的引用放入数组中,每个数组元素都是 一个引用变量.

实际上,HashSet 和 HashMap 之间有很多类似之处,关于 HashSet 而言, 系统采取 Hash 算法决意调集元素的存储位置,这样可以保证能快速存、取调集 元素;关于 HashMap 而言,系统 key-value 当作一个整体举行处理,系统老是 按照 Hash 算法来计算 key-value 的存储位置,这样可以保证能快速存、取 Map 的 key-value 对.

在介绍调集存储之前需求指出一点:固然调集号称存储的是 Java 对象,但 实际上并不会真正将 Java 对象放入 Set 调集合,只是在 Set 调集合保存这些 对象的引用而言.也就是说:Java 调集实际上是多个引用变量所构成的调集, 这些引用变量指向实际的 Java 对象.

HashMap 的存储实现

当程序试图将多个 key-value 放入 HashMap 中时,以以下代码片段为例:

HashMap<String , Double> map = new  HashMap<String , Double>();
  map.put("语文" , 80.0);
  map.put("数学" , 89.0);
  map.put("英语" , 78.2);

HashMap 采取一种所谓的“Hash 算法”来决意每个元素的存储位置.

当程序履行 map.put("语文" , 80.0); 时,系统将调用"语文"的 hashCode () 办法得到其 hashCode 值——每个 Java 对象都有 hashCode() 办法,都可 通过该办法得到它的 hashCode 值.得到这个对象的 hashCode 值之后,系统会 按照该 hashCode 值来决意该元素的存储位置.

我们可以看 HashMap 类的 put(K key , V value) 办法的源代码:

public V put(K key, V value)
  {
  // 假如 key 为 null,调用 putForNullKey 办法举行处理
  if (key == null)
   return putForNullKey(value);
  // 按照 key 的 keyCode 计算 Hash 值
  int hash = hash(key.hashCode());
  // 搜索指定 hash 值在对应 table 中的索引 
   int i = indexFor(hash, table.length);
  // 假如 i 索引处的 Entry 不为 null,通过循环不断遍历 e 元 素的下一个元素
  for (Entry<K,V> e = table[i]; e != null; e =  e.next)
  {
   Object k;
   // 找到指定 key 与需求放入的 key 相等(hash 值相同
   // 通过 equals 对比放回 true)
   if (e.hash == hash && ((k = e.key) == key
   || key.equals(k)))
   {
   V oldValue = e.value;
   e.value = value;
   e.recordAccess(this);
   return oldValue;
   }
  }
  // 假如 i 索引处的 Entry 为 null,表明此处还没有 Entry
  modCount++;
  // 将 key、value 增添到 i 索引处
  addEntry(hash, key, value, i);
  return null;
  }


  以上是“通过解析JDK源代码研究Hash存储机制[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • 通过解析JDK源代码研究Hash存储机制
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .