将在内存中创建多少个字符串对象?

时间:2012-06-24 20:11:34

标签: java string memory object

以下代码将创建多少个字符串对象?

String s="";
s+=new String("a");
s+="b";

我在考试时遇到了这个问题。我想知道正确的答案。我说了2件物品 池中包含“”,“b”的对象和由新String(“a”)创建的对象;

4 个答案:

答案 0 :(得分:9)

我会回答另一个更清楚的问题:以下代码片段中涉及多少个String实例:

String s="";
s+=new String("a");
s+="b";

答案是6:

  • 空字符串文字:"";
  • 字符串文字"a";
  • 字符串文字“a”的副本:new String("a");
  • 通过连接s"a";
  • 的副本创建的字符串
  • 字符串文字"b"
  • 通过连接s"b"创建的字符串。

如果您假设已经由先前加载的代码创建了三个字符串文字,则代码段会创建3个新的String实例。

答案 1 :(得分:8)

  

String s =“”;

不会创建任何对象。

  

s + = new String(“a”);

创建五个对象。 new String,StringBuilder及其char []和String结果及其char []

  

S + = “B”;

创建四个对象,StringBuilder及其char []和String结果及其char []

所以我总共得到九个对象,其中有三个String对象

注意:您可以确定“”已经加载,因为它出现在许多系统类中,包括ClassLoader和Class。

对于此问题,字符串“a”和“b”可能会或可能不会被视为新字符串。恕我直言我不会计算它们,因为它们最多只能创建一次,如果这段代码只运行一次,那么创建多少字符串几乎不重要。更有用的是知道每次运行代码时创建了多少对象。

答案 2 :(得分:0)

在JITC情况下实际创建的对象数量是不确定的。 JITC可能会认识到new String("a")是一个标识,并且没有引用s的中间值,因此只创建了StringBuilder。在一般情况下,必须模仿一些潜在的副作用(例如,new String()的参数可能无效),但文字不能发生。

事实上,javac可以很好地认识到结果是“ab”,没有潜在的副作用,只是产生该值的字符串文字。 (它在稍微复杂的情况下进行字符串组合。)

答案 3 :(得分:0)

  

创建新字符串

     

早些时候,我们承诺会更多地讨论创建String的各种方法之间的细微差别。让我们看一下如何创建String的几个例子,让我们进一步假设池中不存在其他String对象:

String s = "abc"; // creates one String object and one reference variable
  

在这个简单的例子中,“abc”将进入池中,s将引用它。

String s = new String("abc"); // creates two objects, and one reference variable
  

在这种情况下,因为我们使用了new关键字,Java将在普通(非池)内存中创建一个新的String对象,s将引用它。此外,文字“abc”将被放置在池中。

来自SCJP Sun认证程序员Java 6学习指南(考试310-065).pdf