有人问我这个问题:
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对象中只有两个不会丢失。
这是正确的吗?
答案是: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。
String
在这种情况下,JVM搜索字符串池以查看是否已经存在等效字符串。如果是,则返回相同的引用。如果不是,则将其添加到字符串池并返回引用。 因此,可能会创建一个新对象,也可能不会。
现在,JVM必须在堆上创建一个对象。由于 新 。OneString字符串池中是否已存在都没关系。
OneString
您还可以将字符串放入池中:
您可以在String对象上调用intern()。如果尚未将String对象放入池中,则将其放入池中,并将对池字符串的引用返回。(如果它已经在池中,则只返回对该对象的引用)。
您可能希望查看以下链接:
什么是Java字符串池?“ s”与新的String(“ s”)有何不同?
有关Java的字符串池的问题