我有以下代码:
String s1 = new String("Test");
String s2 = new String("Test");
String s3 = "Test";
String s4 = "Test";
System.out.println(s1 == s2);
System.out.println(s3 == s4);
我得到以下输出:
false
true
为什么第二次比较会打印true
?
答案 0 :(得分:5)
比较String
的正确方法是,
s1.equals(s2)
System.out.println(s1==s2)
打印false
,因为s1
和s2
指向堆上的不同对象。
System.out.println(s3==s4)
打印true
,因为s3
和s4
是指向堆上同一对象的对象引用。
答案 1 :(得分:3)
不确定它是否回答了问题,但是:
==
用于比较引用(指针)
所以s1==s2
不要检查字符串是否相同,但s1和s2是否是同一个String
实例。
要检查相等性,您必须使用equals
函数:s1.equals(s2)
当字符串被内化时,行为取决于jvm并且无法预测(即使大多数实现都是相同的)
答案 2 :(得分:2)
在Java中,重要的是要注意,==
总是意味着“如果这两个东西引用内存中对象的相同实例则返回true”
使用构造函数声明字符串时:
String s1 = new String("Foo");
String s2 = new String("Foo");
始终会创建 新字符串实例 。这意味着即使它们具有相同的值,s1
和s2
永远不会是同一个对象,因此==
将返回false。
然而,常量字符串有一种特殊情况。当你声明一个字符串时:
String s3 = "Foo";
String s4 = "Foo";
然后在字符串池中创建一个常量字符串,并且变量s3和s4都指向它作为内存优化。但是,这应该被视为实现细节。仍应始终使用Equals方法进行比较。