为什么这个.equals()代码示例返回“false”?

时间:2017-09-11 14:46:23

标签: java equals

class Dog{
    int height;
    int weight;
    String name;
}

public class DogTest {

    public static void main(String[] args) {
        Dog one = new Dog();
        one.height=4;
        one.name="fudo";
        one.weight =2;
        Dog two = new Dog();
        two.height=4;
        two.name="fudo";
        two.weight =2;
        if (one.equals(two)){
            System.out.println("True");
        }
        else{
            System.out.println("False");
        }
    }
}

为什么输出“False”?如果Java默认情况下“所有对象即使它们具有相同的值也不相等”那么我如何“说服”Java这两个对象实际上是相等的?好吧,即使两只狗有相同的名字,身高,体重也可以是dalmatiner而另一只是斗牛犬,即使它们是相同的“种族”,在性质上,它们也总是彼此不同。

PS:我理解通过说if(one == two){}我们比较它们是否都引用堆上的同一个对象,字符串上的.equals比较它们是否具有相同顺序的相同字符。 / p>

3 个答案:

答案 0 :(得分:7)

默认情况下,equals方法表示"这是内存中的同一个对象吗?"除非你覆盖它。

你没有覆盖它。

行为没有改变。

您想要添加像这样的新方法

public boolean equals(Object o) {
    if(o instanceof Dog) {
        Dog d = (Dog)(o);
        Dog t = this;
        return t.height == d.height && t.weight == d.weight && t.name.equals(d.name);
    }
    return false;
}
斯蒂芬提出了一个很好的观点 - 永远不会,没有hashCode,所以永远都没有。始终在两者中使用相同的字段。

public int hashCode() {
    int hash = name.hashCode();
    hash = hash * 31 + weight;
    hash = hash * 31 + height;
    return hash;
}

答案 1 :(得分:3)

你必须在Dog类中覆盖你的equals方法。如果不是,您只是在比较这些对象是否是内存中的相同实例。

以下是如何执行此操作的实现:

class Dog{
    int height;
    int weight;
    String name;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Dog)) return false;

        Dog dog = (Dog) o;

        if (height != dog.height) return false;
        if (weight != dog.weight) return false;
        return name != null ? name.equals(dog.name) : dog.name == null;

    }
}

答案 2 :(得分:3)

任何Ide允许您以自动方式生成哈希码和等于getter和setter。

在没有hashcode和equals的情况下,你会得到false,因为对象不能在同一个内存位置。

下面的(工作)示例:

class Dog{
    int height;
    int weight;
    String name;

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + height;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        result = prime * result + weight;
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Dog other = (Dog) obj;
        if (height != other.height)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        if (weight != other.weight)
            return false;
        return true;
    }

    public static void main(String[] args) {
        Dog one = new Dog();
        one.height=4;
        one.name="fudo";
        one.weight =2;
        Dog two = new Dog();
        two.height=4;
        two.name="fudo";
        two.weight =2;
        if (one.equals(two)){
            System.out.println("True");
        }
        else{
            System.out.println("False");
        }
    }
}

结果:

enter image description here

在eclipse中以自动方式生成hashcode和equals:

右键单击您的课程:

enter image description here