【发布时间】:2017-10-22 15:20:54
【问题描述】:
为什么这段代码返回的是“false”而不是“true”:
package com.company;
public class Main {
public static void main(String[] args) {
String fullName = "Name Lastname";
String name = "Name ";
String lastName = "Lastname";
String firstNamePlusLastName = name + lastName;
System.out.println(fullName == firstNamePlusLastName);
}
}
如果我没记错的话:
String firstNamePlusLastName = name + lastName;
应该创建一个指向内存中现有地址(字符串池)的字符串,因为我们已经声明了一个值为:“Name Lastname”的字符串,它不应该被自动嵌入到字符串池中并且不应该输出为“真”,因为我们在字符串池中已经有与 String firstNamePlusLastname 具有相同值的字符串?
编辑:
我知道在测试两个字符串的内容是否相等时我应该使用 .equals() 方法,但我不想在上面的示例中这样做,我确实想测试引用是否相等,并且基于 Java我在上面的代码中比较的两个字符串应该相等,但它们不是,它们应该指向内存中的相同地址,因为它们具有相同的内容,并且两个字符串都不是使用“new”关键字创建的。我想知道为什么会这样。
【问题讨论】:
-
你必须使用
equals来比较两个字符串对象。 -
我相信 JLS 坚持认为这是错误的。如果您将参考文献定为最终版本,那就另当别论了。
-
@KevinO:不,它也可以是其他字符串常量的串联......并且用字符串常量初始化的静态最终字段,或者用字符串常量初始化的最终局部字段也是常量表达式。所以是的,在某个地方总会有一个字符串文字(除非一切都是空的),但这不是一回事。
-
我的answer 怎么样,先生。
标签: java string reference pool