OCJP考试模拟出错:真正创建了多少个对象?

时间:2013-08-18 09:59:16

标签: java

在OCJP认证的模拟中,我发现了这个问题:

1. StringBuffer s1 = new StringBuffer("abc");
2. StringBuffer s2 = s1;
3. StringBuffer s3 = new StringBuffer("abc");

How many objects are created ?

他们说正确的答案是4,因为他们声明:

s1 is one object, s2 is another object, 
s3 is another object and "abc" is another String Object .

但对我来说这是错误的,它应该是3,因为s1s2是同一个对象。你觉得怎么样?

5 个答案:

答案 0 :(得分:8)

你说得对,答案不是4个对象。

然而,“创建了多少个对象”这个问题含糊不清。问题是执行代码时不会创建三个对象之一。具体而言,与String文字对应的"abc"对象在加载代码时实际创建。执行该代码时,将创建两个StringBuffer个对象,并使用预先存在的String对象。

事实上它比这更复杂,因为在类加载时,可能会创建另一个临时String对象,然后在它被实现后丢弃;

  • 如果"abc"文字已经加载到另一个类中,那么将使用该文字。

  • 如果字符串池实现需要将其放入池中,则不会指定String的新副本。

除非更准确地说明问题,否则没有一个正确的答案。你能说的最好的是:

  • 运行代码时会创建两个StringBuffer个对象。
  • 加载代码时会创建一个或两个String个对象。

然后,您是否应该计算构成char[]StringBuffer对象一部分的私有String对象的问题。这可能会将对象数量增加到8个。

答案 1 :(得分:5)

肯定是3 Object.both s1和s2引用相同的位置。所以s1,s2和“abc”就是这里的对象。可能最好不要遵循该参考。

答案 2 :(得分:4)

<强> CORRECTION

应该有3个对象:

1. StringBuffer s1 = new StringBuffer("abc");

将在内存s1&amp;中创建两个对象。 “abc”。这是因为,字符串被中断,文字被添加到内存池中。

2. StringBuffer s2 = s1;

此处不会创建任何对象,因为s2将指向作为s1

的一部分创建的“abc”
3. StringBuffer s3 = new StringBuffer("abc");

只为s3创建一个对象。

答案 3 :(得分:2)

怎么样:

1. StringBuffer s1 = new StringBuffer("abc");

1 builder个对象+ 1 char[]个对象+(1个字符串文字,如果已创建)

2. StringBuffer s2 = s1;

没有新物品。

3. StringBuffer s3 = new StringBuffer("abc");

1 builder个对象+ 1 char[]个对象

StringBuilder 封装内部的支持char [],其中 是一个对象。

正如@StephenC所说,问题含糊不清。

答案 4 :(得分:0)

3或4,取决于实施。有些编译器只会为常量“abc”创建一个String对象,并根据需要多次引用它,而其他编译器会为每个常量创建一个对象。 AFAIK,所有语言规范版本都没有强制要求,并且将来可能会再次发生变化。

或者更多,取决于StringBuffer的实现(可以主动创建char []并复制初始化String,而不是延迟实现,直到StringBuffer的内容真正更改为止)。同样,这不应该由语言强制执行。而且,BTW,为了问题的目的,数组是否计为Object s?如果StringBuffer实现在JNI结构中存储信息怎么办?什么算作对象?我只是想重新强调我对非语言规定的实现细节的观点。

测试不应该问这类问题,除非是关于特定实现和/或JLS版本。

绝对清楚的是,他们为4回答的原因是完全错误的。对s2的分配不会导致创建任何新对象。