【问题标题】:Hashtable values displayed in Eclipse debuggerEclipse 调试器中显示的哈希表值
【发布时间】:2014-11-09 13:33:03
【问题描述】:

我在 Eclipse 中调试一个 Hashtable,发现了一些奇怪的东西。我的Hashtable变量名是“my_hashTable”,Eclipse调试器,如果我点击它,显示它的值为3:{first=0, third=2, second=1},和预期一样正确,计数是3 ,这也是正确的。

但是,如果我点击 my_hashTable 变量中的“table”变量,则显示只有两个非空值,[4] = 2 和 [5] = 0。其完整值如下:

[空,空,空,空,第三=2,第一=0,空]

为什么会这样? “second=1”对在哪里?这是我第一次在 Eclipse 中遇到这种奇怪的现象。

知道发生了什么吗?谢谢。

【问题讨论】:

  • 好问题。你也可以发一些图片吗?
  • 我想附上快照,但 SOF 不允许我这样做?
  • 不可能,你想加图片可以
  • 您看到不一致了吗?
  • 在图片中,my_hashtable 显示它有 3 个值,而 "table" 显示它只有索引 4 和 5 中的值。

标签: java eclipse debugging hashtable


【解决方案1】:

出现上述情况是因为HashTable结构,其中表数组以Map$Entry的形式存储键值对。如果两个键散列到同一个桶使用Object hashcode() and the underlying Collection's hashing algorithm ,它们将以 使用每个 Map$Entry 对象中存在的下一个引用的单链表的形式放入同一个存储桶(例如 table[j] )中。因此,每个表索引包含一个 Map$EntryObject 引用 next Map$EntryObject 具有相同的 hashbucket(但根据 Key Object 的 equals() 方法,其键 不相等) . 问题是,根据 Key 的 equals() 方法,键将不相等,但它们的存储桶索引将相同 using the hashcode() and hashing algorithm applied.

只需为下一个扩展任何可见的表索引,您就会找到Map$Entry 形式的键值对。

存储在表数组中的每个Map$Entry具有以下结构:-

1)key 
2)value
3)hashcode
4)next -contains reference of next Map$Entry

这就是基于散列的集合的工作原理。散列算法返回相同索引的对象作为单个链表存储在同一个桶(表索引)中。

【讨论】:

  • +1 好的,int index = (hash & 0x7FFFFFFF) % tab.length; 当我们调用 put on hashtable 时会发生这种情况。
  • @Rp 谢谢。我还想指出,如果 HashTable(或 HashMap)中没有调整大小的方法()并且我声明了一个初始大小为 1 的 HashMap,那么添加元素会总是显示一个桶。 :) ..
  • 是的,我找到了。 “第三”和“第二”在同一个列表中。那么两个字符串“第三”和“第二”可以潜在地散列到同一个索引?
  • @martin 当然,但它们使用 equals 方法进行区分。这就是为什么基于哈希的集合必须使用具有良好哈希算法的对象作为键的原因。它们最好返回不同的哈希码不同的对象
  • 这是否意味着在这个例子中应该使用更好的散列算法?事实上,hashtable 存储了一个 String -> Integer 对,并且默认情况下 Java 应该已经提供了散列。还能更好吗?
猜你喜欢
  • 2015-11-02
  • 2020-03-02
  • 2015-09-14
  • 2015-06-27
  • 2015-09-22
  • 2013-05-09
  • 2022-11-23
  • 1970-01-01
  • 2021-05-02
相关资源
最近更新 更多