浅拷贝Java中的整数

时间:2016-10-12 11:07:45

标签: java variables

其他答案对我不起作用。我的问题是关于整数。

Integer i1 = new Integer(11);
Integer i2 ;
i2 = i1;
System.out.println(i1+"   "+i2);
i1 = 233;
System.out.println(i1+"   "+i2);
//~ 11    11
//~ 233    11

我想让i1和i2相关。

5 个答案:

答案 0 :(得分:6)

在java java.lang.Integer中是不可变的。这意味着您无法更改Integer对象的值(以通常的方式)。您可以使用新值创建新的Integer实例。

i1i2包含对同一Integer实例的引用。当你做了

i1 = 233;

这意味着i1引用Integer

的另一个实例

如果您希望i1i2引用相同的实例,则可以使用AtomicInteger,但AtomicInteger是出于不同的目的。

AtomicInteger i1 = new AtomicInteger(11);
AtomicInteger i2 ;
i2 = i1;
System.out.println(i1+"   "+i2);
i1.set(233);
System.out.println(i1+"   "+i2);

或者你可以制作一个包装

public static class IntegerWrapper {

    private int value;

    public IntegerWrapper(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }

    public IntegerWrapper setValue(int value) {
        this.value = value;
        return this;
    }
}

和代码

IntegerWrapper i1 = new IntegerWrapper(11);
IntegerWrapper i2 ;
i2 = i1;
System.out.println(i1.getValue()+"   "+i2.getValue());
i1.setValue(233);
System.out.println(i1.getValue()+"   "+i2.getValue());

答案 1 :(得分:2)

执行此操作时:i2 = i1; java会自动为您i2 = new Integer(i1);执行此操作,因为Integer是不可变的。

答案 2 :(得分:1)

Java总是在分配新的整数文字时创建新对象,因为Integer是不可变的。

例如:

i1=233; // it represent as i1= new Integer(233);

现在i1i2作为两个不同的物理地址。

答案 3 :(得分:0)

您遇到的问题是i1 = 233更改了i1引用的内存地址。

答案 4 :(得分:-1)

Autoboxing在这里发挥作用。当您分配

i1=233;

它实际上是将其视为

i1= new Integer(233);

现在再次阅读代码。你的i2整数仍然指向包含11的对象,其中i1指向包含233的新对象。