为什么这个参考不起作用?

时间:2015-05-20 20:22:19

标签: java

我有什么:一个存储整数的静态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中真正存储了什么?

基于改进的答案进行编辑:

由于integerInteger(而不是int),3会自动退出。 ArrayList实际存储了Integer.valueOf(3)

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));