第四章 java中Hashtable和HashMap的区别


当我开始使用它们时,我使用了它们中的任何一个,而不管它们之间的差异。后来我发现它们之间存在明显的差异,这会影响你的应用程序的性能。.在我们真正看到差异之前,让我给你简单介绍一下两者。

HashMap实现 了Map 接口,该接口将键映射到值。它不是同步的,也不是线程安全的。不允许重复键,并且允许空键和值。

HashMap<Interger,String> employeeHashmap=new HashMap<Integer,String>();
employeeHashmap.put(1,"Arpit");
employeeHashmap.put(2,null);  // will work fine

哈希表

Hashtable 实现了 Map接口,将键映射到值。它是同步的和线程安全的。不允许重复键,也不允许空键。

Hashtable<Interger,String> employeeHashmap=new Hashtable<Integer,String>();
employeeHashmap.put(1,"Arpit");
employeeHashmap.put(2,null);  //not allowed and will throw NullPointer exception at run time

哈希表与哈希映射:

范围 哈希表 哈希映射
线程安全
同步
表现 由于adSafe和Synchronized,它通常比HashMap慢 在单线程环境下,它比Hashtable快很多。所以如果你不在多线程环境下工作,那么推荐使用hashMap
空键 不允许 允许空键和值
快速失败 哈希表中的枚举不会快速失败 hashMap 中的迭代器快速失败
扩展 它扩展了相当古老的 Dictionary 类 它扩展了 AbstractMap 类
选择 别无选择 您可以将 ConcurrentHashMap 用于多线程环境

一些重要的问题需要讨论。

  • 同步意味着在一个时间点只有一个线程可以修改一张表。当任何线程对哈希表执行更新操作时,它会在其上获取锁,其他线程必须等待锁被释放。
  • Fail-fast迭代器意味着如果一个线程正在迭代hashmap,而另一个线程试图在结构上修改hashmap,它将抛出ConcurrentModification Exception并立即失败。结构修改是指插入或删除可以改变地图结构的元素。

我们可以同步HashMap吗?

是的,我们也可以在 Collections.synchonizedMap(hashmap) 的帮助下同步 HashMap,因此 HashMap 可以通过

Map map=Collections.synchonizedMap(hashmap)


原文链接:https://codingdict.com/