我知道这可能是一个天真的问题,但我真的需要帮助! 当我使用HashSet并在某些功能中使用它时,在某些时候, content char [] []可能会被更改。我想使用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");
}
这是问题所在!无论董事会是否改变其内容,每次返回“true”;
任何人都可以提供帮助??
我看到了评论并感谢您的回复。 char [] []板是一张地图,我想找到一条路径 在地图上。 “for”循环实际上是从4个方向找到路径的搜索算法。所以每次董事会的内容都会发生变化,我想缩短副本。这就是我使用hashset存储我已经走过的路径或地图的原因。
答案 0 :(得分:3)
HashSet
在内部使用hashCode
和equals
方法来判断两个对象是否相等。对于数组,hashCode
和equals
不会查看数组的内容。相反,它们只是根据对象的身份生成一个哈希码,当且仅当它们是同一个对象时,两个数组才相等。这意味着如果您将数组放入HashSet
然后在更改内容后尝试查找该数组,它将始终找到它。
这里的另一个细节是你将数组放入HashSet
然后在外部更改数组的内容,因为数组是一个对象,你也要更改放入数组的数组的副本。首先是HashSet
!
为了解决这个问题,我建议在数组周围定义一个包装类,然后重写equals
和hashCode
以根据数组的内容检查相等性,并从中计算哈希代码内容。
希望这有帮助!