我对以下代码的不同有疑问:
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
两个代码之间的唯一区别是,对于第二个代码,字符串数组是在循环内创建的。
这两个代码产生相同的结果,但我想知道这两个代码之间有什么区别。
答案 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)
第一个片段比第二个片段快一点(减少内存和进程) 因为它实现了一次数组并在每个循环中更新它的值 但是在第二个片段中,它实现了新的数组并在每个循环中为它注册了一个地址