关于哈希集中包含方法的问题

时间:2014-06-08 16:43:12

标签: java contains hashcode hashset

我是一名高中生,所以我为我可能滥用的条款道歉。

所以我正在制作一个幻灯片益智游戏,并在AI部分工作。所以我有一个构造函数构造板并分配其哈希码,如123456780.在我的A *算法中,我比较我生成的板(找到解决方案)是否已经在hashset中。所以我使用contains方法吧?但是contains方法如何检查两块板是否相同?

    public Board()
    {
            board = new int [3][3];
            setPieces (board);
            hashCode = generateHashCode ();
    }

这是我的构造函数之一。在我的board对象中,我有2D数组和hashcode。但我再次想知道,如果内置包含哈希集中的方法比较两个板哈希码。或者我需要写一个。

另外,当我将哈希码分配给一个主板时,我应该在我的构造函数中做到这一点吗?

谢谢你

2 个答案:

答案 0 :(得分:1)

正如您所发现的,您需要在覆盖的hashCode()方法中返回对象的哈希码。

您可以在该方法中计算哈希码,或者在ctor中计算哈希码并将其存储在字段中,然后在方法覆盖中返回该字段。

答案 1 :(得分:0)

任何使用' Hash' prefix通过其hashcode将集合中包含的所有对象存储在组中。因此,当您调用类似contains()的方法时,集合将循环遍历每个哈希码组,并检查您解析的对象的哈希码是否与该组匹配。找到匹配项后,将使用存储对象的equals()方法检查该哈希码组中的对象,直到Object的{​​{1}}方法返回equals()为止

如果不覆盖true方法,则hashcode()方法的Object类实现会为每个Object子类提供或多或少的唯一哈希码。如果您已经覆盖了hashcode()方法,这可能会导致一些问题,因为如果两个对象被认为是相等的,那么如果哈希码不匹配,equals()方法可能仍然找不到它。

哈希码合约:

实现contains()时,Java Object API已经制定了合同或一组关于如何实现hashcode方法的规范。他们是;

  • 如果对象多次运行hashcode(),则必须始终返回相同的数字。
  • 如果hashcode()方法认为两个对象相等,则其equals()方法必须返回相同的值。
  • 如果两个对象具有相同的哈希码,则hashcode()方法不必将它们视为相等。

<强>参考文献: