我运行了以下程序,

    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返回false? jvm是否仅合并仅使用:“”而不使用new运算符初始化的字符串?

最佳答案

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

我建议阅读有关string literals in the spec的部分。

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

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

关于java - Java字符串问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12339230/

10-10 19:38