当前位置: 代码迷 >> java >> Java数组列表参考
  详细解决方案

Java数组列表参考

热度:77   发布时间:2023-08-02 10:32:36.0

我有两个数组列表,例如

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。

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

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}
  相关解决方案