加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 将Object与无序整数对作为变量进行比较时需要正确的hash

发布时间:2020-12-15 04:58:25 所属栏目:Java 来源:网络整理
导读:我上课了 final class BuildingPair { int mBA; int mBB; public BuildingPair(int pBuildingA,int pBuildingB) { mBA = pBuildingA; mBB = pBuildingB; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * resul
我上课了

final class BuildingPair {

    int mBA;
    int mBB;

    public BuildingPair(int pBuildingA,int pBuildingB) {
        mBA = pBuildingA;
        mBB = pBuildingB;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + mBA;
        result = prime * result + mBB;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        BuildingPair other = (BuildingPair) obj;
        if ((mBA==other.mBA&&mBB==other.mBB)||(mBA==other.mBB&&mBB==other.mBA)) return true;
        return false;
    }
}

我想比较两个对象,当它们具有相同的建筑物ID时,它们是相同的

所以他们需要在以下两个方向上保持平等:

BuildingPair(1,2) vs BuildingPair(2,1) 
BuildingPair(1,2) vs BuildingPair(1,2)
BuildingPair(2,1) vs BuildingPair(1,2)

我认为equals方法没问题,但是hashcode是错误的.

解决方法

无论是通过A,B还是B,A,你都需要计算相同结果的东西.可能会有更微妙的解决方案,但我可能会选择:

@Override
public int hashCode() {
    return mBA * mBB;
}

或者使用可交换运算符的任何其他东西.

或者,您可以更改构造函数,使其始终将m(m,b)中的min(a,b)和mBB中的max(a,b)存储起来 – 然后可以简化比较代码并保留当前的哈希代码.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读