Java中HashTable和HashMap的区别_动力节点Java学院整理

 更新时间:2017年04月27日 11:07:05   投稿:mrr  
HashTable和HashMap主要的区别有:线程安全性,同步(synchronization),以及速度。接下来通过本文给大家简单介绍下HashTable和HashMap的区别,需要的的朋友参考下吧

HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的区别。主要的区别有:线程安全性,同步(synchronization),以及速度。

HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap allows one null key and any number of null values.,而Hashtable则不行)。这就是说,HashMap中如果在表中没有发现搜索键,或者如果发现了搜索键,但它是一个空的值,那么get()将返回null。如果有必要,用containKey()方法来区别这两种情况。

HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。 即是说,在多线程应用程序中,不用专门的操作就安全地可以使用Hashtable了;而对于HashMap,则需要额外的同步机制。但HashMap的同步问题可通过Collections的一个静态方法得到解决:

    Map Collections.synchronizedMap(Map m)

   这个方法返回一个同步的Map,这个Map封装了底层的HashMap的所有方法,使得底层的HashMap即使是在多线程的环境中也是安全的。而且Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。

另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。

由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。

HashMap不能保证随着时间的推移Map中的元素次序是不变的。

哈希值的使用不同,HashTable直接使用对象的hashCode,代码是这样的:

 int hash = key.hashCode();
   int index = (hash & 0x7FFFFFFF) % tab.length;

而HashMap重新计算hash值,而且用与代替求模:

int hash = hash(k);
int i = indexFor(hash, table.length);

要注意的一些重要术语:

1) sychronized意味着在一次仅有一个线程能够更改Hashtable。就是说任何线程要更新Hashtable时要首先获得同步锁,其它线程要等到同步锁被释放之后才能再次获得同步锁更新Hashtable。

2) Fail-safe和iterator迭代器相关。如果某个集合对象创建了Iterator或者ListIterator,然后其它的线程试图“结构上”更改集合对象,将会抛出ConcurrentModificationException异常。但其它线程可以通过set()方法更改集合对象是允许的,因为这并没有从“结构上”更改集合。但是假如已经从结构上进行了更改,再调用set()方法,将会抛出IllegalArgumentException异常。

3) 结构上的更改指的是删除或者插入一个元素,这样会影响到map的结构。

以上所述是小编给大家介绍的HashTable和HashMap的区别_动力节点Java学院整理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • 详解java8在Collection中新增加的方法removeIf

    详解java8在Collection中新增加的方法removeIf

    这篇文章主要介绍了详解java8在Collection中新增加的方法removeIf的相关资料,需要的朋友可以参考下
    2018-01-01
  • Java微信公众平台开发(2) 微信服务器post消息体的接收

    Java微信公众平台开发(2) 微信服务器post消息体的接收

    这篇文章主要为大家详细介绍了Java微信公众平台开发第二步,微信服务器post消息体的接收,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • Java Bigdecimal使用原理详解

    Java Bigdecimal使用原理详解

    这篇文章主要介绍了Java Bigdecimal使用原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • xxl-job如何滥用netty导致的问题及解决方案

    xxl-job如何滥用netty导致的问题及解决方案

    本篇文章讲解xxl-job作为一款分布式任务调度系统是如何滥用netty的,导致了怎样的后果以及如何修改源码解决这些问题,netty作为一种高性能的网络编程框架,十分受大家喜爱,今天就xxl-job滥用netty这一问题给大家详细下,感兴趣的朋友一起看看吧
    2021-05-05
  • java-collection中的null,isEmpty用法

    java-collection中的null,isEmpty用法

    这篇文章主要介绍了java-collection中的null,isEmpty用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • SkyWalking 自定义插件(Spring RabbitMQ)具体分析过程

    SkyWalking 自定义插件(Spring RabbitMQ)具体分析过程

    这篇文章主要介绍了SkyWalking 自定义插件(Spring RabbitMQ)具体分析过程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • Spring Boot Shiro在Web应用中的作用详解

    Spring Boot Shiro在Web应用中的作用详解

    这篇文章主要为大家介绍了Spring Boot Shiro在Web应用中的作用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Java中BufferedReader与Scanner读入的区别详解

    Java中BufferedReader与Scanner读入的区别详解

    这篇文章主要介绍了Java中BufferedReader与Scanner读入的区别详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • java实现上传网络图片到微信临时素材

    java实现上传网络图片到微信临时素材

    这篇文章主要为大家详细介绍了java实现上传网络图片到微信临时素材,网络图片上传到微信服务器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • Mybatis中如何进行批量更新(updateBatch)

    Mybatis中如何进行批量更新(updateBatch)

    这篇文章主要介绍了Mybatis中如何进行批量更新(updateBatch),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05

最新评论