可能重复:
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");
}
}
}
答案 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。您可以根据需要定义使两个对象相等的内容,但如果对象实际上只是指向内存中同一对象的两个指针,则它们只有==
。