文字字符串创建与字符串对象创建

2023-11-22

创建了多少个 String 对象

我正在为 SCJP 学习,我似乎无法解决这个字符串问题。根据我如何看待问题,我似乎看到了几种可能的答案。

在下面的初始化中,创建了多少个字符串对象?

String s1 = "A" + "B" + "C" + "D";
System.out.println(s1)

最初我想到了 5 个对象,即

"A"
"B"
"C"
"D"
"ABCD"

但后来想想,我不太确定,因为例如编译器会连接"A" + "B"作为一个对象?即创建 7 个对象?

"A"
"B"
"C"
"D"
"AB"
"ABC"
"ABCD" 

另外,如果将代码更改为,将创建多少个对象

String s1 = new String("A" + "B" + "C" + "D");
System.out.println(s1);

最后怎么样:

String s1 = "A";
String s2 = new String("A");

在上面的例子中我认为只会创建 2 个对象

object 1 - "A"
object 2 - a String object that refers to the "A" object above.

这是正确的还是它们不相关?即常量池引用的对象将与 s2 引用引用的对象不同。

Thanks

Edit

另外,请注意,我有兴趣了解创建的对象总数,包括那些被丢弃的对象,而不仅仅是最终进入常量池的对象。

Edit

看看乔恩的回答,我可能完全误解了对象的创建方式。我知道字符串在常量池中仅创建一次,并且会被重用,但我不确定构造“最终”字符串时所经历的过程。这是我正在阅读的书中的部分,它似乎表明创建临时对象,这与此处的答案完全相反。 (也许这本书是错的,或者我误解了这本书)

代码示例是

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

问题是

输出是什么?对于额外的学分,有多少个 String 对象以及如何 创建了许多参考变量在 println 语句之前.

以及答案

该代码片段的结果是spring water spring summer。那里 是两个参考变量,s1 和 s2。总共有八个 创建的字符串对象如下“spring”、“summer”(丢失)、“spring” 夏天”、“秋天”(丢失)、“春天秋天”(丢失)、“春夏春天” (丢失)、“冬天”(丢失)、“春冬”(此时“春”是 丢失的)。八个 String 对象中只有两个没有丢失 过程

Thanks


编译器会将整个“A”+“B”+“C”+“D”连接成一个常量 - 因此在第一个示例中,最终只创建了一个字符串at all。如果多次执行相同的代码,同一字符串将被重复使用。该常量被放入类文件中,当加载该类时,VM 检查字符串池中是否已存在相等的字符串 - 因此即使您在多个类中具有相同的代码,它也会重用它。

您可以使用以下命令验证类中的常量池中是否只有一个字符串javap:

javap -v Test

Constant pool:
   #1 = Methodref   #6.#17     //  java/lang/Object."<init>":()V
   #2 = String      #18        //  ABCD
   #3 = Fieldref    #19.#20    //  java/lang/System.out:Ljava/io/PrintStream;

然而,这里:

String s1 = "A";
String s2 = new String("A");

你最终会得到两个单独的字符串对象。每次执行代码时都会重用一个(常量)(并在两个语句之间共享),并且一个new由于每次构造函数调用都会创建一个。

例如,这个方法:

public static void foo() {
    for (int i = 0; i < 5; i++) {
        String s1 = "A";
        String s2 = new String("A");
    }
}

...将结束using六个字符串对象 - 一个用于常量,五个new每次调用该方法时创建的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

文字字符串创建与字符串对象创建 的相关文章

随机推荐