ArrayLists无法按预期工作

时间:2016-05-14 19:12:59

标签: java arraylist

import java.util.ArrayList;

public class bugs 
{
    public ArrayList<Integer> elements1;
    public ArrayList<Integer> elements2;

    public bugs(ArrayList<Integer> args)
    {
        elements1 = args;
        elements2 = args;
    }

    public void change(int index, int value)
    {
        elements1.set(index, value);
    }

    public void reset()
    {
        elements1 = elements2;
    }

    public static void main(String[] a)
    {
        ArrayList<Integer> stuff = new ArrayList<Integer>();
        stuff.add(1);
        stuff.add(1);
        stuff.add(1);
        stuff.add(1);

        bugs b = new bugs(stuff);
        b.change(2, 999);
        b.reset();

        System.out.println(b.elements2);
    }
}

输出:

  

[1,1,999,1]

第二个arraylist elements2用于将arraylist elements1重置为原始位置。但是,出于某种原因elements1被复制到elements2,正在打印

  

[1,1,999,1]

而不是

  

[1,1,1,1]

2 个答案:

答案 0 :(得分:2)

您正在将相同的ArrayList引用传递给这两个变量。

你打算做的是:

public bugs(ArrayList<Integer> args)
{
    elements1 = new ArrayList<Integer>(args);
    elements2 = new ArrayList<Integer>(args);
}

编辑:

请注意,这只是一个临时修复。调用reset()会将elements2的引用传递给elements1,然后你就会遇到相同的情况。如果创建新的arraylist并将另一个列表作为参数传递,则创建具有相同内容的新引用。这意味着您还必须调整reset()方法以创建新列表并将elements2作为参数传递。

答案 1 :(得分:0)

在java中,您可以通过引用或值传递。如果您使用的是原始数据类型,那么您将按值传递。所以:

public void method(int num)
{
   int num1 = num;
   int num2 = num;
}

此方法将num值传递给num1和num2基元数据类型。如果向num1添加内容,则不会将num2更改为相同的值。但是,如果您使用非原始数据类型,如ArrayList:

public bugs(ArrayList<Integer> args)
{
    elements1 = args;
    elements2 = args;
}

您应该期望elements1数组中的更改也会更改elements2数组。在此示例中,您将相同的ArrayList引用传递给两个变量。

您的问题的解决方案是创建阵列的副本:

public bugs(ArrayList<Integer> args)
{
    elements1 = new ArrayList<>(args);
    elements2 = new ArrayList<>(args);
}

public void reset()
{
    elements1 = new ArrayList<>(elements2);
}