Java 创建变量数组
我有一个关于创建变量数组的问题;如果我创建一个整数类型的变量数组,并且在数组外部更改这些变量的值,那么数组内部的值也会得到更新吗?我已经在eclipse中尝试过了,但它似乎不起作用(请参阅下面的代码)Java 创建变量数组,java,arrays,variables,Java,Arrays,Variables,我有一个关于创建变量数组的问题;如果我创建一个整数类型的变量数组,并且在数组外部更改这些变量的值,那么数组内部的值也会得到更新吗?我已经在eclipse中尝试过了,但它似乎不起作用(请参阅下面的代码) 我希望两个输出(num1和nums[0])是相同的,但到目前为止,我经历的是nums[0]保持不变,不会更新,关于如何更新此值的任何提示(无需进入并更新)最受欢迎的是Java的int类型是值类型而不是引用类型,因此当您创建数组时,旧int的值将复制到数组中。因此,更改原始(阵列外部)不会更改阵列内
我希望两个输出(
num1
和nums[0]
)是相同的,但到目前为止,我经历的是nums[0]
保持不变,不会更新,关于如何更新此值的任何提示(无需进入并更新)最受欢迎的是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);
}
}
在Java中,基本类型是按值传递的。当您将
num1
放入数组nums
中时,创建了一个副本。如果以后更改num1
,则它对数组中的值没有影响。
对象引用也是通过值传递的,但对象本身不是——它们是通过向对象传递引用来传递的。因此,如果您创建一个表示整数的对象数组,并且可以修改这些对象,那么您可以做您想要做的事情
标准API有一个表示整数的类,称为java.lang.integer
。但是,它表示一个不可变的整数,因此对您没有任何用处。
在标准API中,还有另一个类称为java.lang.concurrent.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]);
您只需编写
nums[0]++
在数组中增加一个数字。多亏了这一点,我用这个方法创建了一个整数包装器,但是现在如果我有几个单独的类实例,并且想向不同的实例添加不同的值(即,将1添加到num1,从num2中减去1),那么它会对所有三个实例执行此操作,知道如何解决这个问题吗?@cvarza,使用new
关键字独立创建的此类实例应彼此完全独立。如果使用IntWrapper a=b
进行复制,则将引用同一对象,因此一个对象中的更改将传播到另一个对象。如果这还不够清楚,请提出一个引用此问题的新问题,并显示一些描述该问题的代码。如果您在此处添加一条链接到新问题的注释,我将查看它。@cvarza,如果您想在当前实现下创建具有相同值的独立副本,您可以执行IntWrapper a=new IntWrapper(b.value)代码>thx对于您在这一点上的帮助,merlin,我设法找到了一个关于管理单独实例的解决方案(我的另一个问题的链接是您是否可以添加其他信息),谢谢。
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]);