繁体   English   中英

在循环内创建的Java String数组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM