2017-06-04 72 views
1

我碰到一个问题就问的以下的输出:差异,并引用

String s1 = "String 1"; 
    String s2 = "String 2"; 

    String s3 = s1 + s2; 
    String s4 = "String 1" + "String 2"; 

    System.out.println(s3==s4); 

输出 - false

现在,由于字符串不是使用new操作符创建的,所以这些对象是在字符串池中创建的,因此根据我的理解,s1 + s2"String 1" + "String 2"应该相等,而s3==s4应该是true

但它并不是真的发生。任何人都可以解释一下吗?

+0

查看其中哪些等同于##intern'调用的结果 – Rogue

+0

此外,还有[此文档讨论](https://stackoverflow.com/documentation/java/109/strings#t=201706040901437355417) – KevinO

回答

4

The concatenation正在运行时发生,除非两个操作数都是编译时常量表达式。

将一个final修改前S1和S2,其结果将是真实的,因为编译器会简单地取代

String s3 = s1 + s2; 

通过

String s3 = "String 1String 2"; 

如果你不这样做,一个新的String是在运行时创建的,通过将两个字符串附加到一个StringBuilder并获得结果。

请注意,虽然从知识的角度来看这很有趣,但在实践中,您不应该在意性能优化,并始终将字符串与equals()进行比较。

1

该行比较两个字符串的内存地址。由于两者都是独立的对象,输出将是错误的。

s3==s4 

你需要使用equals()

System.out.println(s3.equals(s4)); 

equals()被比较的对象没有解决的价值比较。