我是否误解了.equals()方法的工作原理?

时间:2019-04-22 16:28:42

标签: java

我正在比较两个具有相同属性和值的对象,但返回的是假

我将两个if条件分开,以检查哪个条件不对。 我已经调试了算法,以便可以检查对象的属性值是否有问题。

https://gyazo.com/73427a2a20558901019fc885745ca1d2

 public boolean existsBag(Bag bag) {
        for (int i = 0; i < this.insertedBags.length; i++) {
            if (this.insertedBags[i] != null ) {
                if(this.insertedBags[i].equals(bag)){
                    return true;
                }

            }
        }
        return false;
    }

更新

通过覆盖Bag类中的equals方法解决了问题,谢谢大家!

6 个答案:

答案 0 :(得分:1)

如果要比较对象,则需要覆盖重写equals()方法,否则它将返回false。

这是一个示例如何覆盖equals方法。

考虑一个Employee类,该类具有两个字段:年龄和姓名。

公共类员工{

String name;
int age;

public Employee(String name, int age) {
    this.name = name;
    this.age = age;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

@Override
public boolean equals(Object obj) {
    if (obj == this)
        return true;
    if (!(obj instanceof Employee))
        return false;
    Employee employee = (Employee) obj;
    return employee.getAge() == this.getAge()
            && employee.getName() == this.getName();
}
}

答案 1 :(得分:1)

如评论中所述,您可能没有重写equals方法。

只是暗示它可能是什么样子

public class Bag {

    @Override
    public boolean equals(final Object other) {

        if (this == other)
            return true;

        if ( ! (other instance of Bag))
            return false;

        // now compare your inner fields. E.g:
        final Bag bagOther = (Bag) other;

        if (! this.brandName.equals(bagOther.brandName)) // brandName is java.lang.String
            return false;
        if (! this.length == bagOther.length) // length is int
            return false;

         // ...
         return true;
    }
}

如果不被覆盖,默认情况下,equals使用其基类Object的版本来比较实例的内存位置。

还要注意,除了覆盖equals外,您还应该覆盖方法hashCode

例如:this article,说明了如何以及为什么

答案 2 :(得分:0)

在Bag类中只需覆盖方法equals()hashCode()

第一个用于比较对象值,第二个用于在JVM内部创建对象哈希。这样,您将获得正确的比较。

答案 3 :(得分:0)

默认情况下,所有类都继承Java中的Object类。这样,Object类以及所有其他类都具有一个public boolean equals(Object o)方法,该方法仅返回this == o

[对OpenJDK来说这是正确的,对于Oracle JDK也可能相同。]

要指定自定义相等逻辑,必须使用自己的比较逻辑覆盖此public boolean equals(Object)方法。其他答案已经提供了相关代码。有关更多讨论,请参见this Stackoverflow线程。

答案 4 :(得分:0)

默认情况下等于比较两个对象的引用, 因此,如果要比较对象,则需要覆盖equals()方法,否则它将返回false

答案 5 :(得分:-1)

根据api

  

对于任何非空参考值x和y,如果和   仅当x和y指向同一对象(x == y的值为true)时。