java我的ArrayList包含字符串[],若我将新字符串[]添加到列表中,它也会修改以前添加的字符串[]对象
我正在将字符串[]添加到Arraylist中,但当我试图从中检索值时,出现了一些错误。以及使用新条目(字符串[])更新arraylist的以前值
预期输出:
首先,秒
1,2
一,二
电流输出:
一、二
一,二
一,二
下面是代码
ArrayList<String[]> list = new ArrayList<String[]>();
String[] temp ={"First","Sec"};
list.add(temp);
temp[0] ="1";temp[1]="2";
list.add(temp);
temp[0] ="one";temp[1]="two";
list.add(temp);
printLog(list);
这是打印方法
private void printLog(ArrayList<String[]> result) {
for (int i = 0; i < result.size(); i++) {
Log.d(TAG,"I="+i);
String[] temp = result.get(i);
Log.d(TAG,temp[0]+","+temp[1]+"\n");
}
}
任何建议
# 1 楼答案
It seems that Atring array is initialized once but its value is overridden three times.
最初字符串[]temp包含{"First","Sec"};
,然后通过写入temp[0] ="1"; temp[1]="2";
变成{"1","2"}
,最后通过写入temp[0] ="one"; temp[1]="two";
变成{"one", "two"}
在这种情况下,每次更改同一数组的值时您需要每次初始化
(by writing temp = new String[2];)
数组,以便将其视为新数组,而不是相同的数组# 2 楼答案
看起来像是通过引用传递数组(而不是
ArrayList
)。这意味着,当您有多种方式访问数据时,它们都指向RAM中的同一位置,这意味着更改似乎会传播为了解决这个问题,我建议创建一个
new String[]
或使用Arrays.copyOf(...)
方法# 3 楼答案
在向HashMap添加列表时,我也遇到了同样的问题。实际上,当您在同一个函数中工作时,它会添加对该列表/数组的引用。所以每次都需要更改字符串[]名称;以便添加到列表中
# 4 楼答案
在将第二个字符串添加到列表之前,需要分配一个新的字符串[]数组值。现在,您正在覆盖数组中的值,这就是为什么只显示最后一个值
# 5 楼答案
这个问题经常被问到。ArrayList不会复制添加到其中的对象。它只是存储了对这些对象的引用。因此,如果在添加相同数组时添加两次,列表只包含对同一数组的两个引用
必须为列表中的每个元素创建一个新数组
# 6 楼答案
您正在将数组对象的引用添加到列表中。每次都需要创建新阵列