用Java创建的对象数

时间:2014-09-24 09:55:42

标签: java

在下面提到的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";
    }

3 个答案:

答案 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;新对象基本上取决于程序中其他地方也使用了多少个字符串。