Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OCJP考试模拟中的错误:实际创建了多少个对象?_Java - Fatal编程技术网

Java OCJP考试模拟中的错误:实际创建了多少个对象?

Java OCJP考试模拟中的错误:实际创建了多少个对象?,java,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

在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,因为
s1
s2
是同一个对象。你觉得怎么样?

是的,肯定是3个对象。s1和s2都指同一个位置。s1,s2和abc是这里的对象。也许最好不要遵循这个参考

校正

应该有3个对象:

1. StringBuffer s1 = new StringBuffer("abc");
将在内存s1和“abc”中创建两个对象。这是因为,字符串被插入,文本被添加到内存池中

2. StringBuffer s2 = s1;
此处不会创建对象,因为s2将指向作为s1一部分创建的“abc”

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

只为s3创建一个对象。

3或4,具体取决于实现。有些编译器只为常量“abc”创建一个字符串对象,并根据需要多次引用它,而其他编译器则为每个常量创建一个对象。好吧,这并不是所有语言规范版本都强制要求的,将来可能会再次改变

或者更多,这取决于StringBuffer的实现(它可以主动创建char[]并复制初始化字符串,而不是延迟实现,直到StringBuffer的内容真正更改)。同样,这不应该由语言强制执行。顺便问一下,就问题而言,数组是否算作
Object
s?如果StringBuffer实现将信息存储在JNI结构中呢?什么算是物品?我只是想强调我关于非语言强制实现细节的观点

除非是关于特定的实现和/或JLS版本,否则测试不应提出此类问题

非常清楚的是,他们给出的答案为4的理由是完全不正确的。对
s2
的赋值不会导致创建任何新对象。

如何:

1. StringBuffer s1 = new StringBuffer("abc");
1
builder
object+1
char[]
object+(如果创建了1个字符串文字)

没有新对象

3. StringBuffer s3 = new StringBuffer("abc");
1
builder
object+1
char[]
object

StringBuilder
封装了内部的backing char[],它是一个对象


正如@StephenC所说,这个问题是不明确的。

答案不是4个对象,你是对的

然而,“创建了多少对象”这个问题是不明确的。问题是在执行代码时,三个对象中的一个没有创建。具体来说,与
“abc”
文本相对应的
字符串
对象实际上是在加载代码时创建的。执行该代码时,将创建两个
StringBuffer
对象,并使用预先存在的
String
对象

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

  • 如果一个
    “abc”
    文本已加载到另一个类中,则将使用该文本

  • 如果字符串池实现需要将
    字符串
    放入池中,则不会指定该字符串池实现是否创建该字符串的新副本

除非问题被更精确地陈述,否则没有单一的正确答案。你只能说:

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


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

如果确实如此,那么你应该停止使用该网站。是的,应该是3。至少在我的知识中,C++中没有调用复制构造函数。在Java中,我认为您应该执行类似MyClass s2=新MyClass(s1)的操作;请将链接发布到有问题的网站,这样我们就可以避免它。学究式的,这是不可能知道的。StringBuffer构造函数可以在引擎盖下创建任意多的对象。嗯,字符串插入不意味着内存中只有一个
“abc”
?但它是字符串文本,而不是
新字符串
。他不是“使用新操作符创建字符串对象”。他正在创建一个以现有字符串作为参数的StringBuffer。正确答案是3-1向传播错误信息的人道歉。我试着纠正我的答案。请随意提供更多注释。@OliCharlesworth是对的,两个“abc”在编译时都是文本字符串,在运行时它们将是同一个对象。您第一次是对的。别害羞。事实上他错了,至少可能错了。还将创建一个类的实例,并创建一个类的实例。内部StringBuffer无疑也会创建stuff的实例及其类的实例。@jwenting这两个类实例都是在加载包含此代码的类时创建的,而不是在执行OP中的代码时创建的。@EJP true,但他从未提到问题的范围:)不正确。JLS和JVM规范需要Java编译器来汇集字符串文本。@EJP JLS已经随着时间的推移发生了变化,甚至在这方面也是如此。当我说“语言”时,我不是指JLS的最后一个版本,也不是下一个版本。不过,我会尽量在回答中更清楚一些。非常感谢。我不知道有这样的变化。请提供引文。据我所知,这种形式的问题的基本答案(但只涉及字符串和文字)自1997年以来根本没有改变
3. StringBuffer s3 = new StringBuffer("abc");