7

我运行了以下程序,

    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);

我的输出是

true
false
false
true
true
false

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

4

4 回答 4

6

池化仅与字符串文字有关 - 因此firstString实际上secondString是同一个对象 - 正如thirdString您明确要求在堆上创建一个新对象一样。

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

它提供了有关如何以及何时合并字符串的更多信息。

另外,请注意本节末尾的这些项目符号:

  • 同一包 (§7) 中同一类 (§8) 中的文字字符串表示对同一 String 对象 (§4.3.1) 的引用。
  • 同一包中不同类中的文字字符串表示对同一 String 对象的引用。
  • 不同包中不同类中的文字字符串同样表示对同一 String 对象的引用。
  • 由常量表达式(第 15.28 节)计算的字符串在编译时计算,然后将其视为文字。
  • 在运行时通过连接计算的字符串是新创建的,因此是不同的。
于 2012-09-09T12:55:55.973 回答
2

对于 firstString 和 secondString,JVM 将查找字符串池并返回“String”的引用。

对于thirdString,JVM 不会查找字符串池,只会在堆中创建一个String 对象。

对于 OneString.intern(),JVM 会在字符串池中查找引用,如果其中不存在 OneString,则将 OneString 添加到字符串池中,并返回该引用。

于 2012-09-09T13:04:34.023 回答
0

thirdString不是来自游泳池。它不是字符串文字,您使用new运算符动态创建它。

secondString另一方面 - 从池中获取(您为其分配了一个字符串文字),因此将相同的对象分配给firstStringsecondString

于 2012-09-09T12:56:10.940 回答
0

“firstString == thirdString”返回假。

方法实习生“返回字符串对象的规范表示。” 如果您分配实习字符串:

thirdString=thirdString.intern();

最后“firstString ==thirdString”返回真

于 2012-09-09T12:56:46.783 回答