我有一个关于创建变量数组的问题;如果我创建一个整数类型的变量数组,并且我更改数组之外的那些变量的值,那么数组内的值也会更新?我已经在eclipse中试过这个并且它似乎不起作用(见下面的代码)
int num1 = 1;
int num2 = 2;
int num3 = 3;
int [] nums = {num1, num2, num3};
num1++;
System.out.println(num1);
System.out.println(nums[0]);
我希望的是两个输出(num1
和nums[0]
)是相同的,但到目前为止我所遇到的是nums[0]
保持不变并且没有& #39; t得到更新,任何有关如何更新此值的提示(无需进入并更新)都非常感谢
答案 0 :(得分:5)
Java的int
类型是值类型而不是引用类型,因此在创建数组时,旧int
的值将复制到数组中。因此,更改原始数据(在数组外部)不会更改数组内的独立副本。
为了实现你想要的行为,你可以使用Erwin的解决方案,或者你必须创建自己的包装类来实现额外的间接值,不幸的是这很简单。
class IntWrapper {
public int value;
public IntWrapper(int i) {
value = i;
}
}
class Main{
public static void main(String[] args) {
IntWrapper num1 = new IntWrapper(1);
IntWrapper num2 = new IntWrapper(2);
IntWrapper num3 = new IntWrapper(3);
IntWrapper[] nums = {num1, num2, num3};
num1.value++;
System.out.println(num1.value);
System.out.println(nums[0].value);
}
}
答案 1 :(得分:0)
在Java中,原始类型按值传递。将num1
放入数组nums
后,会制作副本。如果您稍后更改num1
,则它对数组中的值没有影响。
对象引用也按值传递,但对象本身不是 - 它们通过传递对它们的传递来传递。因此,如果您创建一个表示整数的对象数组,并且可以修改这些对象,那么您可以执行所需的操作。
标准API有一个表示整数的类,称为java.lang.Integer
。但是,它代表不可变整数,因此对您没用。
在标准API中,还有另一个名为java.lang.concurrent.atomic.AtomicInteger
的类。可以修改此类的对象。
你可以像这样使用它:
AtomicInteger num1 = new AtomicInteger(1);
AtomicInteger num2 = new AtomicInteger(2);
AtomicInteger num3 = new AtomicInteger(3);
AtomicInteger[] nums = {num1, num2, num3};
num1.incrementAndGet();
System.out.println(num1);
System.out.println(nums[0]);