在JDK 1.6中,String equals操作可以替换为==吗?

时间:2011-04-30 03:07:13

标签: java string equals

在研究一些开源产品的源代码时,我找到了类似的代码:

if (a=="cluser")

a是一个String变量。字符串equals操作可以替换为==吗?

5 个答案:

答案 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

这个例子说明了六点:

  1. 相同的文字字符串 同一个包中的类代表 对同一个String的引用 对象。
  2. 不同的文字字符串 同一个包中的类 代表对它的引用 字符串对象。
  3. 不同的文字字符串 不同包中的类 同样代表对...的引用 相同的String对象。
  4. 由常量计算的字符串 表达式在编译时计算 时间然后再被视为他们 是文字。
  5. 通过串联计算的字符串 运行时间是新创建的 因此不同。
  6. 明确实习的结果 computed string是相同的字符串 作为任何预先存在的文字字符串 具有相同的内容。

答案 4 :(得分:0)

==运算符检查两个对象是否完全相同。它不会比较字符串中的内容。