以下代码(来自采访)产生了false
的输出,但我认为它应该是true
。
public static void main(String[] args) {
String a = "hello";
String b = a + "world";
String c = "helloworld";
System.out.println(b==c);
}
我认为常量String表达式是可插入的,并且a + "world"
是一个常量,因此它应该是"hello world"
的内插值。
有人可以解释为什么输出是false
吗?
答案 0 :(得分:2)
Java实习所有编译时间常数的字符串。但是,只有通过串联字符串 literals 声明的字符串才被视为编译时间常量,因此可以被内插。
这是因为编译器仅查看正在编译的行,因此不知道a
是否为常数。例如,a
可以声明为:
String a = new Date().toString();
因此,c
与b
是String的不同实例。
答案 1 :(得分:0)
执行此操作时,
String b=a+"world";
编译器选择StringBuilder
对象的基于String
的串联,
StringBuilder sb = new StringBuilder(a);
sb.append("world");
String b = sb.toString();
这将产生一个不同的引用,因此像您的情况一样返回false
。
但是如果您使用它,
String b="hello"+"world";
然后,编译器将其标识为常量,并且b
和c
变量在常量池中引用相同的文字。因此,它将返回true
。
答案 2 :(得分:0)
像示例中那样分配字符串时,a
,b
和c
是单独的String
对象。因此,当您比较它们时,您会得到false
,因为它们不是同一对象。 Java中的==
不会对字符串进行逐字符比较。这就是String.equals()
的目的。
这是一个易于理解的摘要,How do I compare strings in Java?
答案 3 :(得分:0)
您正在查看的代码在指向两个不同字符串实例的两个变量之间进行相等比较,这两个实例是存储在内存中不同位置的不同对象(因此),即使它们表示的字符串是相同。
要进行字符串比较,您需要使用
stringInstance.equals(anotherStringInstance)
如果您做了类似的事情
String a = "abcde";
String b = a;
然后,当两个变量都指向同一个对象时,您将获得== b为真。