一个数组可以创建多少个对象? [爪哇]

Posted

技术标签:

【中文标题】一个数组可以创建多少个对象? [爪哇]【英文标题】:How many objects are created with an Array? [Java] 【发布时间】:2011-08-19 01:43:43 【问题描述】:

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

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

提前致谢!

【问题讨论】:

【参考方案1】:

根据您的看法,您可以说 9 个对象或仅一个对象。如果您在调试器中查看此数组,您将能够看到 9 个对象、数组、String 对象和这些 char[] 中的 char[]。

但是,字符串字面量在一个池中,并且不是每次都创建(仅一次)因此,如果您多次运行此行,您每次只会创建数组。即只创建了一个额外的对象。

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

创建了九个对象。

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

那么,String[] 本身就是 9 个。

这当然假设字符串文字尚未被 JVM intern()ed。如果有,那么它不会创建 String,而是从 intern 池中拉取它,这可能会给您总共 1、3、5、7 或最初创建的 9 个对象,具体取决于如何创建许多Strings 是interned。

【讨论】:

或者可能取决于实现? 它可能会更多,虽然我不明白它怎么会更少。您至少需要String[] 参考,每个String 的参考和支持它的每个char[] 的参考。我想不出他们在里面放了哪些其他物品(并且检查来源表明那里没有),尽管可以想象他们可以。 字符串可能已经在JVM中创建好了,数组可能直接借用引用。所以 Lenik 是对的,它依赖于 JVM 实现。 @Tim 我也是这么想的。想出这个作为脑筋急转弯的人应该得到一些荣誉,但谁把这个放在考试中应该被枪杀。 @Sebastian 要考虑的一件事是,它可能是由从未有过工作且批判性思维能力为零的助教编写的。他可能没有意识到实际上有 9 个Objects。话虽如此,可悲的是,很少批判性思维技能真的发生了。我不得不与某人就序列化字符串进行斗争。他说“两个长度为 16 的字符串应该占用 64 个字节的数据。”这是有道理的,每个 char*2 字符串 16*2 字节 = 64 字节。但事实证明,由于一些开销,它更像是 400+。小事可能很重要,但许多开发人员确实缺乏批判性思维能力。【参考方案4】:
String arr[] = "Paul", "Steven", "Jennifer", "Bart";
for (Object o : arr) 
   System.out.format("%d\n", o.hashCode());

System.out.format("%d\n", arr);

你应该得到 5 个不同的 hashCode。强烈建议您的堆中现在存在 5 个对象。

【讨论】:

感谢您的回答从一开始就是正确的,这里的其他人只是更详细地介绍,但感谢您提供有关哈希码的建议... 在语句之后存在有多少个对象 - 本身并没有提供关于有多少个对象由语句创建的信息。【参考方案5】:

嗨,

创建了五个对象。

如果你正在使用

int[] i = new int[5];

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

但是,如果您要为数组提供元素,例如

i[0] = 1;
i[1] = 2;
.
.
i[4] = 5;

然后 jvm 将在堆上创建六个对象,五个整数和一个数组对象。

【讨论】:

完全正确,但您需要在创作中使用“新”,否则将没有,好吧,谢谢大家...搞砸了我的 Java 考试:PI 真的以为是 5,但现在我记得它必须是用 'new' 来实际创建数组... 你可以查看此链接以获得更多帮助 [coderanch.com/t/418315/java-programmer-SCJP/certification/… 不,在这种情况下,赋值时不会创建任何对象,因为int 不是对象,而是原始类型! @Sebastian,您发布的代码示例包括一些自动创建大小为 4 的字符串数组的语法糖,因此 "a","b","c","d" 是字符串[4]。 @Joachim Sauer :Thanx,你说得对,但这只是一个例子,我还提供了一个很好的链接让他很好地理解它。【参考方案6】:

答案是否定的,因为Array 不能创建对象,只有new 可以。 :P

【讨论】:

在 JVM 规范中指定操作码通过将适当构造的 String 对象推入堆栈来工作。它取决于实现,如果之前使用过字符串,则可能不必创建已经是 intern()ed 的 String,但我们不能依赖它。 可能是的,但我认为仅适用于原始数据类型,因为字符串自然是对象,因此您不需要“新”来创建新对象。 为了清楚起见,我是在开玩笑,因此是“:P”。我很乐意接受反对票作为惩罚。 哦,好吧,哈哈,我正在检查其他页面,他们说 4,这是不可能的,因为数组也是一个对象,或者其他人也没有说,所以我想知道

以上是关于一个数组可以创建多少个对象? [爪哇]的主要内容,如果未能解决你的问题,请参考以下文章

如何在调用 AdapterFragment 之前正确填充数组?爪哇

为啥 for-each 循环适用于数组? (爪哇)

java 怎样传递数组对象

一个数组可以处理多少个项目 node.js

爪哇。函数中的输入数组而不初始化数组[重复]

java中数组最多可以放置多少个元素?