首页 > 解决方案 > 具有相同状态的两个对象未从 HashMap 检索相同的值

问题描述

我有以下课程:

public static final Map<ChunkLoc,String> claims = new HashMap<>();

public final UUID world;
public final int x;
public final int z;

public static void main(String[] aefjpa) throws Throwable {
    final UUID u = UUID.randomUUID();

    final ChunkLoc c = new ChunkLoc(u, 123, -634);
    claims.put(c, "apekop");
    System.out.println(c.getOwner());

    final ChunkLoc a = new ChunkLoc(u, 123, -634);
    System.out.println(a.getOwner());

    System.out.println(a.equals(c));
}

public ChunkLoc(final UUID world, final int x, final int z) {
    this.world = world;
    this.x = x;
    this.z = z;
}

public String getOwner() {
    return claims.get(this);
}

public boolean equals(final ChunkLoc chunk) {
    return world.equals(chunk.world) && x == chunk.x && z == chunk.z;
}

public int hashCode() {
    return x << z;
}

出于某种原因,索赔Map没有按预期工作。当我创建一个 ChunkLoc 以将一个字符串放入映射中,然后创建另一个具有相同值的 ChunkLoc 以从映射中取回字符串时,它返回 null。main() 方法输出以下内容:

apekop
null
true

我认为当 hashCode 相同并且 equals() 返回 true 时,HashMap 的功能应该不同。为什么会给出上述输出?

标签: java

解决方案


推荐阅读