Java 使用自定义类作为HashMap中的键,但无法搜索键
我创建了一个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[
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)
。我已确保HashmapnotBeen
不为空,并尝试确保密钥确实存在。但是,我永远无法使用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);
}
}