繁体   English   中英

我有包含String []的ArrayList,如果我将新的string []添加到列表中,它也会修改以前添加的string []对象

[英]I am having ArrayList containing String[], If i add new string[] into list, it also modifed previously added string [] objects

我正在将string []添加到Arraylist中,但是当我尝试从中检索值时,发生了一些错误。 和arraylist的先前值已​​使用新条目(String [])进行更新预期输出:
第一秒
一二
一二

电流输出
一二
一二一二

下面是代码。

   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");
    }

}

任何建议。

您正在将数组对象的引用添加到列表中。 您每次都需要创建一个新数组。

   String[] temp ={"First","Sec"};
   list.add(temp);
   temp=new String[2];
   temp[0] ="1";temp[1]="2";
   list.add(temp);

您需要分配一个新的String []数组值,然后再将第二个数组添加到列表中。 现在,您正在覆盖数组中的值,这就是为什么仅出现最后一个值的原因。

似乎您要通过引用传递数组(而不是ArrayList )。 这意味着,当您有多种访问数据的方式时,它们都指向RAM中的同一位置,这意味着更改似乎在传播。

为了解决此问题,我建议创建一个new String[]或使用Arrays.copyOf(...)方法。

这个问题经常被问到。 ArrayList不会复制您添加到其中的对象。 它只是存储了对这些对象的引用。 因此,如果您在执行操作时两次添加同一数组,则列表仅包含对同一数组的两个引用。

您必须为列表的每个元素创建一个新数组。

将列表添加到HashMap时,我遇到了同样的问题。 实际上,当您使用同一功能时,它会添加对该列表/数组的引用。 因此,您需要每次更改String []名称; 为了添加列表。

It seems that Atring array is initialized once but its value is overridden three times. 最初,String [] temp包含{"First","Sec"}; 然后通过写入temp[0] ="1"; temp[1]="2";变成{"1","2"} temp[0] ="1"; temp[1]="2"; temp[0] ="1"; temp[1]="2"; 最终通过写入temp[0] ="one"; temp[1]="two";成为{"one", "two"} temp[0] ="one"; temp[1]="two"; temp[0] ="one"; temp[1]="two";

在这种情况下,每次更改同一数组的值。 您需要 每次 初始化 (by writing temp = new String[2];) 该数组 ,以便将其视为与新数组不同的数组

String[] temp ={"First","Sec"};
               list.add(temp);
               temp = new String[2];
               temp[0] ="1";
               temp[1]="2";
               list.add(temp);
               temp = new String[2];
               temp[0] ="one";
               temp[1]="two";
               list.add(temp);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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