gpt4 book ai didi

java - 使用哈希码确定对象等价性

转载 作者:行者123 更新时间:2023-12-04 16:37:39 24 4
gpt4 key购买 nike

假设我有一个表示游戏方 block 的简单类,名为 Tile:

public class Tile {

public final int x;
public final int y;
public final int plane;

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

@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
} else if (obj instanceof Tile) {
Tile other = (Tile) obj;
return other.x == x && other.y == y && other.plane == plane;
}
return false;
}

@Override
public int hashCode() {
return Objects.hash(x, y, plane);
}
}

作为负责任的公民,我实现了hashCode 方法以确保等效对象的哈希码在每个equals 契约中是相等的。然后我在想,对于 xyplane 具有相同值的任何两个 Tile 对象> 字段,哈希码 - 因为它们应该 - 将是相等的。那么,为什么不直接使用 that 来检查对象是否相等,而不是单独比较字段的值呢?

更明确地说,为什么不替换:

@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
} else if (obj instanceof Tile) {
Tile other = (Tile) obj;
return other.x == x && other.y == y && other.plane == plane;
}
return false;
}

简单地:

@Override
public boolean equals(Object obj) {
return obj == this || obj != null && obj.hashCode() == hashCode();
}

我的一部分觉得这是不好的做法。这几乎感觉像是循环推理。但是,我想不出一个有效的、实际的理由来说明为什么这是一种不好的做法。

简而言之:hashCode的结果来判断equals的结果是否合适?

最佳答案

没有。可以这样想:对于三个 int 的每种组合,有 2^32 * 2^32 * 2^32 = 2^96 种不同的可能 Tile

只有 2^32 个可能的 hashCode

因此,对于任何给定的 Tile,将有 2^64 个 不同 个可能的 Tile 具有相同的哈希码。

简而言之:散列码不是唯一的。许多对象会碰巧具有相同的散列码即使它们不相等。

(一般来说,永远记住 return 0;hashCode() 的有效实现。)

关于java - 使用哈希码确定对象等价性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36929860/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com