Java 这是怎么回事!=接线员在吗?

Java 这是怎么回事!=接线员在吗?,java,android,Java,Android,印刷品: FooBar@ca4c33db不等于FooBar@ca4c33db 这在Android上发生。FooBar是我自己的自定义类。我在调试器中仔细检查了它。您应该使用equals() 但是使用String可以执行以下操作,因为String类已经实现了equals()方法 if(!foo.equals(bar)) 输出: String a = "hi"; String b = "hii"; if (a!=b){ System.out.println(

印刷品:

FooBar@ca4c33db不等于FooBar@ca4c33db


这在Android上发生。FooBar是我自己的自定义类。我在调试器中仔细检查了它。

您应该使用
equals()

但是使用
String
可以执行以下操作,因为
String
类已经实现了
equals()
方法

if(!foo.equals(bar))
输出:

    String a = "hi";
    String b = "hii";
    if (a!=b){
        System.out.println("yes");
    }else {
        System.out.println("no");
    }
   Test a = new Test();
    Test b = new Test();
    a.setAge(1);
    a.setName("hi");

    b.setAge(1);
    b.setName("hi");
    if (a!=b){
        System.out.println("yes");
    }else {
        System.out.println("no");
    }
如果您想按自己的方式去做,您必须重写
equals()
方法

if(!foo.equals(bar))
示例:不带覆盖
equals()

现在看看这个

public class Test {
private String name;
private int 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;
 }
}
输出:

    String a = "hi";
    String b = "hii";
    if (a!=b){
        System.out.println("yes");
    }else {
        System.out.println("no");
    }
   Test a = new Test();
    Test b = new Test();
    a.setAge(1);
    a.setName("hi");

    b.setAge(1);
    b.setName("hi");
    if (a!=b){
        System.out.println("yes");
    }else {
        System.out.println("no");
    }

现在您可以在这里看到相同的问题。

您应该使用
equals()

但是使用
String
可以执行以下操作,因为
String
类已经实现了
equals()
方法

if(!foo.equals(bar))
输出:

    String a = "hi";
    String b = "hii";
    if (a!=b){
        System.out.println("yes");
    }else {
        System.out.println("no");
    }
   Test a = new Test();
    Test b = new Test();
    a.setAge(1);
    a.setName("hi");

    b.setAge(1);
    b.setName("hi");
    if (a!=b){
        System.out.println("yes");
    }else {
        System.out.println("no");
    }
如果您想按自己的方式去做,您必须重写
equals()
方法

if(!foo.equals(bar))
示例:不带覆盖
equals()

现在看看这个

public class Test {
private String name;
private int 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;
 }
}
输出:

    String a = "hi";
    String b = "hii";
    if (a!=b){
        System.out.println("yes");
    }else {
        System.out.println("no");
    }
   Test a = new Test();
    Test b = new Test();
    a.setAge(1);
    a.setName("hi");

    b.setAge(1);
    b.setName("hi");
    if (a!=b){
        System.out.println("yes");
    }else {
        System.out.println("no");
    }

现在你可以在这里看到同样的问题。

关于这个问题,有一些事情需要注意

通常==是不准确的,因为它比较的是“内存地址”(或者尽可能接近JVM中的内存地址),而不是对象的内容

您应该重写.equals()方法,以便比较对象的每个重要字段。根据有效Java中的Josh Bloch,如果您的对象需要这样做,它们也需要重写.hashCode()方法(否则,当将对象散列到映射中时,它们的行为会很糟糕)


只有在保证对象是不可变的,并且不为具有相同值的对象创建新实例(例如使用
Boolean.valueOf(true/false)
生成的布尔对象)时,才可以使用该==;在任何其他情况下,您都需要一个.equals()方法(或者让它们实现compariable,然后尝试
foo.comparieto(bar)==0

关于这个问题,有一些事情需要注意

通常==是不准确的,因为它比较的是“内存地址”(或者尽可能接近JVM中的内存地址),而不是对象的内容

您应该重写.equals()方法,以便比较对象的每个重要字段。根据有效Java中的Josh Bloch,如果您的对象需要这样做,它们也需要重写.hashCode()方法(否则,当将对象散列到映射中时,它们的行为会很糟糕)


只有在保证对象是不可变的,并且不为具有相同值的对象创建新实例(例如使用
Boolean.valueOf(true/false)
生成的布尔对象)时,才可以使用该==;在任何其他情况下,您都需要一个.equals()方法(或者让它们实现Compariable并尝试
foo.comparieto(bar)==0

,因为它们是不同的对象


尝试更改一个对象中的字段/成员,然后查看另一个对象中的字段是否也已更改。

因为它们是不同的对象


尝试更改一个对象中的字段/成员,然后查看另一个对象中的字段是否也发生了更改。

能否发布一个简短但完整的程序来演示此问题?(例如,你确定在你的原始代码中,你的
if
语句末尾没有额外的
。@考虑到FooBar的打印方式,
FooBar
的最后一点。事实是,有了这些信息,很难提供帮助。如果这些对象相同,则不应显示日志,但如果仅向我们显示日志,我们无法知道发生了什么。由于信息稀疏,您有两个不同的FooBar实例,它们在调用toString()方法时意外地给出了相同的输出。实际上,如果没有额外的代码,这是一个相当糟糕的问题。如果这是显而易见的,很抱歉,但是您是否已重写了
toString()
hashCode()
?这是我能够重现你所说的一切的唯一方法。你能发布一个简短但完整的程序来演示这个问题吗?(例如,你确定在你的原始代码中,你的
if
语句末尾没有额外的
。@考虑到FooBar的打印方式,
FooBar
的最后一点。事实是,有了这些信息,很难提供帮助。如果这些对象相同,则不应显示日志,但如果仅向我们显示日志,我们无法知道发生了什么。由于信息稀疏,您有两个不同的FooBar实例,它们在调用toString()方法时意外地给出了相同的输出。实际上,如果没有额外的代码,这是一个相当糟糕的问题。如果这是显而易见的,很抱歉,但是您是否已重写了
toString()
hashCode()
?这是我唯一能重现你所说的一切的方法。对于自定义对象来说没关系。。除非他推翻了equals()的默认行为,否则最重要的是,情况就是这样。阅读我的答案并尝试此代码。+1表示代码:)对于自定义对象,这无关紧要。。除非他推翻了equals()的默认行为,否则最重要的是,情况就是这样。阅读我的答案并尝试此代码。+1表示代码:)