java.util.HashMap是很常见的类(4)

来源:未知 责任编辑:责任编辑 发表时间:2014-05-10 11:49 点击:

     modCount++; 
     addEntry(hash, key, value, i); 
     return null; 
 } 
 

如果key为NULL,则是单独处理的,看看putForNullKey方法:
 
Java代码 
private V putForNullKey(V value) { 
      int hash = hash(NULL_KEY.hashCode()); 
      int i = indexFor(hash, table.length); 
 
      for (Entry<K,V> e = table[i]; e != null; e = e.next) { 
          if (e.key == NULL_KEY) { 
              V oldValue = e.value; 
              e.value = value; 
              e.recordAccess(this); 
              return oldValue; 
          } 
      } 
 
      modCount++; 
      addEntry(hash, (K) NULL_KEY, value, i); 
      return null; 
  } 
 
NULL_KEY的声明:static final Object NULL_KEY = new Object();
这一段代码是处理哈希冲突的,就是说,在数组某个位置的对象可能并不是唯一的,它是一个链表结构,根据哈希值找到链表后,还要对链表遍历,找出key相等的对象,替换它,并且返回旧的值。
  
Java代码 
for (Entry<K,V> e = table[i]; e != null; e = e.next) { 
         if (e.key == NULL_KEY) { 
             V oldValue = e.value; 
             e.value = value; 
             e.recordAccess(this); 
             return oldValue; 
         } 
     } 
 
如果遍历完了该位置的链表都没有找到有key相等的,那么将当前对象增加到链表里面去

Java代码 
modCount++; 
addEntry(hash, (K) NULL_KEY, value, i); 
return null; 
 
且看看addEntry方法

Java代码 
void addEntry(int hash, K key, V value, int bucketIndex) { 
Entry<K,V> e = table[bucketIndex]; 
    table[bucketIndex] = new Entry<K,V>(hash, key, value, e); 
    if (size++ >= threshold) 
        resize(2 * table.length); 

发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • Java编程语言的八大优点
  • JVM对象生命周期详细介绍
  • Java平台上的CRM系统
  • Java 算数测试小程序
  • Java环境 使用Resin在NT环境下配置JSP环境
  • Command(命令模式)
  • Java 一个简单的画图程序
  • Java 日历的小程序
  • Java 统计代码的小工具
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1