[英]Java String array created inside loop
我对以下代码的区别有疑问:
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
与
Vector v = new Vector();
for(int i=0; i<3; i++)
{
String [] str_arr = new String[3];
str_arr[0] = "A";
str_arr[1] = "B";
str_arr[2] = "C";
v.add(str_arr);
}
System.out.println(v.size()); //answer 3
这两个代码之间的唯一区别是,第二个代码是在循环内部创建字符串数组。
两种代码产生相同的结果,但是我想知道两者之间的区别是什么。
这两个代码片段不会产生相同的结果。 第一个片段将相同的数组对象添加到Vector 3次。 第二个片段向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]
。
在第二个版本中, 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);
}
在这里(第一个版本),即使变量从一个迭代到另一个迭代仍然存在,您仍会在每次迭代中为数组分配相同的值,因此您不需要主体的大部分内容
尽管输出将相同,但是在两个程序的最后一行中,您的应用程序的状态将有所不同。
首先,您的堆只有一个String数组,而第二个则只有三个。
第一个代码段比第二个代码段快一点(不占用内存和进程),因为它只实现一次数组并在每个循环中更新其值,但是在第二个代码段中,它实现了新数组并在每个循环中为其注册一个地址
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.