Java数组列表参考

时间:2019-02-14 01:50:00

标签: java arrays arraylist reference copy

我有两个数组列表,例如

List<Integer> integerList = new ArrayList<>();
integerList.add(new Integer(1));
integerList.add(new Integer(2));
integerList.add(new Integer(3));
integerList.add(new Integer(4));

ArrayList<Integer> tempTableau = new ArrayList<Integer>();
for(int i = 0; i < integerList.size(); i++) {
    if (i >= 1 && i < 4) {
        tempTableau.add(integerList.get(i));
    }
}

我想实现的是

tempTableau.set(1, new Integer(-2));

即更改一个数组中的值,它也应该反映另一个数组中的更改 或

System.out.println(integerList.get(2));
System.out.println(tempTableau.get(1));

都应输出-2。

1 个答案:

答案 0 :(得分:2)

如果您希望两个列表完全相同,而更改一个列表将更改另一个列表,则可以使它们引用相同的列表,如下所示:-

List<Integer> integerList = new ArrayList<>();
List<Integer> tempTableau = integerList;

如果您要使用其他列表,则无法仅通过一个set()调用来完成。您还需要更改其他列表。

您可能想出了ArrayList的自定义扩展名,它将使用一个侦听器并在发生任何更改时调用该侦听器。

更新基于评论:

您可以创建一个包装类来包装整数或使用AtomicInteger:-

List<AtomicInteger> integerList = new ArrayList<>();
List<AtomicInteger> tempTableau = new ArrayList<>();

AtomicInteger i = new AtomicInteger(50);
integerList.add(i);
tempTableau.add(i);

integerList.get(0).set(60); // change value 50 to 60 in first list
System.out.println(tempTableau.get(0).get()); // value changed in the second

更新基于进一步的评论:

如果是自定义对象,例如:-

public class MyCustomClass {
    private String name;
    private int age;
    // many other fields

    // constructor, getters, setters

    @Override
    public String toString() {
        return "MyCustomClass{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

您可以这样创建自己的包装器:-

class Holder<T> {

    private T object;

    Holder(T object) {
        this.object = object;
    }

    T getObject() {
        return object;
    }

    void setObject(T object) {
        this.object = object;
    }
}

然后在列表中使用它:-

    List<Holder<MyCustomClass>> listOne = new ArrayList<>();
    List<Holder<MyCustomClass>> listTwo = new ArrayList<>();

    MyCustomClass obj1 = new MyCustomClass("John", 18);

    Holder<MyCustomClass> holder1 = new Holder<>(obj1);
    listOne.add(holder1);
    listTwo.add(holder1);

    MyCustomClass obj2 = new MyCustomClass("Paul", 45);
    listOne.get(0).setObject(obj2); //make holder1 hold obj2 instead of obj1 in listOne

    System.out.println(listTwo.get(0).getObject()); //listTwo prints MyCustomClass{name='Paul', age=45}