【问题标题】:hash table internal index哈希表内部索引
【发布时间】:2012-11-10 04:13:59
【问题描述】:

如何获得 Java Hashtable 的内部数组表示?我知道哈希表只是巧妙组织的数组,我想使用每个键的索引,这样我就可以与不相交集并行工作。

我需要两件事之一:

  1. 用于将我的键转换为哈希表内部数组中的索引的哈希函数
  2. 键的对应索引。

【问题讨论】:

  • 我认为如果你需要这样的东西你最好使用你自己的哈希表实现。或者从某处复制现有的并使用它。因为如果你使用一些第三方或标准类,它的内部实现可能会发生变化,你的程序就会崩溃。
  • 好吧,我只是很忙,希望能绕过重写我的一个哈希表。总之谢谢大家。

标签: java data-structures hash hashtable


【解决方案1】:

注意 1:在 90% 的情况下,您可能应该使用 HashMap 类而不是 Hashtable

注意 2:实际上大多数哈希表将 list 与数组结合起来,以处理哈希冲突。

一般来说,您应该能够访问Java实现附带的类的内部。这将破坏 Java 提供清晰分离接口和实现的能力的全部目的。

相反,我建议您创建一个新类,例如MyHashMap 通过从 Java 开发工具包中复制 HashMap 实现的源代码。通过拥有自己的副本,您可以完全控制,并且不会在 JRE 更新后遭受意外损坏。你可以找到 OpenJDK HashMap 实现 here

PS:理论上,您可以尝试使用反射访问HashMap 内部,但生成的代码会糟糕并且性能更差...

【讨论】:

  • 哈希图有什么好处?我只是还没有了解它们。
  • @BenKellman:在内部,这两个类非常相似——主要区别在于Hashtable 是同步的,这通常意味着相当不必要的开销。它也有点老了,这意味着它的接口相对杂乱无章,新类不再使用这些接口。
【解决方案2】:

我相信您可以通过反射访问任何字段,只需查看 Hashtable 内部结构。

或者您只是在寻找代码示例?

【讨论】:

    【解决方案3】:

    创建一个类似哈希表的类,按字母顺序为键分配索引。出于您的目的,扩展 HashMap 或类似的东西可能甚至没有必要。会很有趣的。

    【讨论】:

      猜你喜欢
      • 2014-08-24
      • 1970-01-01
      • 1970-01-01
      • 2017-03-26
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      • 2012-01-03
      • 2011-08-18
      相关资源
      最近更新 更多