当前位置: 首页 > 面试题库 >

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

戚学
2023-03-14
问题内容

我正在尝试使用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)

问题答案:

您需要重写该类中的Object#hashCode()方法,Move以使其hashCode()Move实例状态返回相同的值。不要忘记也要覆盖Object#equals()

也可以看看:

  • 在Java中覆盖equals和hashCode

提示 :如果您使用的是类似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;
}


 类似资料:
  • 我在类SpawnManager中声明了一个私有int tree_count。void Start()和void Update()按照预期使用了该变量,但另一个方法public void tree_destroy似乎使用了不同的tree_count。 这是我的代码。

  • 问题内容: 假设我有一个类A,而B,C,D是从A派生的。 如果我想知道所引用的对象的类型是什么,可以声明: 这是因为我确定从A派生的类只有B,C和D。 但是,如果我只想检查两个引用是否指向同一种对象,该怎么办? 所以像这样: 但是当然语法是错误的,如何在没有1000 if-else的情况下进行检查? 问题答案: 你的意思是 即使和属于相同的特定类,也应返回true 。 但是,如果与进行比较,则此方

  • 我有两个arraylist。employee类和user类的ArrayList。employee类将name、age、address作为字段。用户类将名称、年龄、地址作为字段。下面是两个列表 要检查用户是否和员工的地址相同。如果用户没有地址,则从员工处复制。

  • 问题内容: Hashcode()和equals()的概念是 1)如果两个对象根据equal()相等,则在这两个对象中的每一个上调用hashcode方法应产生相同的哈希码。 另一个是 2)如果两个对象根据equal()不相等,则不需要在两个对象中的每一个上调用hashcode方法必须产生不同的值。 我尝试并理解了第一个,这是第一点的代码。 上面的程序为两个不同的对象提供了相同的哈希码。 有人可以用一

  • 我的问题是,它似乎影响和删除相同的元素从原来的列表!

  • 假设您有两个相同的对象(意味着它们分别具有相同的属性和相同的值)。 你如何测试平等性? 例