如何解决HashSet似乎没有意识到两个对象是相同的
您需要重写该类中的Object#hashCode()
方法,Move
以使其hashCode()
为Move
实例状态返回相同的值。不要忘记也要覆盖Object#equals()
。
也可以看看:
:如果您使用的是类似Eclipse的IDE
,则还可以自动生成它们。右键单击Move
该类的某个位置,选择“ 源” >“生成hashCode()和equals()”。如下所示:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + move1;
result = prime * result + move2;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Move other = (Move) obj;
if (move1 != other.move1)
return false;
if (move2 != other.move2)
return false;
return true;
}
解决方法
我正在尝试使用HashSet来存储我创建的类的对象,但是显然相同的对象似乎具有两个不同的哈希,这就是为什么contains方法没有意识到该对象已经在HashSet中的原因。这导致我的程序用尽了堆内存。
我认为我没有做错任何事情,但是无论如何我都希望有第二意见。我已经做过类似的操作,但一切正常,这使它特别烦人。我将不胜感激。
这是我的代码
move1 = new Move(t,s);
if(move1.hashCode()==new Move(t,s).hashCode())
System.out.println("match");
move2 = new Move(s,t);
moves.add(move1);
moves.add(move2);
if(moves.contains(new Move(t,s)))
System.out.println("match found");
这是Move类:
public class Move {
private int move1;
private int move2;
Move(int m1,int m2)
{
move1 = m1;
move2 = m2;
}
public String toString()
{
return String.valueOf(move1)+" "+String.valueOf(move2);
}
}
这是我得到的输出
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.HashMap.addEntry(HashMap.java:797)
at java.util.HashMap.put(HashMap.java:431)
at java.util.HashSet.add(HashSet.java:194)
at makeMove.<init>(makeMove.java:33)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。