【问题标题】:Java array list referenceJava 数组列表参考
【发布时间】:2019-02-14 01:49:59
【问题描述】:

我有两个数组列表,例如

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。

【问题讨论】:

  • ArrayList&lt;Integer&gt; tempTableau = integerList; 将创建对List 的另一个引用。这就是你想要的吗?
  • 出于好奇,为什么?你确定这不是XY problem
  • @GBlodgett 我正在解决一个问题,它通过从第一个数组中复制元素来创建另一个数组,但是如果我们更改第二个数组中的元素,它也应该更改第一个数组中的元素。与数组列表中对象的引用有关。这有可能吗?
  • @Gendarme这是我要解决的问题。我正在解决一个问题,它通过从第一个数组中复制元素来创建另一个数组,但是如果我们更改第二个数组中的元素,它也应该更改第一个数组中的元素。与数组列表中对象的引用有关。这有可能吗?
  • Integer(如String)是不可变的。您不能更改现有Integer 对象的值,只能将对Integer 的引用替换为对另一个Integer 的引用。尝试查看AtomicInteger。您可以将对 AtomicInteger 的引用放入两个列表中,当您在一个列表中更改 AtomicInteger 内的整数时,它也会在另一个列表中更改。

标签: java arrays arraylist reference copy


【解决方案1】:

如果您希望两个列表完全相同,并且更改一个会更改另一个,您可以让它们引用相同的列表,如下所示:-

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

如果您想要不同的列表,那么仅通过一个 set() 调用是不可能的。您还需要更改其他列表。

您可能会想出您的自定义扩展名ArrayList,它会接收一个侦听器并在发生任何变化时调用该侦听器。

更新基于 cmets:

您可以创建一个包装器类来包装整数或使用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

更新基于进一步的 cmets:

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

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}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 2020-05-07
    • 2010-11-02
    相关资源
    最近更新 更多