Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于Hash集中contains方法的问题_Java_Contains_Hashcode_Hashset - Fatal编程技术网

Java 关于Hash集中contains方法的问题

Java 关于Hash集中contains方法的问题,java,contains,hashcode,hashset,Java,Contains,Hashcode,Hashset,我是一名高中生,因此我为可能误用的条款道歉 因此,我正在制作一个幻灯片益智游戏,并致力于AI部分。所以我有一个构造函数来构造board并分配它的哈希代码,比如123456780。在我的A*算法中,我比较我生成的板(找到解决方案)是否已经在哈希集中。所以我用contains方法来做,对吗?但是contains方法是如何检查两块板是否相同的呢 public Board() { board = new int [3][3]; setPie

我是一名高中生,因此我为可能误用的条款道歉

因此,我正在制作一个幻灯片益智游戏,并致力于AI部分。所以我有一个构造函数来构造board并分配它的哈希代码,比如123456780。在我的A*算法中,我比较我生成的板(找到解决方案)是否已经在哈希集中。所以我用contains方法来做,对吗?但是contains方法是如何检查两块板是否相同的呢

    public Board()
    {
            board = new int [3][3];
            setPieces (board);
            hashCode = generateHashCode ();
    }
这是我的一个构造函数。在我的board对象中,我有2D数组和哈希代码。但我再次怀疑,如果内置的Hash集合中包含方法,请比较两块板的hashcode。或者我需要写一个

另外,当我把散列码分配给一块电路板时,我应该在构造函数中进行,对吗


谢谢您

任何使用“哈希”前缀的集合都将集合中包含的所有对象按其哈希代码分组存储。因此,当您调用像
contains()
这样的方法时,集合将循环遍历每个hashcode组,并检查您在其中解析的对象的hashcode是否与该组匹配。当找到匹配项时,使用存储对象的
equals()
方法检查hashcode组中的对象,直到
对象的
equals()
方法返回
true

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

hashcode合同: 在实现
hashcode()
时,Java对象API已经就如何实现hashcode方法制定了一份合同或一组规范。他们是

  • 如果在对象上多次运行
    hashcode()
    ,则它必须始终返回相同的数字
  • 如果
    equals()
    方法认为两个对象相等,那么它们的
    hashcode()
    方法必须返回相同的值
  • 如果两个对象具有相同的hashcode,则它们的
    equals()
    方法不必认为它们相等
参考文献:


正如您所发现的,您需要在重写的
hashcode()
方法中为您的对象返回一个hashcode


您可以在该方法中计算哈希代码,也可以在ctor中计算哈希代码并将其存储在字段中,然后在方法重写中返回该字段。

您是否查看了文档?文档是什么意思?HashSet类的文档,这回答了你所有的问题。@SLaks:我能问你一个很快的问题吗?显然,我可以重写我不知道的hashCode()。。。我是否在构造函数中使用该方法?我的意思是,我在构造函数中分配哈希代码吗?Thanks@FamilyMaze-如果您的问题已经解决,请不要忘记对任何您认为有用的答案进行投票,并通过单击灰色勾号接受最能回答您问题的答案。如果到目前为止没有一个答案是足够的,如果你找到了另一个解决方案,你可以发布你自己的答案。但是如果hashcode是在构造函数中计算的,那么对象必须是不可变的!!!如果hashcode是在
hashcode()
中计算的,但被缓存了,因此它不是多次计算的,则同样适用times@SvetlinZarev:是;不能对相等相关字段进行变异。