在不创建新实例的情况下操作整数对象?
Manipulating an Integer Object Without creating a new Instance?
我有:
// lets call this Integer reference ABC101
Integer i = new Integer(5);
//j points to i so j has the reference ABC101
Integer j = i;
//creates a new Integer instance for j?
j++;
//I want j++ to edit and return ABC101
System.out.println(i); // 5 not 6
所以我的目标是在不切换引用的情况下通过具有相同引用的不同对象来操作 I。不不不,"Why don't you just use ints or why don't you just mess with I directly"。这不是本练习的目的。做事总是有更简单的方法,但这是我应该处理的。最后一个问题……这是否意味着 Integer 对象是不可变的?
事实上,所有原语(int、boolean、double 等)及其各自的 Wrapper classes 都是不可变的。
不能使用后增量运算符j++
来改变i的值。
这是因为 j++
转换为 j = j + 1
并且赋值运算符 =
意味着 i 和 j 不再指代同一个对象。
您可以做的是使用一个 int 数组(或 Integer,无论您喜欢什么)。您的代码将如下所示
int i[] = {5};
int j[] = i;
j[0]++;
System.out.println(i[0]); // prints 6
但是不推荐这样做。在我看来你应该使用你自己的 wrappe class for int 看起来像这样
public class MutableInt
private int i;
public MutableInt(int i) {
set(i);
}
public int get() {
return i;
}
public void set(int i) {
this.i = i;
}
public void increment() {
i++;
}
// more stuff if you want to
请注意,您将无法以这种方式使用自动装箱,并且没有像 java.lang.Integer
这样的缓存
您可以使用 AtomicInteger
AtomicInteger i = new AtomicInteger(5);
AtomicInteger j = i;
j.addAndGet(1);
System.out.println(i); //6
System.out.println(j); //6
我有:
// lets call this Integer reference ABC101
Integer i = new Integer(5);
//j points to i so j has the reference ABC101
Integer j = i;
//creates a new Integer instance for j?
j++;
//I want j++ to edit and return ABC101
System.out.println(i); // 5 not 6
所以我的目标是在不切换引用的情况下通过具有相同引用的不同对象来操作 I。不不不,"Why don't you just use ints or why don't you just mess with I directly"。这不是本练习的目的。做事总是有更简单的方法,但这是我应该处理的。最后一个问题……这是否意味着 Integer 对象是不可变的?
事实上,所有原语(int、boolean、double 等)及其各自的 Wrapper classes 都是不可变的。
不能使用后增量运算符j++
来改变i的值。
这是因为 j++
转换为 j = j + 1
并且赋值运算符 =
意味着 i 和 j 不再指代同一个对象。
您可以做的是使用一个 int 数组(或 Integer,无论您喜欢什么)。您的代码将如下所示
int i[] = {5};
int j[] = i;
j[0]++;
System.out.println(i[0]); // prints 6
但是不推荐这样做。在我看来你应该使用你自己的 wrappe class for int 看起来像这样
public class MutableInt
private int i;
public MutableInt(int i) {
set(i);
}
public int get() {
return i;
}
public void set(int i) {
this.i = i;
}
public void increment() {
i++;
}
// more stuff if you want to
请注意,您将无法以这种方式使用自动装箱,并且没有像 java.lang.Integer
您可以使用 AtomicInteger
AtomicInteger i = new AtomicInteger(5);
AtomicInteger j = i;
j.addAndGet(1);
System.out.println(i); //6
System.out.println(j); //6