有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

}

任何建议


共 (6) 个答案

  1. # 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];)数组,以便将其视为新数组,而不是相同的数组

    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);
    
  2. # 2 楼答案

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

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

  3. # 3 楼答案

    在向HashMap添加列表时,我也遇到了同样的问题。实际上,当您在同一个函数中工作时,它会添加对该列表/数组的引用。所以每次都需要更改字符串[]名称;以便添加到列表中

  4. # 4 楼答案

    在将第二个字符串添加到列表之前,需要分配一个新的字符串[]数组值。现在,您正在覆盖数组中的值,这就是为什么只显示最后一个值

  5. # 5 楼答案

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

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

  6. # 6 楼答案

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

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