0

可能的重复:
Java String.equals 与 ==
有什么区别“.equals 和 ==”

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

4 回答 4

2

使用 != 意味着您检查内存中的实例引用,并且相同的实例将为您true提供该比较。

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

对该新字符串调用intern()可能会改变这种行为,因为该字符串现在将被抓取或添加到字符串池中。

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

于 2011-08-16T00:06:29.150 回答
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,第一个是因为它们不是同一个对象,第二个是因为值不一样。

于 2011-08-16T00:10:12.867 回答
0

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

- 编辑 -

我的评论更多地是“不能像在其他语言中那样以预期的方式比较对象的值”。当然,您可以使用 == 符号,但不能用于文本比较。这是每次有人从脚本语言或其他支持运算符以对字符串进行文本比较的语言迁移到 Java 时都会提出的经典问题。

于 2011-08-15T23:59:56.153 回答
0

字符串是对象,而不是原语。 ==并将!=两个基元相互比较。要比较字符串,您需要遍历每个字符并按顺序比较它们.equals()

如果您在 Java 中执行任何 OOP,则当您想要对对象进行相等检查时需要覆盖 equals,并实现 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。您可以根据需要定义使两个对象相等的原因,但对象只有==在它们实际上只是指向内存中同一对象的两个指针时才是。

于 2011-08-16T00:01:16.153 回答