Java 如果两个字符串具有相同的引用,为什么输出不例外(true)?

Java 如果两个字符串具有相同的引用,为什么输出不例外(true)?,java,string,Java,String,昨天,采访者问了这个问题,该行的输出是什么 public class StringTest { public static void main(String[] args) { String s1 = "abc"; String s2 = "abc"; String s3 = s1+s2; String s4 = s1+s2; //check s1 == s2 System.out.println(s1==s2);

昨天,采访者问了这个问题,该行的输出是什么

public class StringTest {

  public static void main(String[] args) {
      String s1 = "abc";
      String s2 = "abc";
      String s3 = s1+s2;
      String s4 = s1+s2;

      //check s1 == s2
      System.out.println(s1==s2);

      //check s3 == s4
      System.out.println(s3==s4);
  }
}
当我看到这个问题时,我在想面试官问的这个简单的问题。我告诉他输出s1==s2和s3==s4将返回true和true,我非常自信。 突然他说不,那是错误的输出,然后我想他可能是在开玩笑或试图失去我的信心,但直到最后他都说这是错误的。 当我检查输出是否正确时。 我也在想怎么可能请给出一个合适的答案来解决我的困惑。 提前感谢。

s1+s2在编译时是未知的,因此它是在运行时计算的,并创建一个新对象,每次运行时都会有所不同。如果您将s1和s2更改为final,编译器将内联这些常量,并且对于s3==s4,您将得到true

但是

s1+s2在编译时是未知的,因此它在运行时进行计算,并创建一个新对象,每次运行时都不同。如果您将s1和s2更改为final,编译器将内联这些常量,并且对于s3==s4,您将得到true

但是


因为字符串是不可变的,并且在编程中无处不在,所以JVM使用 具有相同字符序列的字符串文字的唯一实例,以提高效率并节省内存。这样的实例称为插入字符串。 让我们说:

String s1 = "xyz";
String s2 = "xyz";

在前面的语句中,s1和s2引用相同的内部字符串xyz,因此s1==s2为真。s3和s4的情况并非如此。您可以在Google上阅读更多有关interned字符串的信息。

因为字符串是不可变的,并且在编程中无处不在,JVM使用 具有相同字符序列的字符串文字的唯一实例,以提高效率并节省内存。这样的实例称为插入字符串。 让我们说:

String s1 = "xyz";
String s2 = "xyz";

在前面的语句中,s1和s2引用相同的内部字符串xyz,因此s1==s2为真。s3和s4的情况并非如此。你可以在谷歌上阅读更多关于实习字符串的信息。

这是关于字符串的第一个问题。谢谢你,谢谢ᴜʀᴇsʜᴀᴛᴛᴀ 忘了/s@amit我找不到我的答案@amit为什么你标记了这个副本。。。。请检查是否没有给出此类问题的解释。因为我发现s1+s2和新字符串s1基本上是相同的概念,后面的问题得到了详细的回答。这是关于字符串的第一个此类问题。谢谢你,谢谢ᴜʀᴇsʜᴀᴛᴛᴀ 忘了/s@amit我找不到我的答案@amit为什么你标记了这个副本。。。。请检查是否没有给出此类问题的解释。因为我发现s1+s2和新的Strings1基本上是相同的概念,后面的问题得到了详细的回答。为什么s3==s4 plz给我原因而不是参考为什么s3==s4 plz给我原因而不是参考
  String s1 = "abc";
  String s2 = "abc";
  // String s3 = s1+s2;
  String s3 = new StringBuilder().append(s1).append(s2).toString();
  // String s4 = s1+s2;
  String s4 = new StringBuilder().append(s1).append(s2).toString();

  //check s3 == s4
  System.out.println(s3==s4); // different objects.
String s1 = "xyz";
String s2 = "xyz";