Java中HashMap和HashTable区别

Wesley13
• 阅读 655

        前几天被一家公司电面的时候被问到HashMap和HashTable的区别,当时就懵逼了,hashTable是个啥?从来没用过啊,于是电面完之后马上google了一把,这回涨姿势了;

        HashMap和HashTable同属于Java.util包下的集合类,Hashtable是个过时的集合类,存在于Java API中很久了。在Java 4中被重写了,实现了Map接口,所以自此以后也成了Java集合框架中的一部分。

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

对比项

HashMap

HashTable

是否线程安全

是否synchronized

是否支持多线程共享

在有正确的同步机制的前提下可以支持多线程共享

支持

单线程效率

只随时间推移元素次序是否不变

不一定

是否支持null的key和value

支持

不支持

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

        Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。同时HashMap也可以通过以下方式进行同步操作,返回的Map就是一个

HashMap<String, String> hashMap = new HashMap<String, String>();
Map map = Collections.synchronizedMap(hashMap);
*****synchronizedMap的方法API描述*****
Returns a synchronized (thread-safe) map backed by the specified map. In order 
to guarantee serial access, it is critical that all access to 
the backing map is accomplished through the returned map.It is imperative that the user manually synchronize on the returned map when 
iterating over any of its collection views:
  Map m = Collections.synchronizedMap(new HashMap());
      ...
  Set s = m.keySet();  // Needn't be in synchronized block
      ...
  synchronized(m) {  // Synchronizing on m, not s!
      Iterator i = s.iterator(); // Must be in synchronized block
      while (i.hasNext())
          foo(i.next());
  } 
Failure to follow this advice may result in non-deterministic behavior.The returned map will be serializable if the specified map is serializable.
Parameters:
m the map to be "wrapped" in a synchronized map.
Returns:
a synchronized view of the specified map.

        一般的话仅在需要 完全的线程安全的时候使用Hashtable,而如果你使用Java 5或以上的话,请使用ConcurrentHashMap代替HashTable;

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java HashMap、HashTable、ConcurrentHashMap区别
!(https://oscimg.oschina.net/oscnet/aa0d819c31874aa329f899885a37e352a24.png)HashTable底层数组链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,Con
Stella981 Stella981
3年前
HashMap Hashtable区别
 分类: java基础(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fblog.csdn.net%2Fshohokuf%2Farticle%2Fcategory%2F434442)2009022417:26 21310人阅读 评论(https://w
Wesley13 Wesley13
3年前
Java学习之ConcurrentHashMap实现一个本地缓存
  ConcurrentHashMap融合了Hashtable和HashMap二者的优势。  Hashtable是做了线程同步,HashMap未考虑同步。所以HashMap在单线程下效率较高,Hashtable在多线程下同步操作能保证程序的正确性。 但是Hashtable每次执行同步操作都需要锁住整个结构。  !(https://oscimg.
Wesley13 Wesley13
3年前
Java面试总结
1. HashMap与HashTable的区别Hashmap的key、value都可以为空,但key只能有一个为空,value可以有多个,非同步HashTable的key、value都不能为空,是同步的,线程安全因为hashtable,concurrenthashmap它们是用于多线
Wesley13 Wesley13
3年前
Java提高篇——equals()与hashCode()方法详解
阅读目录equals()方法详解hashcode()方法详解Hashset、Hashmap、Hashtable与hashcode()和Equals()的密切关系java.lang.Object类中有两个非常重要的方法:publicbooleanequals(Objectobj)pub
Stella981 Stella981
3年前
HashMap Hashtable 的区别
Hashtable 和 HashMap作为 Map 的基本特性两者都实现了Map接口,基本特性相同\          对同一个Key,只会有一个对应的value值存在\          如何算是同一个Key?首先,两个key对象的hash值相同,其次,key对象的equals方法返回真内部数据结构Hashtab
Java HashMap 的工作原理详解
JavaHashMap的工作原理详解HashMap的工作原理是近年来常见的java面试题。几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道Hashtable和HashMap之间的区别,那么为何这道面试题如此特殊呢?是因为这道题
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这