Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用自定义类作为HashMap中的键,但无法搜索键_Java_Object_Hashmap - Fatal编程技术网

Java 使用自定义类作为HashMap中的键,但无法搜索键

Java 使用自定义类作为HashMap中的键,但无法搜索键,java,object,hashmap,Java,Object,Hashmap,我创建了一个HashMap,它使用自定义的类位置作为键。 使用put()将所有条目插入HashMap后,我无法搜索键 我曾尝试使用get()或containsKey()进行搜索,但都没有给出肯定的结果。但是,我确信这些键确实存在于代码中,因为我已经使用HashMap迭代打印出了这些键 代码如下: public HashMap<Location, Integer>beenTo = new HashMap<>(); public int uniquePathsIII(int[

我创建了一个HashMap,它使用自定义的类位置作为键。 使用
put()
将所有条目插入HashMap后,我无法搜索键

我曾尝试使用
get()
containsKey()
进行搜索,但都没有给出肯定的结果。但是,我确信这些键确实存在于代码中,因为我已经使用HashMap迭代打印出了这些键

代码如下:

public HashMap<Location, Integer>beenTo = new HashMap<>();
public int uniquePathsIII(int[][] grid) {
        for (int i=0; i<grid.length; i++){
             for (int j=0; j<grid[0].length; j++){
                 if (grid[i][j] == 0 || grid[i][j] == 2){
                     Location newSquare = new Location(i,j);
                     notBeen.put(newSquare, 1);                    
                 }           
             }
        }
        Location newSquare = new Location(0,1);
        if (notBeen.get(newSquare) != null){
             return 10;
         }
        if (notBeen.isEmpty()){
            return -1;
        }
}

在上面的代码中,我想搜索键
位置(0,1)
。我已确保Hashmap
notBeen
不为空,并尝试确保密钥确实存在。但是,我永远无法使用
containsKey()
get()
找到它。如果希望自定义对象在Java中作为哈希映射中的键工作,则需要实现/重写
hashCode
equals
方法

供参考:
\u variableName
违反Java命名约定。这也不是必需的,因为您可以使用以下方法获得相同的结果:

public Location(int i, int j){
  this.i = i;
  this.j = j;
}

为了避免内存泄漏,映射的键必须是不可变的对象,并提高搜索键的速度,键对象具有equals()和hashcode()方法是一种很好的做法(首先使用hashcode judge equals,然后使用equals()方法)。在代码中,最好使位置不可变(不支持setter方法)


很抱歉反应太晚!我试图重写location类的
equals()
方法。但是,
HashMap.get()
方法仍然找不到对象。这是否意味着我应该重写
get()
方法?我只是重写了
Location
类的
hashCode()
方法。
containsKey()
get()
方法现在都可以正常工作。非常感谢。
public Location(int i, int j){
  this.i = i;
  this.j = j;
}
public class Location {
    private final int i;
    private final int j;

    public Location(int x, int y) {
        this.i = x;
        this.j = y;
    }

    public int getI() {
        return i;
    }

    public int getJ() {
        return j;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (!(o instanceof Location)) {
            return false;
        }
        Location point = (Location) o;
        return i == point.i &&
            j == point.j;
    }

    @Override
    public int hashCode() {
        return Objects.hash(i, j);
    }
}