在下面提到的4种情况下创建了多少个对象?
int[] array = new int[10];
String[] str = new String[10];
Edit 1 :
String[] str = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" };
Edit 2 :
String[] str1 = new String[10];
for(int i = 0;i<10;i++){
str1[i] = "Str";
}
答案 0 :(得分:3)
Java数组是单个对象。并且分配新数组只能分配那个对象。分配可以嵌套,可以通过在数组初始化块中自写,自动装箱,也可以通过以链接动作形式调用new的对象构造函数来嵌套。
您的三个案例的答案是:1,1和1.下面的详细信息,以及其他一些突出特殊情况的例子。
字符串和自动装箱的int也可能是特殊情况,因为JVM为这些提供了特殊的缓存。以下注释示例中的详细信息:
// 1 object, an array with 10 elements (set to zero)
int[] array = new int[10];
// 1 objects, an array with 10 elements (set to null)
String[] str = new String[10];
// 1 object, an array with 10 elements pointing at objects
// that have been preallocated within the String pool. See
// the appendium below for evidence.
String[] str = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" };
// 3 objects, one for the array and one per integer.
Integer[] a4 = new Integer[] { new Integer(1), new Integer(2) };
// 1 object again, Java has an Integer pool of limited size which is used
// to optimise auto boxing; 1 and 2 will definitely be within that default
// range
Integer[] a6 = new Integer[] { 1, 2 };
// 3 objects, the default size of the int pool is fairly low
// but it can be increased via a JVM flag.
Integer[] a5 = new Integer[] { 1000, 2000 };
// 3-5 objects -- 1 for the array, one for each of the string objects and 1
// per char array backing the string. Depending on JVM version the char
// array may be shared with the interned strings, so that one is a little tricky
// and is why I said 3-5.
String[] str = {new String("1"), new String("2")};
<强> Appendium 强>
只是为了好玩,这里有证据证明行动不变。
以下Java代码编译为以下字节代码,请注意只分配了数组。元素使用类池常量。我缩短了输出,它只为每个元素重复相同的代码(dup,iconst,ldc,aastore,...)
java代码:
String[] str = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" };
JVM字节码:
0: bipush 10
2: anewarray #2 // class java/lang/String
5: dup
6: iconst_0
7: ldc #3 // load constant from class pool - String 1
9: aastore // store into array
10: dup
11: iconst_1
12: ldc #4 // String 2
14: aastore
15: dup
16: iconst_2
答案 1 :(得分:2)
创建了2个Array
个对象。
int[] array = new int[10];// can hold 10 ints
String[] str = new String[10]; // can hold references to 10 Strings
答案 2 :(得分:1)
正如其他人所说,你的前两个语句每个都创建一个对象(一个数组)。
第三点有点特别。您创建一个String-array(1个对象),其中填充了对10个字符串(10个对象)的引用。那就是那11个对象。
虽然不是很好。汇集了Java中的字符串文字,这意味着在内存中存在一个特殊的位置,其中保留了所有字符串文字。因此,如果您在代码中的两个不同位置使用字符串"string"
,则您都指向同一个对象。如果使用字符串文字,则无法真正说出正在创建新对象。
即使您这样说(因为如果您的代码中没有使用它们,它们不会在池中存在),这意味着第三行是否存在。创建&#39;新对象基本上取决于程序中其他地方也使用了多少个字符串。