比较对象时使用==

KWJ*_*104 4 java

最近在求职面试中,我被问到以下问题(针对Java):

鉴于:

String s1 = "abc";
String s2 = "abc";
Run Code Online (Sandbox Code Playgroud)

什么是回报值

(s1 == s2)
Run Code Online (Sandbox Code Playgroud)

我回答它会返回false,因为它们是两个不同的对象,==是内存地址比较而不是值比较,并且需要使用.equals()来比较String对象.然而,我被告知虽然.equals(0方法是正确的,但声明仍然是真的.我想知道是否有人可以向我解释为什么它是真的,但为什么我们仍然在学校教授使用equals() ?

Gre*_*ill 8

字符串常量扣留你的JVM(这是规范中按照需要在这里):

所有文字字符串和字符串值常量表达式都是实体.字符串文字在Java语言规范的 §3.10.5中定义

这意味着编译器已经创建了一个表示字符串的对象"abc",并设置了两个s1s2指向同一个实体对象.

  • +1引用JLS.与其他一些答案似乎暗示的相反,对于字符串文字,这种行为是**保证**. (2认同)

Bro*_*ass 5

java将实习两个字符串,因为它们都具有相同的值,只有一个实际的字符串实例将存在于内存中 - 这就是为什么==将返回true - 两个引用都指向同一个实例.

字符串实习是一种优化技术,用于最小化必须保存在内存中的字符串实例的数量.作为常量表达式值的字符串文字或字符串被实现,以便共享唯一的实例.认为flyweight模式.