Java字符串问题

vve*_*lva 7 java string

我运行了以下程序,

    String firstString = "String";
    String secondString = "String";
    String thirdString = new String("String");
    System.out.println(firstString == secondString);
    System.out.println(firstString == thirdString);
    System.out.println(firstString.intern() == thirdString);
    System.out.println(firstString.intern() == thirdString.intern());
    System.out.println(firstString.intern().equals(thirdString.intern()));
    System.out.println(firstString == thirdString);
Run Code Online (Sandbox Code Playgroud)

我的输出是

true
false
false
true
true
false
Run Code Online (Sandbox Code Playgroud)

我了解到jvm将字符串与相同字符串的内容相同.是对的吗?如果这是真的那么为什么不是firstString == thirdString返回false?jvm是否仅汇集仅使用:""初始化的字符串,而不是使用new运算符?

Ron*_*onK 6

汇集关于字符串文字只-所以firstStringsecondString实际上是相同的对象-在为thirdString你明确要求在堆上要创建一个新的对象.

我建议阅读规范中关于字符串文字的部分.

它提供了有关如何以及何时汇集字符串的更多信息.

另外,请注意本节末尾的这些子弹:

  • 同一个包(第7节)中同一个类(第8节)中的文字字符串表示对同一个String对象的引用(第4.3.1节).
  • 同一个包中不同类中的文字字符串表示对同一String对象的引用.
  • 不同包中不同类中的文字字符串同样表示对同一String对象的引用.
  • 由常量表达式计算的字符串(第15.28节)在编译时计算,然后将其视为文字.
  • 在运行时通过串联计算的字符串是新创建的,因此是不同的.