Java 当包含对象时,无论内容是否更改,HashSet都返回true

Java 当包含对象时,无论内容是否更改,HashSet都返回true,java,hashset,Java,Hashset,我知道这可能是一个幼稚的问题,但我真的需要帮助! 当我使用HashSet并在某个函数中使用它时 可能会更改内容字符[]。我想使用HashSet来检查它是否包含该值,但无论值是否更改,每次它都返回true 例如: HashSet<char[][]> visited = new HashSet<char[][]>(); char[][] board = Board.board // initialization; visited.add(board); for(int i

我知道这可能是一个幼稚的问题,但我真的需要帮助! 当我使用HashSet并在某个函数中使用它时 可能会更改内容字符[]。我想使用HashSet来检查它是否包含该值,但无论值是否更改,每次它都返回true

例如:

HashSet<char[][]> visited = new HashSet<char[][]>();
char[][] board = Board.board // initialization;
visited.add(board);

for(int i = 0; i < 4; i++){
if(visited.contains(board)
System.out.println("Why");
}
HashSet=newhashset();
char[][]board=board.board//初始化;
添加(董事会);
对于(int i=0;i<4;i++){
if(已访问。包含(板)
System.out.println(“为什么”);
}
问题就在这里!无论板内容如何更改,每次都返回“true”

有人能帮忙吗

我看到了评论,感谢您的回复。char[][]板是一个地图,我想找到一条路径
在地图上,“为了”loop实际上是从4个方向查找路径的搜索算法。因此,每次板的内容发生变化时,我都希望缩短重复的内容。这就是为什么我使用hashset来存储我已经走过的路径或地图。

hashset
内部使用
hashCode
equals
方法来告诉我f两个对象是相等的。对于数组,
hashCode
equals
不查看数组的内容。相反,它们只是根据对象的标识生成一个哈希代码,并且两个数组在且仅当它们是同一对象时比较相等。这意味着如果将数组放入
HashSet
中,然后重试在更改内容后查找该数组,它将始终找到它

这里的另一个细节是,您将数组放入
哈希集
,然后在外部更改数组的内容,因为数组是一个对象,所以您首先也要更改放入
哈希集
的数组的副本

为了解决这个问题,我建议在数组周围定义一个包装类,然后重写
equals
hashCode
,以基于数组的内容检查是否相等,并根据内容计算哈希代码


希望这有帮助!

HashSet
在内部使用
hashCode
equals
方法来判断两个对象是否相等。对于数组,
hashCode
equals
不查看数组的内容。相反,它们只是根据对象的标识生成一个哈希代码,两个数组共同生成mpare相等当且仅当它们是同一对象时。这意味着,如果将数组放入
哈希集中,然后在更改内容后尝试查找该数组,它将始终找到该数组

这里的另一个细节是,您将数组放入
哈希集
,然后在外部更改数组的内容,因为数组是一个对象,所以您首先也要更改放入
哈希集
的数组的副本

为了解决这个问题,我建议在数组周围定义一个包装类,然后重写
equals
hashCode
,以基于数组的内容检查是否相等,并根据内容计算哈希代码


希望这有帮助!

HashSet
在内部使用
hashCode
equals
方法来判断两个对象是否相等。对于数组,
hashCode
equals
不查看数组的内容。相反,它们只是根据对象的标识生成一个哈希代码,两个数组共同生成mpare相等当且仅当它们是同一对象时。这意味着,如果将数组放入
哈希集中,然后在更改内容后尝试查找该数组,它将始终找到该数组

这里的另一个细节是,您将数组放入
哈希集
,然后在外部更改数组的内容,因为数组是一个对象,所以您首先也要更改放入
哈希集
的数组的副本

为了解决这个问题,我建议在数组周围定义一个包装类,然后重写
equals
hashCode
,以基于数组的内容检查是否相等,并根据内容计算哈希代码


希望这有帮助!

HashSet
在内部使用
hashCode
equals
方法来判断两个对象是否相等。对于数组,
hashCode
equals
不查看数组的内容。相反,它们只是根据对象的标识生成一个哈希代码,两个数组共同生成mpare相等当且仅当它们是同一对象时。这意味着,如果将数组放入
哈希集中,然后在更改内容后尝试查找该数组,它将始终找到该数组

这里的另一个细节是,您将数组放入
哈希集
,然后在外部更改数组的内容,因为数组是一个对象,所以您首先也要更改放入
哈希集
的数组的副本

为了解决这个问题,我建议在数组周围定义一个包装类,然后重写
equals
hashCode
,以基于数组的内容检查是否相等,并根据内容计算哈希代码


希望这有帮助!

也许您可以提供一个完整的代码示例,说明没有达到预期效果的代码?您提供的4次执行相同操作并获得相同结果的示例并没有真正说明问题:)如果您总是测试同一个对象,那么您为什么期望不同的结果?此外,普通数组是不同的,即使它们具有相同的长度和大小,也没有相同的哈希代码。我想在映射上找到路径,这就是问题中的“char[][]board”。我想使用hashset来避免重复的路径或映射。所有的
char[][]
对象都是不同的,而不考虑