关于大数据:HashMap-和-Hashtable-区别

8次阅读

共计 1305 个字符,预计需要花费 4 分钟才能阅读完成。

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

HashMap 简直能够等价于 Hashtable,除了 HashMap 是非 synchronized 的,并能够承受 null(HashMap 能够承受为 null 的键值 (key) 和值(value),而 Hashtable 则不行)。

HashMap 是非 synchronized,而 Hashtable 是 synchronized,这意味着 Hashtable 是线程平安的,多个线程能够共享一个 Hashtable;而如果没有正确的同步的话,多个线程是不能共享 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 中的元素秩序是不变的。

要留神的一些重要术语:

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

Fail-safe 和 iterator 迭代器相干。如果某个汇合对象创立了 Iterator 或者 ListIterator,而后其它的线程试图“构造上”更改汇合对象,将会抛出 ConcurrentModificationException 异样。但其它线程能够通过 set()办法更改汇合对象是容许的,因为这并没有从“构造上”更改汇合。然而如果曾经从构造上进行了更改,再调用 set()办法,将会抛出 IllegalArgumentException 异样。

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

咱们是否让 HashMap 同步?

HashMap 能够通过上面的语句进行同步:

Map m = Collections.synchronizeMap(hashMap);

论断
Hashtable 和 HashMap 有几个次要的不同:线程平安以及速度。仅在你须要齐全的线程平安的时候应用 Hashtable,而如果你应用 Java 5 或以上的话,请应用 ConcurrentHashMap 吧。

正文完
 0