[英]String comparison and interning
以下代码(来自采访)产生了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"
,而a + "world"
是一个常量,因此它应该作为"hello world"
实例。
有人可以解释为什么输出false
吗?
Java实习所有编译时间常数的字符串。 但是,只有通过串联String 文字声明的String才被视为编译时间常数,因此可以进行插值。
这是因为编译器仅查看正在编译的行,因此不知道a
是否为常数。 例如, a
可以被声明为:
String a = new Date().toString();
因此, c
是字符串比的不同实例b
。
当您这样做时
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
。
如示例中那样分配字符串时, a
, b
和c
是单独的String
对象。 因此,当您比较它们时,您会得到false
因为它们不是同一对象 。 Java中的==
不会对字符串进行逐字符比较。 那就是String.equals()
目的。
这是一份易于理解的摘要: 如何在Java中比较字符串?
您正在查看的代码在指向两个不同字符串实例的两个变量之间进行相等比较,这两个实例是存储在内存中不同位置的不同对象(因此),即使它们表示的字符串相同也是如此。
要进行字符串比较,您需要使用
stringInstance.equals(anotherStringInstance)
如果你做了这样的事情
String a = "abcde";
String b = a;
然后,由于两个变量都指向同一个对象,因此您将得到a == b为真。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.