我应该何时使用Hashtable与HashMap

时间:2012-03-02 15:40:12

标签: java collections hashmap hashtable

这不是关于HashtableHashMap之间差异的问题。我了解Hashtable对象无法接受null值键或值条目,它是同步集合,它使用的内存略少于HashMap

我想知道使用Hashtable代替HashMap更合适的情况。

5 个答案:

答案 0 :(得分:27)

  

这不是关于HashtableHashMap

之间差异的问题

那真是......

  

我想知道使用Hashtable代替HashMap更合适的情况。

正是当你想要两者之间的差异时:

  • 如果要在Java 1.1上运行
  • 当您希望每个操作同步时(获得线程安全的表单,只要您从不迭代它) - 并且由于某种原因不想使用{{1超过Collections.synchronizedMap
  • 如果您不希望能够存储空值
  • 当内存差异实际显着时(只有在证明之后才是这种情况) - 我个人甚至都不知道这种差异......
  • 当你被迫使用一个令人讨厌的API返回或需要HashMap时(幸运的是相对罕见)

我不记得上次我遇到过这种情况,我个人认为 - 在现代Java代码中使用Hashtable是不合适的。

答案 1 :(得分:14)

从不。 Hashtable是Java 1中地图的原始实现。它已经被Map实现所取代。当然,Hashtable已被改装以匹配,但这并不是非常有用。

它的主要问题在于它是同步的。这意味着它在线程之间共享的任何情况下都会很慢。在这种情况下,ConcurrentHashMap是更好的选择。如果您在单个线程上运行,那么未同步的HashMap是更好的选择。

答案 2 :(得分:7)

我只考虑一个有效的原因 - 当您使用需要它的API时,例如JNDI's hugely irritating InitialContext class

除此之外,我认为根本没有理由使用Hashtable。您可以使用HashMap获得Collections.synchronizedMap的同步版本。

答案 3 :(得分:3)

我只在遗留应用程序/库中看到Hashtables。

如果可以的话,如果需要同步Map,请使用ConcurrentHashMap或Collections.synchronizedMap。

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentHashMap.html

http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#synchronizedMap%28java.util.Map%29

答案 4 :(得分:1)

知道何时使用一个类或结构而不是另一个类或结构基本上理解两者之间的差异,并根据这些差异决定哪一个最适合手头的问题。

  

我知道Hashtable对象不能接受空值

因此,在您需要存储空值的情况下,Hashtable不合适。

此外,在Hashtable中,枚举不是故障安全的。因此,如果您需要在枚举时更改结构的内容,Hashtable会更合适。