其他答案对我没用。我的问题是关于整数。
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相关联。
java.lang.Integer
是不可变的。这意味着您无法以通常的方式更改Integer对象的值。您可以创建一个新的Integer
实例,并赋予它新值。
i1
和i2
包含对同一Integer
实例的引用。当您进行修改时,实际上是创建了一个新的实例,而不是在现有实例的基础上进行更改。i1 = 233;
i1
是指向另一个Integer
类的实例。如果您希望i1
和i2
指向同一个实例,可以使用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());
当你执行这个操作:i2 = x;
Java会自动为你执行这个操作 i2 = new Integer(x);
。这是因为Integer
是不可变的,其中x=(任何整型字面量)。
i2 =(任何整数字面量);
,否则这将是错误的。 - tkauslInteger
,i2 = i1;
不会创建Integer
的新实例。 - tkauslInteger.valueOf(i1)
而不是 new Integer(i1);
。 - xro7Java在分配新的整数字面值时总是创建新对象,因为Integer是不可变的。
例如:
i1=233; // it represent as i1= new Integer(233);
i1
和 i2
是两个不同的物理地址。i1 = 233
改变了 i1
所引用的内存地址。这里涉及到自动装箱。当你进行赋值时
i1=233;
它实际上将其读作
i1= new Integer(233);
i1 = 233;
改变了i1
的值,使其指向另一个Integer
对象。Integer
本身是不可变的。也许你想要用AtomicInteger
,在这里你可以修改对象中的值? - Jon Skeet