boolean temp1,temp2;
temp1 = true;
temp2 = temp1;
Log.d("rvg", "temp1:"+temp1+" temp2:"+temp2);
temp1 = false;
Log.d("rvg", "temp1:"+temp1+" temp2:"+temp2);
当我执行此操作时,我得到了
temp1:true temp2:true
temp1:false temp2:true
但我已经改为阵列
boolean[] Temp1,Temp2;
Temp1 = new boolean[1];
Temp2 = new boolean[1];
Temp1[0] = true;
Temp2 = Temp1;
Log.d("rvg", "Temp1:"+Temp1[0]+" Temp2:"+Temp2[0]);
Temp1[0] = false;
Log.d("rvg", "Temp1:"+Temp1[0]+" Temp2:"+Temp2[0]);
当我执行此操作时,我获得了Temp1和Temp 2的相同值。
Temp1:true Temp2:true
Temp1:false Temp2:false
如何避免这种情况?
答案 0 :(得分:2)
您需要复制数组。而不是
Temp2 = Temp1;
DO
Temp2 = Arrays.copyOf(Temp1, Temp1.length);
答案 1 :(得分:1)
在第一种情况下,temp2读取temp1(true)并在其中设置true值。在第二种情况下,您将为两个数组分配相同的内存,因此它们内部的值是相同的。
解决方案:
Temp2[0] = Temp1[0];
或
Temp2 = Arrays.copyOf(Temp1, Temp1.length);
第一种情况将读取temp1 [0]内的值并将其分配给temp2 [0]。在第二种情况下,Temp2将是Temp1的新副本,不共享相同的内存,因此您可以独立修改每个
答案 2 :(得分:1)
数组变量是引用。当您说Temp2 = Temp1;
时,您将对名为Temp2
的数组的引用分配给变量Temp1
,以便两者都引用相同的数组。不相等,相同。因此,当您使用其他引用时,使用其中一个引用在此数组中完成的所有更改都是可见的。这就是为什么你得到相同的结果。
答案 3 :(得分:0)
简短回答:你无法避免这种情况。由于Java中的数组基本上是一个对象(或者至少被视为对象),Temp2 = Temp1;
将Temp2
指向与Temp1
相同的内存块。因此,如果您更改Temp1
,Temp2
将反映这些更改。
使用基元类型boolean
时它的行为不同的原因是temp2 = temp1;
会复制temp1
的值。但是temp2
仍有自己的记忆块。
为了使数组与基本类型具有相同的行为,您可以使用Arrays.copyOf(boolean[], int)
代替。无论数组的大小如何,它都能正常工作。
答案 4 :(得分:0)
我不明白您发布的代码有什么问题以及您希望实现的目标。
但是我很确定这个问题与boolean
是java中的原始数据类型这一事实有关。这意味着每个布尔变量都存储一个值,=
运算符将值从一个变量复制到另一个变量。
相反,当您使用数组时,您有两个变量作为对同一内存位置的引用。因此,当您更改一个变量的值时,您会看到更改传播到另一个变量,因为您正在从同一个内存位置读取。
答案 5 :(得分:0)
在第一个示例中,temp1和temp2是基本类型(不是对象)。将temp1分配给temp2时,只分配值,但有两个不同的变量temp1和temp2。如果更改值1,则另一个不会更改。
在第二种情况下,Temp1和Temp2是数组(对象)。当您将Temp1分配给Temp2时,您说Temp2是指向Temp1指向的同一对象的指针:相同的对象,两个用于访问它的变量。如果您更改通过Temp1访问或通过Temp2访问的对象,则您将更改同一对象。
如果你想避免这种情况,你必须保留两个不同的对象,只改变值,即:
Temp2[0]=Temp1[0]而不是
Temp2=Temp1