在循环内创建的Java String数组

时间:2016-01-07 13:57:19

标签: java

我对以下代码的不同有疑问:

sort_values

对战

Vector v = new Vector();
String [] str_arr = new String[3];

for(int i=0; i<3; i++)
{
   str_arr[0] = "A";
   str_arr[1] = "B";
   str_arr[2] = "C";            
   v.add(str_arr);
}
System.out.println(v.size());  //answer 3

两个代码之间的唯一区别是,对于第二个代码,字符串数组是在循环内创建的。

这两个代码产生相同的结果,但我想知道这两个代码之间有什么区别。

4 个答案:

答案 0 :(得分:7)

这两个片段不会产生相同的结果。第一个片段将相同的数组对象添加3次到Vector。第二个片段将三个不同的数组对象添加到Vector。

结果可能看起来相同,因为第二个代码段中的所有三个数组都包含相同的值。

如果您从

更改作业
str_arr[0] = "A";
str_arr[1] = "B";
str_arr[2] = "C"; 

str_arr[0] = "A" + i;
str_arr[1] = "B" + i;
str_arr[2] = "C" + i;

您在第一个代码段中看到,Vector中的所有数组都包含[A2,B2,C2],因为只有一个数组被覆盖。

另一方面,第二个片段会生成一个包含三个不同数组的Vector:[A0,B0,C0][A1,B1,C1][A2,B2,C2]

答案 1 :(得分:2)

在第二个版本中,String[]在每次迭代结束时超出范围。这意味着您无法在其他地方访问它。循环之后,变量不再存在。你也不会在迭代之间保持价值。

编辑:数组本身仍然存在,因为向量会保留对它的强引用。

但是,您的代码中存在一些冗余问题。

for(int i=0; i<3; i++)
{
   str_arr[0] = "A"; //all
   str_arr[1] = "B"; //of this
   str_arr[2] = "C"; //is redundant  
   v.add(str_arr);
}

这里(第一个版本),即使变量从一次迭代到另一次迭代仍然存在,每次迭代都会为数组赋值相同的值,因此您不需要大部分正文

答案 2 :(得分:1)

虽然输出结果相同,但两个程序的最后一行的应用程序状态会有所不同。

首先,你的堆只有一个字符串数组,而第二个字符串就有三个。

答案 3 :(得分:0)

第一个片段比第二个片段快一点(减少内存和进程) 因为它实现了一次数组并在每个循环中更新它的值 但是在第二个片段中,它实现了新的数组并在每个循环中为它注册了一个地址