我运行了以下程序,
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运算符?
汇集关于字符串文字只-所以firstString和secondString实际上是相同的对象-在为thirdString你明确要求在堆上要创建一个新的对象.
它提供了有关如何以及何时汇集字符串的更多信息.
另外,请注意本节末尾的这些子弹:
- 同一个包(第7节)中同一个类(第8节)中的文字字符串表示对同一个String对象的引用(第4.3.1节).
- 同一个包中不同类中的文字字符串表示对同一String对象的引用.
- 不同包中不同类中的文字字符串同样表示对同一String对象的引用.
- 由常量表达式计算的字符串(第15.28节)在编译时计算,然后将其视为文字.
- 在运行时通过串联计算的字符串是新创建的,因此是不同的.