`
liuxinglanyue
  • 浏览: 562631 次
  • 性别: 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的区别(含源码分析)

    在Java编程语言中,`HashMap`和`HashTable`都是实现键值对存储的数据结构,但它们之间存在一些显著的区别,这些区别主要体现在线程安全性、性能、null值处理以及一些方法特性上。以下是对这两个类的详细分析: 1. ...

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

    Java集合专题总结:HashMap和HashTable源码...本文总结了HashMap和HashTable的源码学习和面试总结,涵盖了它们的存储结构、构造方法、get和put方法的源码分析、Hash表的特点和缺点、HashTable和HashMap的区别等内容。

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

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

    HashMap 源码分析

    然而,HashMap与HashTable的主要区别在于线程安全性:HashTable是线程安全的,而HashMap则不是。 JDK1.8之后,HashMap进行了性能优化,引入了红黑树的数据结构。当链表的长度超过一个阈值(默认为8)时,HashMap会...

    HashMap源码分析

    ### HashMap源码分析 #### 一、概述 `HashMap`是Java编程语言中非常重要的一个数据结构,它属于`java.util`包的一部分,是`Map`接口的一个具体实现类。`HashMap`允许存储键值对,并且支持使用`null`作为键或值,这...

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

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

    HashMap源码分析系列-第四弹:HashMap多线程解决方案.docx

    ### HashMap多线程解决方案 #### 一、引言 在多线程环境下,Java的`HashMap`类在处理并发操作时容易出现线程安全问题。本文档深入探讨了`HashMap`在多线程环境中可能遇到的安全问题,并提出了一系列可行的解决方案...

    HashMap资料.zip

    9. **HashMap与HashTable的区别**:HashTable是早期的线程安全版本,但它不允许null键和值,且性能较低,已经被ConcurrentHashMap所取代。 10. **面试常见问题**:面试中常问的问题包括HashMap的扩容机制、哈希冲突...

    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号 复习...

    对java基础集合部分(List、HashMap、HashSet、ArrayList等)底层源码的分析与总结

    HashMap不是线程安全的,如果需要线程安全的Map,可以使用Hashtable。 LinkedHashMap与HashMap类似,但保持了插入顺序或访问顺序。TreeMap使用红黑树,保证了键的排序。 总的来说,理解这些集合的底层实现对于优化...

    Java源码解析HashMap简介

    * HashMap不是同步的,和Hashtable不同的是,HashMap允许null元素。 * HashMap不保证map里的顺序,更进一步,随着时间的推移,它甚至不保证顺序一直不变。 在HashMap的源码实现中,我们可以看到HashMap的性能是非常...

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

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

    Java容器之Hashtable源码分析

    【Hashtable与HashMap的区别】 - 线程安全性:`Hashtable`是线程安全的,而`HashMap`不是。 - `null`值:`Hashtable`不允许`null`键和`null`值,而`HashMap`允许`null`键但不允许`null`值。 - 构造器默认容量:`...

    HashMap 的底层原理Java系列2021.pdf

    本文将详细探讨HashMap的底层原理,包括其数据结构、存取实现以及与Hashtable的区别。 1. HashMap的数据结构 数据结构是计算机存储、组织数据的方式,它决定了数据的操作效率。HashMap使用数组和链表的组合来实现,...

    Java集合类源码(摘自jr源码)

    在给定的压缩包文件中,包含了一些关键的集合类源码,如`TreeMap`、`Hashtable`、`ArrayList`、`HashMap`、`LinkedList`、`List`、`Map`、`TreeSet`、`LinkedHashMap`和`Set`。这些类都是Java集合框架的重要组成部分...

    java7hashmap源码-WeishenTemp:WeishenTemp

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

    java源码整理包-集合

    5. **HashMap与Hashtable的区别**:`HashMap`是非同步的,适合于单线程环境,而`Hashtable`是同步的,可以在多线程环境中安全使用。`HashMap`允许`null`键和值,而`Hashtable`不允许。 6. **TreeMap与TreeSet的特点...

    深入解读大厂java面试必考点之HashMap全套学习资料

    - HashMap和Hashtable的区别? - HashMap与HashSet的关系? - 如何解决哈希冲突? - 如何自定义键的哈希码生成方式? - 如何避免和处理HashMap中的循环链表? 通过深入学习和理解这些知识点,你将能够在面试中自信...

Global site tag (gtag.js) - Google Analytics