这里的!=运算符有什么问题?

时间:2014-02-07 10:41:08

标签: java android

if(foo != bar)
    Log(foo + " is not equal to " + bar);

打印:

  

FooBar @ ca4c33db不等于FooBar @ ca4c33db

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

4 个答案:

答案 0 :(得分:0)

您应该使用equals()

if(!foo.equals(bar))

但使用String,您可以执行以下操作,因为String类已实施equals()方法。

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

Out put:

   yes

如果您想按照自己的方式行事,则必须覆盖equals()方法。

示例:没有覆盖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;
 }
}

现在看看这个

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

Out put:

   yes

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

答案 1 :(得分:-1)

运算符==,测试两个对象引用变量是否引用对象的完全相同的实例。与!= ...

类似

方法.equals(),测试两个对象是否相互比较 - 但它们不一定是同一个对象的完全相同的实例

因此(!foo.equals(bar))将解决您的问题

答案 2 :(得分:-1)

关于这个问题,有几点需要注意。

通常==是不准确的,因为它比较了“内存地址”(或者与JVM中的内存地址相近),而不是对象的内容。

您应该覆盖.equals()方法,以便比较对象的每个重要字段。如果你的对象需要这个,那么根据 Effective Java 中的Josh Bloch,他们也需要覆盖.hashCode()方法(或者你的对象在插入Map时表现不佳)

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

答案 3 :(得分:-1)

因为它们是不同的对象。

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