首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >HashSet似乎没有意识到两个对象是相同的。

HashSet似乎没有意识到两个对象是相同的。
EN

Stack Overflow用户
提问于 2010-09-12 03:50:38
回答 2查看 56.3K关注 0票数 32

我尝试使用HashSet来存储我创建的一个类的对象,但显然相同的对象似乎有两个不同的散列,这就是为什么contains方法没有意识到该对象已经在HashSet中的原因。这会导致我的程序耗尽堆内存。

我不认为我做错了什么,但我还是想听听别人的意见。我以前也做过类似的操作,但都运行得很好,这使得这一点特别烦人。如果能帮上忙我会很感激的。

这是我的代码

代码语言:javascript
复制
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类:

代码语言:javascript
复制
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);
    }
}

下面是我得到的输出

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

发布于 2010-09-12 03:54:40

HashSet将根据调用hashCode()和equals()来确定相等性。您还没有实现这些,所以您将从Object继承它们。Object的hashCode和equals方法只是基于引用是否相等。

这就是为什么if(move1.hashCode()==new Move(t,s).hashCode())是假的。move1是与通过调用new Move(t,s).hashCode()创建的实例不同的实例

你需要在你的Move类中实现hashCode和equals。

例如(虽然可能不是最优的,你可能需要一个空的安全等于-让你的IDE在可能的情况下生成它们)

代码语言:javascript
复制
public int hashCode() {
    return move1 ^ move2 +;
}

public boolean equals(Object o) {
  if(!other instanceof Move) 
      return false;

  Move other = (Move)o;

  return other.move1 == move1 && other.move2 == move2;
}
票数 10
EN

Stack Overflow用户

发布于 2010-09-12 04:20:34

您必须覆盖equals()hashCode()

这可能是一种选择。

代码语言:javascript
复制
import static java.lang.System.out;
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);
    }

    public int hashCode() {
        return move1 * 31 + move2 * 31;
    }
    public boolean equals( Object other ) {
        if( this == other ) { return true; }
        if( other instanceof Move ) {
            Move m2 = ( Move ) other;
            return this.move1 == m2.move1 && this.move2 == m2.move2;
        }
        return false;
    }

    public static void main( String  [] args ) {
        out.println( new Move(2,3).equals( new Move(2,3)));
        out.println( new Move(1,1).hashCode() == new Move(1,1).hashCode()  );
    }
}

你必须定义移动的顺序是否相关( 1,2是否等于2,1 )

有关详细信息,请参阅:

What issues should be considered when overriding equals and hashCode in Java?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3692426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档