【问题标题】:Using Java Dictionary...use a Hashtable?使用 Java 字典...使用哈希表?
【发布时间】:2012-07-16 20:32:59
【问题描述】:

我有点惊讶没有人询问这个具体案例,因为它在 java 标准库中有点奇怪:

我正在使用带有自定义标签的 swing JSlider;唯一可用于分配标签的库调用是:setLabelTable(Dictionary labels)

但 Dictionary 是一个抽象类,它在标准库中唯一已知的子类是 Hashtable,api 和各种 IDE 抱怨它是“过时的”。

显而易见的事情就是使用哈希表,但我想知道两件事:

  1. 有没有更好的方法来解决这个问题?
  2. 如果 Hashtable 是唯一的 这个(在我看来)相当重要的库的可用类 调用,在什么基础上“过时”?

谢谢!

【问题讨论】:

    标签: java swing jslider


    【解决方案1】:

    Hashtable 过时的原因是because it was was replaced with Hashmap

    但是,为了给 setLabelTable 分配标签,Hashtable 的“缺陷”不是问题。

    【讨论】:

    • 在检查了HashMapHashTable 的Java 文档后,我看不出它在哪里说HashTable 被HashMap 取代(甚至在建议的链接中也没有),而是HashMap 有更多的优势与使用 HashTable 相比,如果您需要同步地图,您应该使用 ConcurrentHashMap。如果我错了,请赐教或发布 Java 鼓励停止使用 HashTable。
    • @LuiggiMendoza - 根据 Sun/Oracle,它没有被“正式”替换;但是 StackOveflow consensus 显然是 HashMap 是最好的“通用”替代品。
    • 谢谢,它和我的类似,但我仍然不觉得我应该说“HashMap 是 HashTable 的替代品”,至少 Sun/Oracle 还没有正式发布(然而)。
    • Sooo... 我们用什么代替 Dictionary 来更改 JSlider 标签?我尝试发送一个 HashMap 作为参数,但由于类型不兼容,它显然不起作用。
    【解决方案2】:

    它已过时,因为它已被 java.util.HashMap 取代。主要区别在于 HashTable 上的方法是同步的,而 HashMap 允许使用空指针作为键。

    现代版本的 java 在无争议的同步操作的性能方面取得了长足的进步,因此不再像过去那样担心性能问题。 (如果您在主要平台上运行最新的 JDK。)如果 API 需要 HashTable,请继续使用它。

    【讨论】:

    • 好吧,但是为什么没有采用 HashMap 的 setLabelTable 实现呢?也许我的困惑是我不明白“过时”对我来说应该是什么,因为名义上保留“过时”类型的调用似乎很奇怪。
    • 多年来,Java 一直非常重视 100% 的向后兼容性。 1995 年编写的代码预计将针对最新的运行时进行编译和运行,因此,有时您会在 API 中得到奇怪的东西。如果他们将方法更改为采用 java.util.Map,旧的 JAR 将不再在最新的运行时中运行。
    【解决方案3】:

    DictionaryMapHashTable “替换”为HashMap
    HashTable 很慢,因为它是同步的,所以 HashMap 是标准选择。
    我不确定您为什么担心使用“遗留”数据结构,因为如果您必须使用JSlider,则必须使用HashMap
    也许您应该想知道要使用哪些小部件?只是一个想法......

    【讨论】:

    • 我不确定我是否理解您关于考虑使用哪个小部件的建议。我想使用滑块。您是否建议在摇摆中有替代方案?
    猜你喜欢
    • 1970-01-01
    • 2011-10-08
    • 2013-03-21
    • 2012-08-23
    • 2014-01-04
    • 1970-01-01
    • 2010-11-28
    • 2010-10-31
    • 2010-10-18
    相关资源
    最近更新 更多