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

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

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

提前致谢!

【问题讨论】:

    标签: java arrays oop object


    【解决方案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,这是不可能的,因为数组也是一个对象,或者其他人也没有说,所以我想知道
        猜你喜欢
        • 2020-06-06
        • 2011-01-07
        • 1970-01-01
        • 1970-01-01
        • 2011-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-21
        相关资源
        最近更新 更多