为什么!=和==的行为不像Java中的equals方法?

时间:2011-08-15 23:57:06

标签: java equals equals-operator

  

可能重复:
  Java String.equals versus ==
  whats the difference between ".equals and =="

public String getName() {
    return new String("foobar");
}

if(getName() != "foobar2") {
    //Never gets executed, it should, wtf!.
}

if(!getName().equals("foobar2")) {
   //This works how it should.
}

所以是的,我的问题很简单..为什么!=的行为与!equals() aka(not Equals)的行为相同。

我没有看到为什么一个人应该失败的任何逻辑上的理由,两者都是我心目中的完全相同的代码,WTH。

看看java运营商 http://download.oracle.com/javase/tutorial/java/nutsandbolts/operators.html

你可以清楚地看到 平等== !=

是相等运算符,我通常只在数字上使用!= ..但我的思维开始徘徊,为什么它不适用于String

修改 这看起来更像是实际问题..

    for (ClassGen cg : client.getClasses().values()) {
        final ConstantPoolGen cp = cg.getConstantPool();
        if(cp.lookupInteger(0x11223344) != -1) {
            for (Method m : cg.getMethods()) {  
                System.out.println("lots of class spam");
                if(m.getName() != "<init>") continue;
                System.out.println("NEVER GETS HERE, 100% SURE IT HAS CONSTRUCTOR LOL");
            }
        }
    }

4 个答案:

答案 0 :(得分:2)

使用!=表示您检查内存中的实例引用,同一个实例将为您提供true的比较。

执行new String("foobar")时,会在内存中创建一个新的“foobar”,使用==的比较将返回false。

在该新字符串上调用intern()可能会更改此行为,因为现在将抓取String或将其添加到字符串池中。

无论如何,使用'equals()'会更安全。

答案 1 :(得分:1)

public static void main(String[] args) throws Exception {

    if (getName() != "foobar2") {
        System.out.println("1");
    }

    if (!getName().equals("foobar2")) {
        System.out.println("2");
    }
}

public static String getName() {
    return new String("foobar");
}

对我来说这是输出:

1
2

但这两项检查并不相同。第一项检查是检查getName()返回的对象是否是为字符串文字“foobar2”创建的同一对象,而不是。第二次检查可能是你想要的,它检查getName()方法返回的String对象的VALUE是否等于为“foobar2”字符串文字创建的String对象的VALUE。

因此两个检查都将返回true,第一个检查将返回true,因为它们不是同一个对象,第二个检查将返回相同的对象。

答案 2 :(得分:0)

运算符仅适用于基元,而不适用于对象,因此必须进行字符串比较equals,因为它在对象级别运行。

- 编辑 -

我的意见更多的是“对象的价值无法像其他语言一样以预期的方式进行比较”。当然你可以使用==符号,但不能用于文本比较。这是每次有人从脚本语言迁移到Java时要求的经典问题,或者支持运算符在字符串上进行文本比较的其他语言。

答案 3 :(得分:0)

字符串是Object,而不是基元。 ==!=将两个基元相互比较。 要比较字符串,您需要循环遍历每个字符,并按照.equals()所做的顺序进行比较。

如果您在Java中执行任何OOP,则需要在对对象执行相等性检查时覆盖等于,并且如果您希望能够执行排序等操作,则需要实现Comparable和.compare()

以下是equals的快速示例:

public class Person {
    public name;

    public Person(String name) {
        this.name = name;
    }

    public boolean equals(Object o){
        if(o instanceof Person)
            if(this.name.equals(o.name))
                return true;
        return false;
    }
}

现在可以将一个人与另一个人进行比较,如:

person1.equals(person2)

只有两个人都有相同名称才会返回true。您可以根据需要定义使两个对象相等的内容,但如果对象实际上只是指向内存中同一对象的两个指针,则它们只有==