在JDK 1.6中,String equals操作可以替换为==吗?
当我研究一些开源产品的源代码时,我发现代码如下:
if (a=="cluser")
a
是一个String变量。 字符串equals
操作可以替换为==
吗?
你几乎不应该使用==
并且几乎总是使用equals()
。 如果两个字符串都引用同一个对象,它只能用于==
。 String
上有一个intern()
方法,为给定的字符串值返回相同的引用。 字符串文字是隐式实现的。 只有你有一个很好的理由,你应该使用==
进行字符串比较,即使这样你也需要非常小心。
唯一的好理由是表现,而且很少会有关系。 只有在您确定需要时才进行优化。 否则通常不值得麻烦。 如果您正在查看一些开源代码,他们可能会遇到这样的情况,即比较是在一个非常紧凑的循环中或非常频繁地调用,优化可以提供帮助。 或者它只是过早优化,似乎安全。
如果两个字符串被中断,您可以使用==。 字符串文字定义为实习,因此,如果我将文字“fred”分配给String变量并将其作为参数传递给另一个类中与“fred”进行比较的方法,则== test将是真正。
所以样本代码肯定不是有缺陷的,可能就是这样。
只有字符串被“实习”。 通常没有。
从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
这个例子说明了六点:
- 同一个包中同一个类中的文字字符串表示对同一个String对象的引用。
- 同一个包中不同类中的文字字符串表示对同一String对象的引用。
- 不同包中不同类中的文字字符串同样表示对同一String对象的引用。
- 由常量表达式计算的字符串在编译时计算,然后将其视为文字。
- 在运行时通过串联计算的字符串是新创建的,因此是不同的。
- 显式实例化计算字符串的结果与具有相同内容的任何预先存在的文字字符串相同。
==运算符检查两个对象是否完全相同。 它不会比较字符串中的内容。