3

我正在为我的 Oracle Certified Java Programmer 认证做一些模拟测试。我在测试中发现的问题之一是:

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

问题是“调用此方法时将创建多少个 String 对象?”。我数的是 5:“Fred”、“47”、“Fred47”、子字符串“ed4”和大写字符串“ED4”,但问题答案是 3 个对象(并且测试所在的文档没有解释部分)。你能指出我的错误在哪里吗?

4

3 回答 3

4

字符串“Fred”和“47”是静态的,即它们是在加载类时创建的,而不是在调用方法时创建的。

于 2011-11-22T15:59:23.927 回答
4

听起来错误在于“调用此方法时将创建多少个字符串对象”的解释

您说涉及五个字符串是正确的;但是,字符串是不可变的,其中两个是编译到包含该makinStrings()方法的类中的常量。因此,您的五个中的两个预先存在该方法的调用,并且只创建了三个“新”字符串。

这两个常量字符串存在于类的常量池中,并且是在类加载时构建的。

于 2011-11-22T15:59:33.503 回答
1

我能看到的最好的:

public String makinStrings() { 
 String s = “Fred”; 

“Fred”是在类加载时创建并添加到字符串池的字符串文字。赋值时不创建对象;分配只是传递对现有字符串的引用。

 s = s + “47”; 

在这里,一个新的字符串被创建为 s 的先前值和文字“47”的组合。(1)

 s = s.substring(2, 5);

substring() 不对字符串本身进行操作(字符串在 Java 中是不可变的),而是返回一个新的字符串,即方法返回值。(2)

 s = s.toUpperCase();

新字符串,原因与上一行相同。(3)

  return s.toString();
}

String 类中的 toString() 返回对 String 本身的引用。没有创建新对象。

所以3听起来是正确的答案。

于 2011-11-22T16:06:32.487 回答