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