`
liuxinglanyue
  • 浏览: 546919 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Hashtable与HashMap的区别(源码级)

阅读更多

首先他们的相同点都实现了Map接口,不同点有很多: 
1. Hashtable 继续了抽象类Dictionary,所有Hashtable是线程安全的,而HashMap不是 
Java代码 
  1. public class Hashtable<K,V>  
  2.     extends Dictionary<K,V>  
  3. implements Map<K,V>, Cloneable, java.io.Serializable {  

2. Hashtable不能存放key为null的对象,它会抛出异常,而HashMap是可以的。 
Java代码 
  1. public synchronized V put(K key, V value) {  
  2. // Make sure the value is not null  
  3. if (value == null) {  
  4.     throw new NullPointerException();  
  5. }  
  6.   
  7. // Makes sure the key is not already in the hashtable.  
  8. Entry tab[] = table;  
  9. int hash = key.hashCode();  
  10. int index = (hash & 0x7FFFFFFF) % tab.length;  
  11. for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {  
  12.     if ((e.hash == hash) && e.key.equals(key)) {  
  13.     V old = e.value;  
  14.     e.value = value;  
  15.     return old;  
  16.     }  
  17. }  

3. 初始化数组大小不一样,HashMap是16,而Hashtable是11 
Java代码 
  1. public Hashtable() {  
  2.     this(110.75f);  
  3. }  

4. 扩容机制也不同,HashMap是旧的大小×2,而Hashtable是旧的大小×2+1 
  
Java代码 
  1. protected void rehash() {  
  2. int oldCapacity = table.length;  
  3. Entry[] oldMap = table;  
  4.   
  5. int newCapacity = oldCapacity * 2 + 1;  
  6. Entry[] newMap = new Entry[newCapacity];  
  7.   
  8. modCount++;  
  9. threshold = (int)(newCapacity * loadFactor);  
  10. table = newMap;  
  11.   
  12. for (int i = oldCapacity ; i-- > 0 ;) {  
  13.     for (Entry<K,V> old = oldMap[i] ; old != null ; ) {  
  14.     Entry<K,V> e = old;  
  15.     old = old.next;  
  16.   
  17.     int index = (e.hash & 0x7FFFFFFF) % newCapacity;  
  18.     e.next = newMap[index];  
  19.     newMap[index] = e;  
  20.     }  
  21. }  

5. 计算数组下标index的方法不同: 
Hashtable的如下 
      
Java代码 
  1. int hash = key.hashCode();  
  2. int index = (hash & 0x7FFFFFFF) % tab.length;  


HashMap的如下 
   
Java代码 
  1. /** 
  2.      * 计算hashCode的方法 
  3.      */  
  4.     static int hash(int h) {  
  5.   
  6.         h ^= (h >>> 20) ^ (h >>> 12);  
  7.         return h ^ (h >>> 7) ^ (h >>> 4);  
  8.     }  
  9.   
  10.     /** 
  11.      * 根据hashcode和数组的大小来计算数组下标的方法 
  12.      */  
  13.     static int indexFor(int h, int length) {  
  14.         return h & (length-1);  
  15.     }  

分享到:
评论
1 楼 xiangzi21 2011-05-10  
不错,简单易懂

相关推荐

    HashMap与HashTable的区别(含源码分析)

    NULL 博文链接:https://qiaolevip.iteye.com/blog/2094447

    Java集合专题总结:HashMap 和 HashTable 源码学习和面试总结

    Java集合专题总结:HashMap 和 HashTable 源码学习和面试总结

    HashMap模块源码—— 高效随机存取数据结构 ,文本索引必备

    2、相比网站上发布过的hashtable之类的源码:。此HashMap寻址方法是拉链法.比开放寻址法对连续内存要求更低。哈希函数用的是java中String.hashCode()算法(经实际验证其碰撞率极低且相近的文本散列值相邻,存取的效率更...

    HashMap 源码分析

    是不是觉得很熟悉,没错这玩意在1.8之前的结构就和HashTable一样都是采用数组+链表,同样也是通过链地址法(这里简称拉链法)来解决冲突,但是HashMap和HashTable的区别是一个是线程安全的,一个是非线程安全的。...

    易语言-HashMap模块源码—— 高效随机存取数据结构 ,文本索引必备

    2、相比网站上发布过的hashtable之类的源码: 此HashMap寻址方法是拉链法.比开放寻址法对连续内存要求更低 哈希函数用的是java中String.hashCode()算法(经实际验证其碰撞率极低且相近的文本散列值相邻,存取的效率更高...

    HashMap底层原理.pdf

    大家在面试中,最常见的问题肯定包含对hashmap相关问题,源码、多线程安全、1.7和1.8区别等等,本文详细总结了以上问题,希望对你有帮助!!

    java7hashmap源码-JAVA-:JAVA-

    hashmap源码 Notes 原理 basic 1 数据结构中各种东西的数量很很重要!!!可以考虑在在数据结构中定义一下 2 Java hashtable的contains用来查找是否存在value,和containsValue类似 查找key使用containskey方法, 3 ...

    java7hashmap源码-learning-record:学习轨迹记录

    hashmap源码 learning-record - 学习轨迹记录 10月1号 7月18号 基础算法:反转单向链表 7月16号 7月11号 7月9号 复习 : HashTable和HashMap的区别详解 LeetCode 27. 删除元素(Remove Element) 7月8号 7月5号 复习...

    java7hashmap源码-AndroidOffer:只为帮助您获得更好的报价

    hashmap源码 AndroidOffer Java Java 进阶 HashMap 对比:Hashtable、HashMap、LinkedHashMap、ConcurrentHashMap、TreeMap (看第六条就可以) HashMap 用什么数据结构实现的 加载因子是什么 HashMap 初始化传入的...

    hashtable C++无锁(std_atomic)&U32非0&不可扩大.rar

    基于原子操作的无锁hashtable源码

    Java容器之Hashtable源码分析

    在上一篇博客 Java容器之HashMap源码分析(妈妈再也不用担心我不懂HashMap了) 从源码层次分析了HashMap容器的底层实现,在本篇博客将继续从源码层次分析Hashtable的底层实现。   注明:以下源码分析都是基于jdk ...

    java7hashmap源码-WeishenTemp:WeishenTemp

    hashmap源码 Java 面试随着时间的改变而改变。在过去的日子里,当你知道 String 和 StringBuilder 的区别(String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象。因此在每次对 String ...

    Java集合框架源码剖析:HashSet 和 HashMap

     HashMap实现了Map接口,允许放入null元素,除该类未实现同步外,其余跟Hashtable大致相同,跟TreeMap不同,该容器不保证元素顺序,根据需要该容器可能会对元素重新哈希,元素的顺序也会被重新打散,因此不同时间...

    java源码整理包-集合

    java源码整理包:list,map,ArrayList,HashMap,HashSet,Hashtable,TreeMap,TreeSet,Vector等源码包分享

    java8源码-putaoo.github.io:putao.github.io

    区别、HashMap的底层实现、HashMap 和 Hashtable 的区别、HashMap 的长度为什么是2的幂次方、HashSet 和 HashMap 区别、ConcurrentHashMap 和 Hashtable 的区别、ConcurrentHashMap线程安全的具体实现方式/底层具体...

    java8源码-java-start::seedling::seedling::seedling:学习Java语法过程中的一些案例

    区别、HashMap的底层实现、HashMap 和 Hashtable 的区别、HashMap 的长度为什么是2的幂次方、HashSet 和 HashMap 区别、ConcurrentHashMap 和 Hashtable 的区别、ConcurrentHashMap线程安全的具体实现方式/底层具体...

    高级C语言详解

    目录 1. C 语言中的指针和内存...80. Hashtable和HashMap的区别 408 81. hash 表学习笔记 410 82. C程序设计常用算法源代码 412 83. C语言有头结点链表的经典实现 419 84. C语言惠通面试题 428 85. C语言常用宏定义 450

    史上最全的Java面试题集锦.pdf

    Hashmap 源码级掌握,扩容,红⿊树,最⼩树化容量,hash冲突解决,有些⾯试官会提出发⾃灵魂的审问,⽐如为什么是红⿊树, 别的树不可以吗;为什么8的时候树化,4不可以吗,等等 concureentHashMap,段锁,如何分段...

Global site tag (gtag.js) - Google Analytics