HashMap详解及性能提升

本来想自己写,却发现一篇写的很好的文章,特此借鉴过来,原文出处为

http://alex09.iteye.com/blog/539545

  HashMap 和 HashSet 是 Java Collection Framework 的两个重要成员,其中 HashMap 是 Map 接口的常用实现类,HashSet 是 Set 接口的常用实现类。虽然 HashMap 和 HashSet 实现的接口规范不同,但它们底层的 Hash 存储机制完全一样,甚至 HashSet 本身就采用 HashMap 来实现的。 
通过 HashMap、HashSet 的源代码分析其 Hash 存储机制
实际上,HashSet 和 HashMap 之间有很多相似之处,对于 HashSet 而言,系统采用 Hash 算法决定集合元素的存储位置,这样可以保证能快速存、取集合元素;对于 HashMap 而言,系统 key-value 当成一个整体进行处理,系统总是根据 Hash 算法来计算 key-value 的存储位置,这样可以保证能快速存、取 Map 的 key-value 对。 

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

集合和引用 

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

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

Java代码   收藏代码
  1. HashMap<String , Double> map = new HashMap<String , Double>();   
  2. map.put("语文" , 80.0);   
  3. map.put("数学" , 89.0);   
  4. map.put("英语" , 78.2);   



HashMap 采用一种所谓的“Hash 算法”来决定每个元素的存储位置。 

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

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

Java代码   收藏代码
  1. public V put(K key, V value)   
  2. {   
  3.  // 如果 key 为 null,调用 putForNullKey 方法进行处理  
  4.  if (key == null)   
  5.      return putForNullKey(value);   
  6.  // 根据 key 的 keyCode 计算 Hash 值  
  7.  int hash = hash(key.hashCode());   
  8.  // 搜索指定 hash 值在对应 table 中的索引  
  9.      int i = indexFor(hash, table.length);  
  10.  // 如果 i 索引处的 Entry 不为 null,通过循环不断遍历 e 元素的下一个元素  
  11.  for (Entry<K,V> e = table[i]; e != null; e = e.next)   
  12.  {   
  13.      Object k;   
  14.      // 找到指定 key 与需要放入的 key 相等(hash 值相同  
  15.      // 通过 equals 比较放回 true)  
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值