Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么这个.equals()代码示例返回“false”?_Java_Equals - Fatal编程技术网

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

Java 为什么这个.equals()代码示例返回“false”?,java,equals,Java,Equals,为什么这是错误的?如果在Java中,默认情况下所有对象都不相等,即使它们具有相同的值,那么我如何说服Java这两个对象实际上是相等的呢?好吧,即使两只狗有相同的名字,身高,体重,一只可能是斑点狗,另一只可能是斗牛犬,即使它们是同一个种族,在本质上,它们总是可以彼此不同 PS:我理解如果一==二{}我们是在比较它们是否都引用堆上的同一个对象,如果它们具有相同顺序的相同字符,.equals on string的比较。默认情况下,equals方法会说这是内存中的同一个对象吗?除非你覆盖它 你没有覆盖它

为什么这是错误的?如果在Java中,默认情况下所有对象都不相等,即使它们具有相同的值,那么我如何说服Java这两个对象实际上是相等的呢?好吧,即使两只狗有相同的名字,身高,体重,一只可能是斑点狗,另一只可能是斗牛犬,即使它们是同一个种族,在本质上,它们总是可以彼此不同


PS:我理解如果一==二{}我们是在比较它们是否都引用堆上的同一个对象,如果它们具有相同顺序的相同字符,.equals on string的比较。

默认情况下,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");
        }
    }
}
Stephan提出了一个很好的观点——如果没有hashCode,永远、永远、永远的implement等于。始终在这两个字段中使用相同的字段

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;
}

默认情况下,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");
        }
    }
}
Stephan提出了一个很好的观点——如果没有hashCode,永远、永远、永远的implement等于。始终在这两个字段中使用相同的字段

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;
}

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

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

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

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

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

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

任何Ide都允许您自动生成hashcode和equals作为getter和setter

在没有hashcode和equals的情况下,您将得到false,因为对象不能位于同一内存位置

您的工作示例如下:

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;

    }
}
结果:

要在eclipse中自动生成hashcode和equals,请执行以下操作:

在类中单击鼠标右键,然后:


任何Ide都允许您自动生成hashcode和equals作为getter和setter

在没有hashcode和equals的情况下,您将得到false,因为对象不能位于同一内存位置

您的工作示例如下:

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;

    }
}
结果:

要在eclipse中自动生成hashcode和equals,请执行以下操作:

在类中单击鼠标右键,然后:



如果你不超越平等,我将很难工作…@Harald,这是不一样的。这就是为什么有些字符串==适用于而其他字符串不适用的原因。如果你不重写equals…@Harald这是不一样的。这就是为什么有些字符串==适用于而其他字符串不适用的原因。别忘了也重写hashCode方法。@Stephan 1000%是。否则,Hashmaps将完全失效!别忘了重写hashCode方法。@Stephan 1000%是。否则,Hashmaps将完全失效!我模模糊糊地理解你想说什么,但我还不理解这个代码实现。无论如何,谢谢你!我没有写任何代码行,我让eclipse帮我做,不管怎样,当你调用'one.equals2',你调用的是覆盖的equals,这里是对象1,obj是对象2。谢谢你的解释,现在看起来更清楚了哈哈,你是怎么让eclipse帮你做的?回答为eclipseJust编辑的信息,为了理解hashcode和equals方法的真正用途,请阅读它们是如何使用HashSet的;我模模糊糊地理解你想说什么,但我还不理解这个代码实现。无论如何,谢谢你!我没有写任何代码行,我让eclipse帮我做,不管怎样,当你调用'one.equals2',你调用的是覆盖的equals,这里是对象1,obj是对象2。谢谢你的解释,现在看起来更清楚了哈哈,你是怎么让eclipse帮你做的?回答为eclipseJust编辑的信息,为了理解hashcode和equals方法的真正用途,请阅读它们是如何使用HashSet的;