首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >equals()方法在Java中是如何工作的

问equals()方法在Java中是如何工作的
EN

Stack Overflow用户
提问于 2013-03-21 16:34:44
回答 3查看 15.6K关注 0票数 6

equals方法比较两个对象值是否相等。我的问题是,它如何比较这两个对象?它如何判断这两个对象是否相等?我想知道它对这两个对象进行了什么比较。我没有包括hashCode方法。

EN

回答 3

Stack Overflow用户

发布于 2013-03-21 16:36:11

默认实现是java.lang.Object类之一,它只是测试对同一对象的引用:

代码语言:javascript
复制
150    public boolean equals(Object obj) {
151        return (this == obj);
152    }

引用相等运算符在Java Specification中的描述如下:

在运行时,如果操作数值都为空或都引用相同的对象或数组,则==的结果为true;否则,结果为false。

这种默认行为在语义上通常不能令人满意。例如,您不能使用==测试大整数实例的相等性:

代码语言:javascript
复制
Integer a = new Integer(1000);
Integer b = new Integer(1000);
System.out.println(a==b); // prints false

这就是该方法被覆盖的原因:

代码语言:javascript
复制
722     public boolean equals(Object obj) {
723         if (obj instanceof Integer) {
724             return value == ((Integer)obj).intValue();
725         }
726         return false;
727     }

这实现了这一点:

代码语言:javascript
复制
System.out.println(a.equals(b)); // prints true

覆盖默认行为的类应该基于标识字段(通常是所有字段)的相等性测试语义相等性。

如您所知,您应该相应地覆盖hashCode方法。

票数 6
EN

Stack Overflow用户

发布于 2013-03-21 17:18:45

考虑下面的示例,

代码语言:javascript
复制
public class Employee {
    String name;
    String passportNumber;
    String socialSecurityNumber;
    public static void main(String[] args) {
        Employee e1 = new Employee();
        Employee e2 = new Employee();
        boolean isEqual = e1.equals(e2);  // 1
        System.out.println(isEqual);
    }
}

在注释//1处的代码中,它从Object类调用继承的equals方法,简单地比较e1和e2的引用。因此,它将始终为使用new关键字创建的每个对象提供false。

下面是从Object中摘录的方法

代码语言:javascript
复制
public boolean equals(Object obj) {
    return (this == obj);
}

为了比较相等性检查,JLS在我们的类中给出了重写的equals方法。这不是最终的方法。JLS不知道程序员想要在什么基础上使两个对象相等。所以他们给出了非最终方法来重写。

hashcode不起到检查对象等价性的作用。hashcode检查/查找对象可用的Bucket。我们在散列技术中使用了HashMap等类所使用的hashcode。

如果两个对象的哈希码相等,这并不意味着两个对象是相等的。

对于两个对象,如果equals方法返回true,则哈希码必须相同。

你将不得不重写equals方法来决定你想要的对象e1和上面代码中的e2是相等的。它是基于passportNumber还是socialSecurityNumber,还是passportNumber+socialSecurityNumber的组合

代码语言:javascript
复制
I want to know based on what it compares the two objects.

答案是,默认情况下,在继承的Object类的equals方法的帮助下,它使用==符号比较两个对象的引用相等。上面给出了代码。

票数 4
EN

Stack Overflow用户

发布于 2013-03-21 16:37:47

从逻辑上讲,equals并不比较对象(但是您可以用它做任何事情),它比较值。对于对象比较,有'==‘运算符

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15542656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档