字符串对象和堆

flu*_*y88 0 java string heap object

我正在攻读SCJP考试,我正在处理一系列问题.

一个问题的回答我不确定,希望有人能够帮我把这个问题放到一边.

这是问题,

鉴于:

11. public String makinStrings() {
12.    String s = "Fred";
13.    s = s + "47";
14.    s = s.substring(2, 5);
15.    s = s.toUpperCase();
16.    return s.toString();
17. }
Run Code Online (Sandbox Code Playgroud)

调用此方法时将创建多少个String 对象

A. 1
B. 2
C. 3
D. 4
E. 5
F. 6
Run Code Online (Sandbox Code Playgroud)

提前感谢您提供的任何帮助.我非常赞赏它.

And*_*yle 7

让我们一行一行地完成它.

第11行

一个简单的开始,这里没有创建字符串.

12号线

我们将String分配"Fred"s.虽然看起来像是在这里创建了一个String,但是这个字符串将存在于常量池中.所述JVMS新类实例的2.17.6创作保证为字符串文字对象将在最新当周围类被装载,其定义是被创建方法被调用之前.因此,此行上不会创建新的字符串对象.

13号线

"47"引用了文字字符串,它也将被静态创建(如上所述).但是也有+操作符的调用,它将创建一个新的String以保存连接的结果.这是第一个创建的字符串.

第14行

substring方法确实创建了一个新的String.它与其父级共享底层字符数组 - 因此几乎不占用任何额外的内存 - 但由于字符串是不可变的,因此每个不同的字符串表示需要不同的String对象.(这可能是一个问题 - 我的第一个本能反应是"啊,由子串创建的字符串是特殊的"但当然它仍然需要创建一个新对象).

第15行

如上所述 - 大写表示不同,因此必须创建一个新的String来保存结果.

第16行

Strings覆盖toString()方法简单return this- 因此不会创建额外的String.

门上的分数

通过我的计数,在这个方法中创建了三个String对象(其中两个对象共享相同的底层字符数组,并且有两个预先存在的对象为字符串文字引用).