我有一些奇怪的字符串池行为的问题。我正在使用==比较相等的字符串来找出它们是否在池中。
==
public class StringPoolTest { public static void main(String[] args) { new StringPoolTest().run(); } String giveLiteralString() { return "555"; } void run() { String s1 = giveLiteralString() + ""; System.out.println("555" == "555" + ""); System.out.println(giveLiteralString() == giveLiteralString() + ""); } }
输出为:
true false
这对我来说是一个很大的惊喜。有人可以解释一下吗?我认为这是在编译时发生的。但是,为什么添加""到String 根本没有任何区别呢?
""
"555" + ""
是一个编译时常量,而
giveLiteralString() + ""
不是。因此,前者仅编译为字符串常量“ 555”,而后者则编译为实际的方法调用和串联,从而生成一个新的String实例。
另请参见JLS§3.10.5(字符串文字):
在运行时通过串联计算的字符串是新创建的,因此是不同的。