gpt4 book ai didi

java - 字符串对象计数 SCJP

转载 作者:行者123 更新时间:2023-12-01 11:52:28 27 4
gpt4 key购买 nike

另一个让我困惑的考试问题:

public String makinStrings() {
String s = “Fred”;
s = s + “47”;
s = s.substring(2, 5);
s = s.toUpperCase();
return s.toString();
}

问题是:“调用此方法时将创建多少个 String 对象?”

正确答案应该是 3,但我数了一下:
弗雷德
47
弗雷德47
ed4
ED4

3真的是正确答案吗?如果是这样 - 为什么?

最佳答案

字符串常量在类实例化时实例化。因此,字符串“Fred”和“47”在调用方法之前实例化,而不是在方法调用期间实例化。

本文对此进行了解释:The String Constant Pool

但我会进一步完善它:Java 虚拟机规范指定常量“Fred”和“47”作为条目放置在字符串常量池中。 (java SE specs, loading and linking)。

这发生在加载类时

这里需要关注的另一点:问题是实例化了多少对象。

所以,

String s = "Fred":不实例化新的 String 对象,仅使用内部化的“Fred”常量的引用。

s = s + "47" :“+”运算符表示串联操作;该连接的结果是一个新的 String 对象。因此,实例化了 1 个字符串。 “47”装载了该类...

s = s.substring(2,5):方法定义指定必须返回一个新的字符串对象( String.substring javadoc ),因此实例化了 2 个字符串。

即使实现(例如 the openJDK java.lang.String implementation )可能使用某种构造函数来仅引用具有 String 内部值的字符数组的一部分,结果 new String,即使是一种“懒惰”的字符串。

s = s.toUpperCase():同样,toUpperCase 方法必须返回一个新的字符串。因此,实例化了 3 个字符串。

最后,s.toString() 返回对象的字符串表示形式。由于字符串已经是字符串,因此 s.toString() 仅返回完全相同的字符串对象...

关于java - 字符串对象计数 SCJP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28694930/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com