【发布时间】:2021-03-31 09:57:20
【问题描述】:
String s1="Hello";
s1=s1.concat("World");
String s2="HelloWorld";
System.out.println(s1);
System.out.println(s2);
System.out.println(s2==s1); //false
在连接之后,“HelloWorld”字符串在字符串常量池中创建,我们正在创建另一个具有相同单词“HelloWorld”的字符串,然后它已经存在于字符串常量池中,因此它返回现有的引用。 那么,为什么我的代码在输出中给出了 false 呢?
String s1="Hello";
String s2="HelloWorld";
s1=s1.concat("World");
System.out.println(s1);
System.out.println(s2);
System.out.println(s2==s1);//false
String s1="Hello";
s1=s1+"World";
String s2="HelloWorld";
System.out.println(s1);
System.out.println(s2);
System.out.println(s2==s1);//false
为什么是假的?? 为什么他们指向不同的参考。 因为这个词已经存在于字符串常量池中。那么如果我们形成一个具有相同值的新字符串对象,那么它应该指向已经存在的对象。
【问题讨论】:
-
这是什么语言?
-
语言 - Java
-
"由于连接后,"HelloWorld" 字符串会在字符串常量池中创建" 不,只有在 (a)您使用
+作为连接运算符,而不是concatenate方法和(b) 如果您连接编译时间常数。这些条件都不满足。 -
在
s1+"World"s1不是编译时间常数,因为编译器不能确定s1的值,因为它不是final。试试final String s1="Hello";看看有什么不同。您还需要为连接结果声明新变量,因为您无法将该结果重新分配回已经初始化的 s1。所以你需要像String s3 = s1 + "World";这样的东西,然后比较s2 and s3而不是s2 and s1 -
@ArvindKumarAvinash 我确信 Jon Skeet 的某个答案可以更好地解释它。现在的主要目标是找到答案并将这个问题链接到它:)
标签: java string stringbuilder stringbuffer string-constant