我有什么:一个存储整数的静态ArrayList。我通过引用添加了一个Integer,然后我更改了值,但是没有更新该值。
import java.util.ArrayList;
public class Main {
public static final ArrayList<Integer> integers = new ArrayList<>();
public Integer integer;
void addInteger(Integer i){
integers.add(i);
}
public static void main(String[] args) {
Main main = new Main();
main.integer = 3;
integers.add(main.integer);
main.integer = 4;
System.out.println(integers.get(0));
}
}
输出:3
问题:为什么输出不是4?
基于跟进的进一步问题: ArrayList中真正存储了什么?
基于改进的答案进行编辑:
由于integer
是Integer
(而不是int
),3
会自动退出。 ArrayList
实际存储了Integer.valueOf(3)
。
答案 0 :(得分:3)
执行main.integer = 4
时,您要重新分配main.integer
的值,但旧引用已添加到List<Integer>
。这是代码中发生的事情:
//commented this line
//main.integer = 3;
//this line below is what really happens
main.integer = Integer.valueOf(3);
integers.add(main.integer);
//main.integer = 4;
main.integer = Integer.valueOf(4);
答案 1 :(得分:3)
以下是发生的事情:
3
的引用(并将该引用存储在main.integer
中)。integers.add(main.integer)
)。对3
的引用按值传递,因此引用将复制到列表中。main.integer
以包含对4
的引用。这不会影响列表中存储的内容。将此与以下代码段进行比较:
public AtomicInteger integer;
Main main = new Main();
main.integer = new AtomicInteger(3); // Reference to a mutable object
integers.add(main.integer); // Add reference to list
main.integer.set(4); // Change mutable object
System.out.println(integers.get(0)); // Prints 4
答案 2 :(得分:0)
从当前代码中,您只需为列表的第一个元素指定值(3)。如果您希望输出4,则需要做两件事。首先确保向ArrayList添加新值。更改main.integer的值后添加另一个integers.add(main.integer);
。将另一个元素添加到ArrayList后,请记住索引新的正确元素。即:System.out.println(integers.get(1));