java - 字符串对象计数 SCJP

标签 java string

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

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/

相关文章:

php - Python 是什么,PHP 的 'explode' 是什么?

javascript - jquery逻辑从字符串中获取结果

Java - TableModel 和 DefaultTableModel

java - 如何通过Ant编译jsoup?

java - Android 雅虎 Aviate 启动器页面滑动效果

java - 垃圾收集器 - 多个指针指向同一对象

java - Struts 1 使用 POST 请求参数从一个操作重定向到另一个操作

java - 使用日期错误打印该月的天数?

C++仅从数组中获取数据的中间部分

c++ - 迭代字符串中单词的最有效方法