当前位置: 首页 > 知识库问答 >
问题:

同一个对象不同的散列码?

丘普松
2023-03-14
class Rational {
    int num = 0;
    int denom = 0;
    public Rational(int num, int denom) {
        this.num = num;
        this.denom = denom;
    }

public static void main(String[] args) {
    Rational r1 = s.new Rational(1, 1);
    Rational r2 = s.new Rational(1, 1);
    System.out.println(r1.hashCode());
    System.out.println(r2.hashCode());

}

我有两个相同的对象,但是它们有不同的hashCode。为什么呢?我尝试覆盖Rational中的. equ方法r1.equals(r2)==true。但是它们仍然产生不同JavahashCode。

共有2个答案

颜光临
2023-03-14

我有两个一样的东西

“相同”的字面意思通常是一个物体。这里是等价物。

...但它们有不同的哈希代码。为什么?

因为您没有覆盖hashCode来替换默认实现。覆盖equals不会更改hashCode(如果您覆盖equals,您几乎总是必须覆盖两者)。

hashCode文档说明了Object中的默认实现:

只要是合理可行的,类对象定义的hashCode方法确实会为不同的对象返回不同的整数。(这通常是通过将对象的内部地址转换为整数来实现的,但Java不需要这种实现技术。)™ 编程语言。)

因此,对于不同的实例,你会得到不同的整数(通常),即使它们是等价的,除非你替换hashCode

在您的情况下,您可以这样做:

@override
public int hashCode() {
    return this.num ^ this.denom;
}

...并为Rational设置一个合理的hashCode(确保覆盖equals),但还有很多其他方法。只要遵守合同:

hashCode的一般合同是:

  • 每当在执行Java应用程序期间对同一对象多次调用它时,hashCode方法必须一致地返回相同的整数,前提是不html" target="_blank">修改对象上的equals比较中使用的信息。从应用程序的一次执行到同一应用程序的另一次执行,该整数不需要保持一致。
  • 如果两个对象根据equals(Object)方法相等,则在两个对象中的每一个上调用hashCode方法必须产生相同的整数结果。
  • 如果两个对象根据equals(java.lang.Object)方法不相等,那么对两个对象中的每一个调用hashCode方法必须产生不同的整数结果。但是,程序员应该意识到为不相等的对象产生不同的整数结果可能会提高哈希表的性能。
鄢子平
2023-03-14

它们不是同一个物体;它们是两个具有相同值的不同对象。世界上还有另一个杰伦·范内维尔并不意味着是我。

hashCode()equals()没有链接:他们都有一个必须遵守的合同,而且他们是相关的,但他们不会直接影响彼此。这就是为什么你应该总是覆盖这两种方法,而不是一种。

 类似资料:
  • 问题内容: 根据我的理解,我认为: 两个对象具有相同的哈希码是完全合法的。 如果两个对象相等(使用equals()方法),则它们具有相同的哈希码。 如果两个对象不相等,则它们不能具有相同的哈希码 我对么? 现在,如果正确,我将遇到以下问题:内部使用对象的哈希码。因此,如果两个对象可以具有相同的哈希码,那么如何跟踪它使用的键? 有人可以解释内部如何使用对象的哈希码吗? 问题答案: 哈希图的工作方式如

  • 我有以下情况: 之后,我启动三个线程中的每一个线程,它们迭代本地产品列表,并对其进行修改。 我在迭代本地产品ArrayList时获得一个ConcurrentModificationException。 为什么会出现这种情况?我假设,如果我在每个线程中创建一个完整的新列表,我可以在本地任意修改它,而不关心其他线程--我说的对吗?还是从本地列表中删除某个对象会影响pbjects,从而导致其他线程抛出并

  • 问题内容: 我有一个可能具有或不具有相同属性值的对象的列表/集合。获得具有相同属性的对象的不同列表的最简单方法是什么?一种收集类型最适合此目的吗?例如,在C#中,我可以使用LINQ执行以下操作。 我最初的想法是使用lambdaj(链接文本),但似乎不支持此功能。 问题答案: 使用接口的实现(类T可能需要自定义方法,您可能必须自己实现)。通常,a 是开箱即用的:它使用和方法比较对象。对于简单的对象,

  • 我还将列表一中的和成员的每个哈希代码与列表二中成员的哈希代码进行了比较。而且没有区别。但是如果我比较完整列表的hashcode,就有区别了。我不知道为什么。我很无助。 也许有人能帮我。请提前向我致以最诚挚的问候和感谢。

  • 问题内容: 我可能会尝试以困难的方式执行此操作,所以请让我知道是否有更好的解决方案。 我正在用Java开发一个简单的文字游戏,您可以通过GUI选择动作。我有几个班级正在尝试序列化一个是播放器,另一个是NPC。是否有一种简单的方法可以将一个以上的对象(播放器和NPC)序列化到同一文件中?我可以序列化一个对象并将其加载回游戏中。 我会以错误的方式处理吗?有没有更简单的方法来尝试保存游戏状态? 如果我有