为什么`==`有时适用于字符串?

Tib*_*riu 3 java equality reference object

考虑一下这段代码:

String baz = "Hello";
String foo = "Hello";
return foo.equals(baz); // Returns true as expected
return(baz == foo); // Also returns true!
Run Code Online (Sandbox Code Playgroud)

为什么==运算符在这种情况下也会返回true?应该比较对象本身的位置,而不是它们的值.

我假设Java做了某种内部工作,并确定这两个是类型String(或Integer等),所以它隐式调用该.equals()方法.

我很想知道这是如何完成的(即背景中发生了什么),以及为什么要这样做,如果我真的想在内存中测试它们的位置怎么办?

anu*_*ava 6

return(baz == foo)也返回true,因为所有文字字符串都是用Java实现的.调用实习方法时,如果池已经包含等于此字符串对象的字符串(由equals(Object)方法确定),则返回池中的字符串.否则,将此String对象添加到池中,并返回对此String对象的引用.

因此,简而言之,由于使用String intern pool为您的情况return(baz == foo)表现相同return(baz.equals(foo))

阅读有关Java规范中的字符串文字的更多信息

  • 字符串文字很特殊,字符串实习池也是如此。如果你使用“new”,你将得到一个新对象。某些类确实具有静态工厂方法,可以返回具有正确值的现有对象。 (2认同)