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)
提前感谢您提供的任何帮助.我非常赞赏它.
让我们一行一行地完成它.
第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对象(其中两个对象共享相同的底层字符数组,并且有两个预先存在的对象为字符串文字引用).