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