即使字符串和哈希码不同,Java Hashtable .containsKey(String key)也返回true ...如何?

时间:2011-04-12 08:21:15

标签: java string key hashtable hashcode

我目前在java中使用Hashtable存在一些问题,其中FEightPuzzle是我创建的一个类。

在我的类中,我有一个String,它存储每个实例的密钥。现在,在我的程序中,当我在Hashtable中检查重复的实例时,我有时会“找到”一些真正找到的实例。

例如,当我调用bol.containsKey(current.key)时,bol是HT,current是FEightPuzzle。

如果这是真的,我检查键的值,它们是

current.key =
"8 14 11 0 6 12 13 1 10 4 5 9 15 2 3 7"

bol.get(current.key).key =
"12 8 4 0 13 9 5 1 14 10 6 2 15 11 7 3"

带值

current.key.hashCode() = -950607924

bol.get(current.key).key.hashCode() = -1856769042

我很抱歉打扰你,但这个问题真的让我感到高兴,这是我今晚要做的最后一件事是诚实的(你不喜欢那样)......任何提示或答案都将不胜感激!

2 个答案:

答案 0 :(得分:5)

我已经重读了您的问题,据我了解,您遇到以下问题:

你做

bol.containsKey(current.key)

检查current中是否已bol

当它返回true时,您希望current.key映射到的值确实应该是current,但正如您的哈希码所示,它不是。

问题可能是以下之一:

  1. 您没有将拼图对象放在哈希表中。

    你应该做

    bol.put(somePuzzle.key, somePuzzle)
    
  2. 当拼图在地图中时,您更改了密钥。这是不允许的。

    在地图中添加条目后,如果不删除/重新插入地图,则可能无法更改密钥。

    Hashtable将根据您在插入时提供的密钥查找对象。

  3. 您不小心为多个不同的拼图对象提供了相同的密钥(在这种情况下,一个put将覆盖前一个


  4. 一个建议是让FEightPuzzle覆盖hashCode和equals并使用HashSet而不是Hashtable。

答案 1 :(得分:0)

我想也许你误解了Hashtable的作用。它将键映射到值。因此,在密钥上调用get(key)将返回您使用put(key, value)提供的值。现在,如果你总是把相同的值作为键,你应该期望相同的东西,但是在这种情况下你只需要HashSet。如果你为不同的密钥输入相同的值,它将允许这样做。只有密钥在Hashtable中是唯一的(HashMap是相同的)。