【发布时间】:2011-08-19 01:43:43
【问题描述】:
您好,我想知道这个数组创建了多少个对象?
String arr[] = {"Paul", "Steven", "Jennifer", "Bart"};
提前致谢!
【问题讨论】:
您好,我想知道这个数组创建了多少个对象?
String arr[] = {"Paul", "Steven", "Jennifer", "Bart"};
提前致谢!
【问题讨论】:
根据您的看法,您可以说 9 个对象或仅一个对象。如果您在调试器中查看此数组,您将能够看到 9 个对象、数组、String 对象和这些 char[] 中的 char[]。
但是,字符串字面量在一个池中,并且不是每次都创建(仅一次)因此,如果您多次运行此行,您每次只会创建数组。即只创建了一个额外的对象。
【讨论】:
介于 1 和 5 之间,具体取决于 JVM 实现和状态。显然创建了一个新的字符串数组,字符串 - 我们不知道。
编辑:正如有人在其他答案中指出的那样。 1-9 将是一个更准确的答案。由于您在构造字符串时在字符串中创建了一个 char[]。
【讨论】:
创建了九个对象。
每个字符串是两个对象。字符串引用,以及字符串的底层char[]。所以对于 4 个字符串,就是 8 个对象。
那么,String[] 本身就是 9 个。
这当然假设字符串文字尚未被 JVM intern()ed。如果有,那么它不会创建 String,而是从 intern 池中拉取它,这可能会给您总共 1、3、5、7 或最初创建的 9 个对象,具体取决于如何创建许多Strings 是interned。
【讨论】:
String[] 参考,每个String 的参考和支持它的每个char[] 的参考。我想不出他们在里面放了哪些其他物品(并且检查来源表明那里没有),尽管可以想象他们可以。
Objects。话虽如此,可悲的是,很少批判性思维技能真的发生了。我不得不与某人就序列化字符串进行斗争。他说“两个长度为 16 的字符串应该占用 64 个字节的数据。”这是有道理的,每个 char*2 字符串 16*2 字节 = 64 字节。但事实证明,由于一些开销,它更像是 400+。小事可能很重要,但许多开发人员确实缺乏批判性思维能力。
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 个对象。
【讨论】:
嗨,
创建了五个对象。
如果你正在使用
int[] i = new int[5];
然后 jvm 将在堆上创建一个对象。
但是,如果您要为数组提供元素,例如
i[0] = 1;
i[1] = 2;
.
.
i[4] = 5;
然后 jvm 将在堆上创建六个对象,五个整数和一个数组对象。
【讨论】:
int 不是对象,而是原始类型!
答案是否定的,因为Array 不能创建对象,只有new 可以。 :P
【讨论】:
intern()ed 的 String,但我们不能依赖它。