将实例与Java中的HashMaps进行比较时出现的问题

将实例与Java中的HashMaps进行比较时出现的问题,java,hashmap,instance,Java,Hashmap,Instance,我试图通过我创建的自定义类从HashMap中获取一个值 自定义类: public class Coordinates { private int x; private int y; public Coordinates(int x, int y) { this.x = x; this.y = y; } public int getX() { return this.x; } publi

我试图通过我创建的自定义类从HashMap中获取一个值

自定义类:

public class Coordinates {

    private int x;
    private int y;

    public Coordinates(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return this.x;
    }

    public int getY() {
        return this.y;
    }

    public boolean isSame(Coordinates coords) {
        if (coords.getX() == this.x && coords.getY() == this.y) {
            return true;
        }
        return false;
    }

    public String getAsString() {
        return "("+this.x+", "+this.y+")";
    }

    public Coordinates getCoords() {
        return this;
    }

}
我有一个名为coordsJCB的HashMap,当我试图获取JCButton(一个自定义swing按钮)时,它说找不到它

private static HashMap<Coordinates, JCButton> coordsJCB = new HashMap<Coordinates, JCButton>();
coordsJCB.get(coords);
打印错误,即使它们是相同的。 我在谷歌上搜索了一下,得到了很多关于重写.equals函数的答案。但是这对我没有帮助,因为我不想比较“坐标”的两个实例,我需要通过传递一个坐标实例从HashMap中获取一个值


非常感谢您的帮助,因为我完全不知道该怎么办/

HashMap的键集对其元素进行散列,并通过散列进行比较

您需要在
坐标
类中重写
对象.hashCode
对象.equals

x
y
equal
otherCoordinates.x
otherCoordinates.y
时,您的
equals
方法应分别返回
true

对于
hashCode
来说,这有点棘手,因为您的散列将基于两个
int
s,因此您需要找到一种方法来避免弱散列(即容易重复的散列)

IDE的样板文件
hashCode
实现功能应该对您有所帮助,但您可以进行额外的位移位,并使用更好的基本种子

例如,在Ecplise中:

  • 右键单击您的
    坐标
  • 单击
    source
  • 单击
    生成hashCode()和equals()…

HashMap的密钥集对其元素进行散列,并通过散列进行比较

您需要在
坐标
类中重写
对象.hashCode
对象.equals

x
y
equal
otherCoordinates.x
otherCoordinates.y
时,您的
equals
方法应分别返回
true

对于
hashCode
来说,这有点棘手,因为您的散列将基于两个
int
s,因此您需要找到一种方法来避免弱散列(即容易重复的散列)

IDE的样板文件
hashCode
实现功能应该对您有所帮助,但您可以进行额外的位移位,并使用更好的基本种子

例如,在Ecplise中:

  • 右键单击您的
    坐标
  • 单击
    source
  • 单击
    生成hashCode()和equals()…

您需要重写坐标类中的hashCode()和equals()方法。 看看hashMap在Java中是如何工作的。它将通过调用equals()方法检查对象的相等性,该方法的默认实现使用“==”运算符检查引用。
在您的情况下,这将是错误的,因此您无法检索所需的值。

您需要重写类中的hashCode()和equals()方法。 看看hashMap在Java中是如何工作的。它将通过调用equals()方法检查对象的相等性,该方法的默认实现使用“==”运算符检查引用。
在您的情况下,这将是错误的,因此您无法检索期望的值。

它打印为错误,因为它们是不同的对象,因为
new
关键字它打印为错误,因为它们是不同的对象,因为
new
关键字非常感谢。工作如梦:)非常感谢。工作如梦:)
System.out.println(new Coordinates(2, 3).equals(new Coordinates(2, 3)));