由方法创建的字符串对象

时间:2011-11-22 15:56:08

标签: java scjp

我正在为我的Oracle认证Java程序员认证做一些模拟测试。我在测试中发现的一个问题就是这个问题:

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个对象(以及测试所在的文档没有解释部分)。你能指出我的错误在哪里吗?

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:1)

我能看到的最好:

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

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

 s = s + “47”; 

这里,创建一个新的String作为s的前一个值和文字“47”的组合。 (1)

 s = s.substring(2, 5);

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

 s = s.toUpperCase();

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

  return s.toString();
}
String类中的

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

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