java - 具有相同状态的两个对象未从 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 - Android Studio 4 可以构建 API < 9 的项目吗?
- openapi - 在 C# .Net 5.0 中生成用于 OpenAPI 的强类型类
- ansible - ansible,仅当另一个特定主机也在剧本运行中时才执行任务
- typescript - Typescript“声明命名空间”、“声明模块”在全局/模块范围内的区别
- javascript - 如何在不发送验证电子邮件的情况下使用 NodeJS 验证电子邮件是否存在
- android - 是否可以在android中屏幕共享应用程序的特定屏幕?
- angular - 角定制垫芯片颜色
- c++ - 随机形状和运动生成不绘制形状
- flutter - 在谷歌地图上沿折线搜索标记颤动
- r - 删除任何其他相邻列中具有重复值的行