Java 使用一个数组创建了多少个对象?[爪哇]

Java 使用一个数组创建了多少个对象?[爪哇],java,arrays,oop,object,Java,Arrays,Oop,Object,您好,我想知道这个数组创建了多少个对象 String arr[] = {"Paul", "Steven", "Jennifer", "Bart"}; 提前谢谢 答案是无,因为Array无法创建对象,只有new可以:你好 创建了五个对象 如果您正在使用 int[]i=新的int[5] 然后jvm将在堆上创建一个对象 String arr[] = {"Paul", "Steven", "Jennifer", "Bart"}; for (Object o : arr) { System.out

您好,我想知道这个数组创建了多少个对象

String arr[] = {"Paul", "Steven", "Jennifer", "Bart"};

提前谢谢

答案是无,因为
Array
无法创建对象,只有
new
可以:你好

创建了五个对象

如果您正在使用

int[]i=新的int[5]

然后jvm将在堆上创建一个对象

String arr[] = {"Paul", "Steven", "Jennifer", "Bart"};
for (Object o : arr) {
   System.out.format("%d\n", o.hashCode());
}
System.out.format("%d\n", arr);
但是如果您为数组提供元素,例如

i[0] = 1;
i[1] = 2;
.
.
i[4] = 5;
然后jvm将在堆上创建六个包含五个整数和一个数组对象的对象

String arr[] = {"Paul", "Steven", "Jennifer", "Bart"};
for (Object o : arr) {
   System.out.format("%d\n", o.hashCode());
}
System.out.format("%d\n", arr);

您应该得到5个不同的哈希代码。强烈建议堆中现在有5个对象。

创建了9个对象

每个字符串是两个对象。字符串引用和字符串的底层
char[]
。对于4个字符串,就是8个对象

然后是
字符串[]
本身,总共9个


当然,这假定JVM还没有对字符串文本进行
intern()
ed。如果有,那么它将不会创建
字符串,而是从
intern
池中提取它,这可能会为您提供总共1、3、5、7个或创建的原始9个对象,具体取决于
字符串
intern
的数量。

介于1和5之间,具体取决于JVM实现和状态。显然创建了一个新的字符串数组,字符串-我们不知道


编辑:正如有人在其他答案中指出的那样。1-9将是更准确的答案。由于在构造字符串时在字符串中创建了一个char[]。

根据您对它的看法,可以说是9个对象,也可以说只有一个。如果在调试器中查看此数组,您将能够在这些char[]中看到9个对象,即数组、字符串对象和char[]


但是,字符串文本位于池中,并且不是每次(仅一次)创建的,因此如果多次运行此行,则每次仅创建数组。i、 e.只创建了一个额外的对象。

没错,但您需要在创建的内部添加“新”对象,否则将没有,好的,谢谢各位。。。把我的Java考试搞砸了:P我真的以为是5,但现在我记得必须使用“new”才能真正创建数组……你可以看看这个链接以获得更多帮助[不,在这种情况下,赋值时不会创建任何对象,因为
int
不是一个对象,而是一个近似类型!@Sebastian,您发布的代码示例包含一些语法糖,可以自动创建大小为4的字符串数组,因此{“a”、“b”、“c”、“d”}是一个字符串[4]@Joachim Sauer:Thanx,你是对的,但这只是一个简单的例子,我还提供了一个很好的链接,让他能够很好地理解它。或者可能取决于实现?它可能会更多,但我不认为它会更少。你至少需要
字符串[]
reference,每个
String
都有一个引用,每个
char[]
都有一个引用作为它的支持。我想不出他们在其中放了什么其他对象(检查源代码显示没有)虽然这是可以想象的。字符串可能已经在JVM中创建了,数组可能只是直接借用引用。所以Lenik是对的,它依赖于JVM的实现。@Tim我也是这么想的。无论是谁想出了这个脑筋急转弯,都应该得到一些赞扬,但无论是谁把它放在考试中都应该被枪毙。@Seba有一件事要考虑的是,它可能是由一个从来没有工作的TA写的,并且没有批判性思维技能。他可能没有意识到实际上有9个代码>对象< /代码>。据说,真的很难批判性思维技能真正地发生。我不得不和某人一起讨论字符串的串行化。他说。“两个长度为16的字符串应包含64字节的数据。"这是有道理的,16*2字节/char*2字符串=64字节。但由于一些开销,结果更像是400+字节。小事情可能很重要,但许多开发人员确实缺乏批判性思维技能。操作码在JVM规范中指定,通过将适当构造的字符串对象推到堆栈上来工作。它依赖于实现,并且如果字符串在此之前已被使用,则可能是一个已被
intern()使用的
String
ed无需创建,但我们不能依赖于此。是的,但我认为仅针对基本数据类型,因为字符串自然是对象,所以创建新对象时不需要“new”。为了清楚起见,我是在开玩笑,因此“:P”。我很乐意接受否决票作为惩罚。哦,好吧,哈哈,我在查看其他页面时,他们说4,这是不可能的,因为数组也是一个对象,或者其他人也说没有,所以我很好奇,谢谢你的回答从一开始就是正确的,这里的其他人只是在更详细地讨论,但是谢谢你的建议hashcodes…语句后存在多少对象本身并不能提供有关该语句创建了多少对象的信息。