为什么第一次比较(s1 == s2)显示相等而第二次比较(s1 == s3)显示不相等....?
public class StringComparison
{
public static void main( String [] args)
{
String s1 = "Arsalan";
String s2 = "Arsalan";
String s3 = new String ("Arsalan");
if ( s1 == s2 )
System.out.println (" S1 and S2 Both are equal...");
else
System.out.println ("S1 and S2 not equal");
if ( s1 == s3 )
System.out.println (" S1 and S3 Both are equal...");
else
System.out.println (" S1 and S3 are not equal");
}
}
答案 0 :(得分:11)
这与您无法将字符串与==
以及编译器优化进行比较这一事实有关。
==
仅比较双方是否引用同一对象的完全相同的实例。它没有比较内容。要比较字符串的实际内容,您需要使用s1.equals(s2)
。
现在s1 == s2
为真且s1 == s3
为假的原因是因为JVM决定优化代码,以便s1
和s2
是同一个对象。 (它被称为“String Pooling。”)
按照3.10.5:字符串文字的汇集实际上是由标准规定的。
此外,字符串文字总是指同一个类的实例 串。这是因为字符串文字 - 或者更一般地说是字符串 这是常量表达式的值(§15.28) - 是“实习” 以便使用String.intern。方法共享唯一的实例。
答案 1 :(得分:4)
不要使用==
来比较字符串,它会测试引用相等性(两个名称引用同一个对象)。试试s1.equals(s2);
,它实际上测试元素是否相等。
答案 2 :(得分:1)
String one = "Arsalan";
String two = "Arsalan";
一个==两个
//返回true,因为在内存中两个字符串都指向SAME对象
one.equals(two)
//总是会返回true,因为字符串的值是相同的(如果对象被不同地引用则无关紧要)。
答案 3 :(得分:1)
原因是string interning。情况很复杂。编译器“智能”足以对s1和s2使用相同的确切对象,即使您可能认为它们不同。但是使用new String("Arsalan")
的s3不实习。
一些指导原则:
String s = new String("foo")
。
相反,请使用String s = "foo"
。答案 4 :(得分:1)
如果" Arsalan"在Strings,a" Arsalan"将创建字符串,s1将引用它。自" Arsalan"字符串已经存在于字符串池中,s2将引用与s1相同的对象。因为new关键字用于s3,Java将在普通(非池)内存中创建一个新的String对象,而s3将引用它。这就是为什么s1和s3不能引用同一个对象的原因。
答案 5 :(得分:0)
请勿使用==
,而是使用s1.equals(s2)
或s1.equals(s3)
。
答案 6 :(得分:0)
public class StringComparison
{
public static void main( String [] args)
{
String s1 = "Arsalan";
String s2 = new String("Arsalan");
String s3 = new String ("Arsalan");
if ( s1 == s2 )
System.out.println (" S1 and S2 Both are equal...");
else
System.out.println ("S1 and S2 not equal");
if ( s1 == s3 )
System.out.println (" S1 and S3 Both are equal...");
else
System.out.println (" S1 and S3 are not equal");
if ( s2 == s3 )
System.out.println (" S2 and S3 Both are equal...");
else
System.out.println (" S2 and S3 are not equal");
}
}
如果你运行它,你会发现S2和S3也不相等。这是因为s2,s3是对String对象的引用,因此它们包含不同的地址值。