开发者社区> 问答> 正文

具有相同哈希值的对象应该相等吗?

在下面的示例中,我创建了两个内部结构完全相同的对象。两者都只携带值1作为实例变量。我的想法是,如果我采用的哈希值e1应与的哈希值相同e2,因此e1.equals(e2)应返回true。

class EqualsChecker {

    public static void main(String[] args) {

        Elem e1 = new Elem(1);
        Elem e2 = new Elem(1);


        System.out.println(e1);                                // EqualsChecker$Elem@6ff3c5b5
        System.out.println(e2);                                // EqualsChecker$Elem@3764951d
        System.out.println("e1.equals(e2): " + e1.equals(e2)); // returns false
    }


    static class Elem {
        private int v;
        public Elem(int i) {
            this.v = i;
        }   
    }   
}

为什么equals在这里返回false?

问题来源:Stack Overflow

展开
收起
montos 2020-03-26 19:08:59 587 0
1 条回答
写回答
取消 提交回答
  • equals(Object)的默认实现检查这两个对象是否是同一实例(即它们==)。如果您需要一些不同的逻辑,则必须自己实现。请注意,如果执行此操作,则还应该实现自己的hashCode(),以便两个相等的对象也将具有匹配的哈希码。例如:

    class Elem {
        private int v;
    
        @Override
        public boolean equals(final Object o) {
            if (o == null || this.getClass() != o.getClass()) {
                return false;
            }
            Elem elem = (Elem) o;
            return this.v == elem.v;
        }
    
        @Override
        public int hashCode() {
            return this.v;
        }
    }
    

    回答来源:Stack Overflow

    2020-03-26 19:09:25
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载