Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我的ArrayList包含字符串[],若我将新字符串[]添加到列表中,它还会修改以前添加的字符串[]对象_Java_Android - Fatal编程技术网

Java 我的ArrayList包含字符串[],若我将新字符串[]添加到列表中,它还会修改以前添加的字符串[]对象

Java 我的ArrayList包含字符串[],若我将新字符串[]添加到列表中,它还会修改以前添加的字符串[]对象,java,android,Java,Android,我正在将字符串[]添加到Arraylist中,但当我试图从中检索值时,出现了一些错误。以及使用新条目(字符串[])更新arraylist的以前值 预期输出: 首先,秒 1,2 一,二 电流输出: 一,二 一,二 一,二 下面是代码 ArrayList<String[]> list = new ArrayList<String[]>(); String[] temp ={"First","Sec"}; list.add(temp); temp[0]

我正在将字符串[]添加到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);
ArrayList list=new ArrayList();
字符串[]临时={“第一”,“第二”};
列表。添加(临时);
温度[0]=“1”;温度[1]=“2”;
列表。添加(临时);
临时[0]=“一”;临时工[1]=“两个”;
列表。添加(临时);
打印日志(列表);
这是打印方法

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

}
private void打印日志(ArrayList结果){
对于(int i=0;i

任何建议。

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


为了解决这个问题,我建议创建一个
新字符串[]
,或者使用
Arrays.copyOf(…)
方法。

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

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

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

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


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

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

似乎一个数组初始化了一次,但它的值被重写了三次。
初始字符串[]temp包含
{“First”,“Sec”}
然后通过写入
temp[0]=“1”,它就变成了
{1”,“2”}
;温度[1]=“2”
最后,通过写入
temp[0]=“1”,它变成了
{“1”,“2”}
;临时工[1]=“两个”

在这种情况下,每次更改同一数组的值时您需要初始化
(通过写入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);

当我尝试输入1,2(代码中的第二个外接程序)时,为什么要首先更新,因为它已经保存在ArrayList中。您的ArrayList正在所有3个条目中保存指向temp的指针。所以它们都指向同一个对象。这就是为什么每次都需要创建一个新对象。