问题描述
我有两个数组列表,例如
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楼
如果您希望两个列表完全相同,而更改一个列表将更改另一个列表,则可以使它们引用相同的列表,如下所示:
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}