在研究一些开源产品的源代码时,我找到了类似的代码:
if (a=="cluser")
a
是一个String变量。字符串equals
操作可以替换为==
吗?
答案 0 :(得分:6)
您应该从不使用==
,并且几乎始终使用equals()
。只有两个字符串引用同一个对象时,它才能与==
一起使用。 intern()
上有String
方法,为给定的字符串值返回相同的引用。字符串文字是隐式实现的。只有在你有充分理由的情况下才能使用==
进行字符串比较,即使这样你也需要非常小心。
唯一的好理由是表现,而且很少会有关系。只需优化您肯定知道,您需要这样做。否则通常不值得麻烦。如果您正在查看一些开源代码,他们可能会遇到一种情况,即比较是在一个非常紧凑的循环中或非常频繁地调用,优化可以提供帮助。或者它只是过早优化,似乎很安全。
答案 1 :(得分:4)
如果两个字符串是实习的,您可以使用==。字符串文字定义为实习,因此,如果我将文字“fred”分配给String变量并将其作为参数传递给另一个类中与“fred”进行比较的方法,则== test将是真。
所以样本代码肯定不是有缺陷的,可能就是这样。
答案 2 :(得分:3)
只有字符串被“实习”。通常没有。
答案 3 :(得分:1)
来自Java语言规范,第3.10.5节“字符串文字”
每个字符串文字都是对String类实例的引用。 String对象具有常量值。字符串文字 - 或者更一般地说,作为常量表达式值的字符串是“实例化”,以便使用String.intern方法共享唯一实例。
因此,测试程序由编译单元组成:
package testPackage;
class Test {
public static void main(String[] args) {
String hello = "Hello", lo = "lo";
System.out.print((hello == "Hello") + " ");
System.out.print((Other.hello == hello) + " ");
System.out.print((other.Other.hello == hello) + " ");
System.out.print((hello == ("Hel"+"lo")) + " ");
System.out.print((hello == ("Hel"+lo)) + " ");
System.out.println(hello == ("Hel"+lo).intern());
}
}
class Other { static String hello = "Hello"; }
和编译单元:
package other;
public class Other { static String hello = "Hello"; }
产生输出:
true true true true false true
这个例子说明了六点:
答案 4 :(得分:0)
==运算符检查两个对象是否完全相同。它不会比较字符串中的内容。