==运算符不比较String的引用

Pet*_*rke 2 java

可能重复:
Java中的字符串比较和字符串实习

我理解String equals()方法是如何工作的,但我对String ==运算符的一些结果感到惊讶.

我希望==比较引用,就像它对其他对象一样.

但是,不同的String对象(具有相同的内容)==返回true,甚至对于静态字符串对象(具有相同的内容),这显然不是相同的内存地址.

我猜= =已被定义为与equals相同以防止其被滥用

Jon*_*eet 12

不,== 只是比较引用.但是,我怀疑你被编译时常量被囚禁 - 所以两个文字最终会引用同一个字符串对象.例如:

String x = "xyz";
String y = "xyz";
System.out.println(x == y); // Guaranteed to print true

StringBuilder builder = new StringBuilder();
String z = builder.append("x").append("yz").toString();

System.out.printn(x == z); // Will print false
Run Code Online (Sandbox Code Playgroud)

Java语言规范的3.10.5节:

字符串文字 - 或者更一般地说,作为常量表达式(第15.28节)的值的字符串 - 是"实例化"以便使用String.intern方法共享唯一实例.


Jes*_*mos 5

它返回相同的原因是因为内存优化(并不总是保证会发生)具有相同内容的字符串将指向相同的内存区域以节省空间.在静态对象的情况下,它们总是指向同一个东西(因为static关键字只有一个).再次不要依赖上面的内容而是使用Equals()代替.

我应该从Jon Skeet中指出的一点是它始终保证编译时常量.但是再次使用equals(),因为它更清晰.