小编典典

Java如何处理内存中的String对象?

java

有人问我这个问题:

String s = "abc"; // creates one String object and one
          // reference variable
In this simple case, "abc" will go in the pool and s will refer to it.
String s = new String("abc"); // creates two objects,
                 // and one reference variable*

根据以上详细信息,在以下代码的println语句之前创建了多少String对象和多少参考变量?

String s1 = "spring ";
String s2 = s1 + "summer ";
s1.concat("fall ");
s2.concat(s1);
s1 += "winter ";
System.out.println(s1 + " " + s2);

我的回答是,此代码片段的结果是spring winter spring summer

有两个参考变量s1和s2。总共创建了八个String对象,如下所示:“ spring”,“ summer”(丢失),“ spring summer”,“
fall”(丢失),“ spring fall”(丢失),“ spring summer spring”(丢失)
),“冬天”(丢失),“春天冬天”(此时“春天”丢失)。

在此过程中,八个String对象中只有两个不会丢失。

这是正确的吗?


阅读 220

收藏
2020-11-16

共1个答案

小编典典

答案是:2个引用和8个对象。

String s1 = "spring "; //One reference and 1 object in string pool. (if it didn't exist already)

String s2 = s1 + "summer "; //Two references and 3 objects

s1.concat("fall "); //Two references and 5 objects

s2.concat(s1); //Two references and 6 objects

s1 += "winter "; //Two references and 8 objects

System.out.println(s1 + " " + s2);

现在的问题是: Java如何处理内存中的String对象?

Java提供了两种创建类对象的方法String

  1. 字符串str1 =“ OneString”;

在这种情况下,JVM搜索字符串池以查看是否已经存在等效字符串。如果是,则返回相同的引用。如果不是,则将其添加到字符串池并返回引用。
因此,可能会创建一个新对象,也可能不会。

  1. 字符串str1 = new String(“ OneString”);

现在,JVM必须在堆上创建一个对象。由于 OneString字符串池中是否已存在都没关系。

您还可以将字符串放入池中:

您可以在String对象上调用intern()。如果尚未将String对象放入池中,则将其放入池中,并将对池字符串的引用返回。(如果它已经在池中,则只返回对该对象的引用)。

您可能希望查看以下链接:

什么是Java字符串池?“ s”与新的String(“
s”)有何不同?

有关Java的字符串池的问题

2020-11-16