当我使用双引号和加号运算符将2个字符串连接起来,并与具有相同值的其他字符串文字进行比较时,结果为true。但是当我连接2个字符串变量并进行比较时,结果为false?为什么会这样?
据我所知,当我们使用(+)运算符连接字符串时,JVM返回一个新的StringBuilder(string...)实例.toString(),它在堆内存中创建一个新的String实例和一个字符串池中的引用。如果这是真的,那么为什么在一个场景中返回true,在另一个场景中返回false呢?
第一个场景:
第二种情况:
有人能帮我吗?
据我所知,当我们使用(+)运算符连接字符串时,JVM返回一个新的StringBuilder(string...)实例.toString(),它在堆内存中创建一个新的String实例和一个字符串池中的引用。如果这是真的,那么为什么在一个场景中返回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
有人能帮我吗?
String
变量,则会生成StringBuilder
。如果您连接String
字面值,即常量,则不会生成。 - Sotirios Delimanolisequals()
方法比较字符串,如string3.equals(string1);
。 - user2511414Strings
字面量并不是在字符串池中被合并,而是String
常量。这包括编译器通过常量折叠过程创建的常量:http://ideone.com/ZxmLzN - millimoose