【发布时间】:2013-10-30 02:20:59
【问题描述】:
当我使用双引号将 2 个 strings 与 (+) 运算符连接并与具有相同值的其他字符串文字进行比较时,结果为 true .. 但是当我连接时2个字符串变量和比较给出假?为什么会这样?
据我所知,当我们使用 (+) 运算符连接字符串时,JVM 会返回新的 StringBuilder(string...).toString(),它会在堆内存中创建一个新的 String 实例,并在 String pool 中创建一个引用。如果这是真的,它如何在一种情况下返回 true 而在另一种情况下返回 false?
第一种情况:
String string1 = "wel";
String string2 = "come";
string1 = string1 + string2; //welcome
String string3 = "welcome";
System.out.println(string3 == string1); // this returns false but have same hashcode
第二种情况:
String string4 = "wel" + "come";
String string5 = "wel" + "come";
System.out.println(string4 == string5); // this returns true
有人可以帮我解决这个问题吗?
【问题讨论】:
-
如果你连接非
finalString变量,是的,你将有一个StringBuilder。如果你连接String文字,即不会。常量。 -
总是将字符串与
equals()方法比较为string3.equals(string1); -
“据我所知,当我们使用 (+) 运算符连接字符串时,JVM 返回 new StringBuilder(string...).toString() 会在堆内存中创建一个新的 String 实例”不是真的当您在源代码中连接字符串文字时,例如
"wel" + "come"。这种连接是在编译时完成的,就像你写了"welcome"一样。 Suresh Atta's answer 中指出了这一点。 -
@user2511414 :我在这里使用 == 来检查两个值是否引用字符串池中的同一个实例,这是验证字符串池引用的唯一方法。目的是了解字符串池的工作原理。