一个数组可以创建多少个对象? [爪哇]
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 个对象,具体取决于如何创建许多String
s 是intern
ed。
【讨论】:
或者可能取决于实现? 它可能会更多,虽然我不明白它怎么会更少。您至少需要String[]
参考,每个String
的参考和支持它的每个char[]
的参考。我想不出他们在里面放了哪些其他物品(并且检查来源表明那里没有),尽管可以想象他们可以。
字符串可能已经在JVM中创建好了,数组可能直接借用引用。所以 Lenik 是对的,它依赖于 JVM 实现。
@Tim 我也是这么想的。想出这个作为脑筋急转弯的人应该得到一些荣誉,但谁把这个放在考试中应该被枪杀。
@Sebastian 要考虑的一件事是,它可能是由从未有过工作且批判性思维能力为零的助教编写的。他可能没有意识到实际上有 9 个Object
s。话虽如此,可悲的是,很少批判性思维技能真的发生了。我不得不与某人就序列化字符串进行斗争。他说“两个长度为 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,这是不可能的,因为数组也是一个对象,或者其他人也没有说,所以我想知道以上是关于一个数组可以创建多少个对象? [爪哇]的主要内容,如果未能解决你的问题,请参考以下文章