首页 > 其他 > 详细

HashTable源码分析

时间:2015-05-29 18:04:36      阅读:231      评论:0      收藏:0      [点我收藏+]

HashTable源码--put方法和get方法:

	// 将key-value对添加到HashTable中,如果已存在,则新值替旧值,并返回旧值
	public synchronized V put(K key, V value) {    
		// Hashtable中不能插入value为null的元素!
		if (value == null) {    
			throw new NullPointerException();    
		}    
    
		// 若该key对应的键值对已经存在,则用新的value取代旧的value;返回了旧的value后,退出!   
		Entry tab[] = table;    
		int hash = key.hashCode();    
		int index = (hash & 0x7FFFFFFF) % tab.length;    
		for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {    
			if ((e.hash == hash) && e.key.equals(key)) {    
				V old = e.value;    
				e.value = value;    
				return old;    
				}    
		}

		// 若该key对应的键值对不存在,则将key-value对添加到table中 
		modCount++;    
		//  若Hashtable实际容量count大于或等于阀值时,扩容
		if (count >= threshold) {  
			rehash();    
			tab = table;    
			index = (hash & 0x7FFFFFFF) % tab.length;    
		}    
		// 将key-value对添加到table中 
		Entry<K,V> e = tab[index];           
		tab[index] = new Entry<K,V>(hash, key, value, e);    
		count++;    
		return null;    
	} 

--------------------

    // 返回key对应的value,没有的话返回null    
    public synchronized V get(Object key) {    
        Entry tab[] = table;    
        int hash = key.hashCode();    
        // 计算bucket的位置(即table的下标)   
        int index = (hash & 0x7FFFFFFF) % tab.length;    
        // 找到“key对应的Entry(链表)”,然后在链表中找出“哈希值”和“键值”与key都相等的元素    
        for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {    
            if ((e.hash == hash) && e.key.equals(key)) {    
                return e.value;    
            }    
        }    
        return null;    
    } 


                                                          另请参照文章:  【 HashMap源码分析




HashTable源码分析

原文:http://blog.csdn.net/wodewutai17quiet/article/details/46238873

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!