我什么时候应该使用Hashtable而不是HashMap

这不是关于HashtableHashMap之间差异的问题。 我知道Hashtable对象不能接受键或值条目的null值,它是同步集合,并且它使用的内存比HashMap略少。

我想知道使用Hashtable而不是HashMap更合适的场景。

这不是关于HashtableHashMap之间差异的问题

那真是……

我想知道使用Hashtable而不是HashMap更合适的场景。

准确地说,当你想要两者之间的差异时:

  • 当您想在Java 1.1上运行时
  • 当你想要同步每个操作时(只要你从不迭代它就获得一种线程安全forms ) – 并且由于某种原因不想在HashMap上使用Collections.synchronizedMap
  • 当您不希望能够存储空值时
  • 当记忆差异实际显着时(只有在你certificate了这种情况之后) – 我甚至都不知道这种差异,个人……
  • 当你被一个令人讨厌的API强制退回或接受Hashtable (相对很少,幸运的是)

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

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

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

我只能想到一个合理的原因 – 当你使用需要它的API时,比如JNDI极其恼人的InitialContext类 。

除此之外,我完全没有理由使用Hashtable 。 您可以使用Collections.synchronizedMap获取HashMap的同步版本。

我只看到遗留应用程序/库中的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

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

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

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

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