请您解释下面的代码:
我知道==
比较了引用而不是值。
但我不清楚以下代码究竟发生了什么?
public class StringEquals {
public static void main(String args[])
{
String s1="AB";
String s2="AB"+"C";
String s3="A"+"BC";
if(s1==s2)
{
System.out.println("s1 and s2 are equal");
}
else
{
System.out.println("s1 and s2 are notequal");
}
if(s2==s3)
{
System.out.println("s2 and s3 are equal");
}
else
{
System.out.println("s2 and s3 are notequal");
}
if(s1==s3)
{
System.out.println("s1 and s3 are equal");
}
else
{
System.out.println("s1 and s3 are notequal");
}
}
}
答案 0 :(得分:0)
在我的系统上,代码打印
s1 and s2 are notequal
s2 and s3 are equal
s1 and s3 are notequal
如果您的问题是原因,那么它与Java编译器如何处理字符串文字有关。
通常,为了提高效率,Java会将对同一个字符串文字的所有引用指向同一个对象。在s2
和s3
的情况下,编译器似乎已经意识到串联的结果是相同的字符串文字,因此它分配了引用s2
和s3
指向内存中的同一个对象。这就是为什么这两者比较等于==
。
由于s1
与[{1}}和s2
的值不同,因此会为其分配不同的内存位置,因此引用不会与s3
进行比较
答案 1 :(得分:0)
在您的代码中,您可能会输出System.out.println("s2 and s3 are equal");
这是由于string interning。当字符串是编译时常量时,JVM将对相同字符串的所有引用设置为同一对象。这是一种节省效率的方法,java标准并没有强制JVM这样做,它只允许它。你永远不应该依赖这种行为。
因为在编译时我们知道"AB"+"C"
和"A"+"BC"
都会评估为" ABC"可以将s2
和s3
都设置为引用字符串池中的单个字符串。
毋庸置疑,即使这种情况在某些情况下起作用,也是一条危险的道路,应该始终使用string.equals(otherString)
来比较字符串
答案 2 :(得分:0)
在Java中,==
检查两个对象是否完全相同,有时候它不是你想的那样。
String s1 = new String("AB")
String s2 = new String("AB")
虽然s1
和s2
具有相同的内容,但s1 == s2
会返回false
。由于它们具有不同的引用,但s1 s2
具有相同的值,因此s1.equals(s2)
返回true