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
为什么是假的??为什么它们指向不同的引用,因为单词已经存在于字符串常量池中。如果我们用相同的值构造一个新的string对象,那么它应该指向已经存在的对象。
5条答案
按热度按时间jmp7cifd1#
您需要使用equals而不是==,因此您的代码必须如下所示
System.out.println(s2.equals(s1))
我们可以使用==运算符进行引用比较(地址比较),使用.equals()方法进行内容比较。简单地说,==检查两个对象是否指向相同的内存位置,而.equals()的计算结果是对象中值的比较。eeq64g8w2#
默认情况下,字符串的标识不相等。字符串池中的字符串仅在该字符串处于内部时返回。
其结果仅来自常量表达式的所有字符串值或字符串串联都将被自动暂存。常量表达式是其值在编译时已知的表达式。这包括:
文字;和
final
原语类型的变量或String
班级。示例:
这是在java语言规范中定义的,§ 15.28.
您的用例没有满足这些需求,因此您的结果是
false
. 你可以通过调用String
sintern()
方法。如果你写过s1 = s1.concat("World").intern();
相反,结果是true
.e4eetjau3#
您正在创建两个对象s1和s2。所以当你这么做的时候
s2==s1
您正在比较这两个对象的引用,因为这两个对象是分开的,所以总是返回false。
如果比较字符串的内容,请尝试实现.equals()方法。
s2.等于(s1)
xxls0lw84#
s1和s2是指向2个不同地址的2个不同引用。因此,s1==s2将始终返回false(因为地址不同)。
k5ifujac5#
这是因为concat()方法返回一个新的string对象
如果改用“+”运算符,则会产生预期的输出:
希望这有助于您的理解,但对于实际使用,在比较字符串值时始终坚持.equals():