Java中的浅拷贝Integer

4

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

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相关联。


4
你试图达成什么目标并不十分清楚。行 i1 = 233; 改变了 i1 的值,使其指向另一个 Integer 对象。 Integer 本身是不可变的。也许你想要用 AtomicInteger,在这里你可以修改对象中的值? - Jon Skeet
5个回答

9
在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());

4

当你执行这个操作:i2 = x; Java会自动为你执行这个操作 i2 = new Integer(x);。这是因为Integer是不可变的,其中x=(任何整型字面量)。


1
我希望你的意思是 i2 =(任何整数字面量);,否则这将是错误的。 - tkausl
我认为这很明显。我只想指出一个新的对象被创建了。 - xro7
这一点并不明显。在OP的代码中,i1和i2都是整型变量Integeri2 = i1;不会创建Integer的新实例。 - tkausl
好的,严格来说,它不需要是一个新对象。你是正确的。 - xro7
更好的写法是 Integer.valueOf(i1) 而不是 new Integer(i1); - xro7

1

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

例如:

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

现在,i1i2 是两个不同的物理地址。

0
你在这里遇到的问题是,i1 = 233 改变了 i1 所引用的内存地址。

0

这里涉及到自动装箱。当你进行赋值时

i1=233;

它实际上将其读作

i1= new Integer(233);

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接