0
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

怎么做才能避免这种情况?

4

6 回答 6

2

您需要复制数组。代替

Temp2 = Temp1;

Temp2 = Arrays.copyOf(Temp1, Temp1.length);
于 2013-07-10T10:39:51.700 回答
1

在第一种情况下 temp2 读取 temp1 (true) 并在其中设置 true 值。在第二种情况下,您为两个数组分配相同的内存,因此它们内部的值是相同的。

解决方案:

Temp2[0]   = Temp1[0];

或者

Temp2 = Arrays.copyOf(Temp1, Temp1.length);

第一种情况将读取 temp1[0] 中的值并将其分配给 temp2[0]。在第二种情况下,Temp2 将是 Temp1 的新副本,不共享相同的内存,因此您可以独立修改每个

于 2013-07-10T10:39:51.653 回答
1

数组变量是引用。当您说Temp2 = Temp1;您将引用分配给命名Temp2为变量的数组Temp1时,以便两者都引用同一个数组。不相等,一样。因此,当您使用其他引用时,使用其中一个引用在此数组中完成的所有更改都是可见的。这就是为什么你会得到相同的结果。

于 2013-07-10T10:40:57.323 回答
0

简短的回答:你无法避免这一点。由于 Java 中的数组基本上是一个对象(或至少被视为对象),Temp2 = Temp1;因此将Temp2指向与Temp1. 所以如果你改变了Temp1Temp2就会反映出那些改变。

使用原始类型时它的行为不同的原因booleantemp2 = temp1;复制了 的temp1temp2仍然有自己的内存块。

为了使数组具有与原始类型相同的行为,您可以Arrays.copyOf(boolean[], int)改用。无论数组的大小如何,它都会起作用。

于 2013-07-10T10:42:05.173 回答
0

我不明白您发布的代码有什么问题以及您想要实现什么。

但是我很确定这个问题与 aboolean是 java 中的原始数据类型有关。这意味着每个布尔变量都存储一个值,并且=运算符将值从一个变量复制到另一个变量。

相反,当您使用数组时,您有两个变量是对同一内存位置的引用。因此,当您更改一个变量的值时,您会观察到更改也会传播到另一个变量,因为您正在从同一内存位置读取。

于 2013-07-10T10:43:12.537 回答
0

在第一个示例中 temp1 和 temp2 是原始类型(不是对象)。当您将 temp1 分配给 temp2 时,您只分配值,但有两个不同的变量 temp1 和 temp2。如果你改变一个的值,另一个不会改变。

在第二种情况下,Temp1 和 Temp2 是数组(对象)。当您将 Temp1 分配给 Temp2 时,您是在说 Temp2 是指向 Temp1 指向的同一对象的指针:同一对象,访问它的两个变量。如果您更改通过 Temp1 访问或通过 Temp2 访问的对象,您将更改同一个对象。

如果要避免这种情况,则必须维护两个不同的对象并仅更改值,即:

温度 2[0]=温度 1[0]
反而

温度2=温度1
于 2013-07-10T10:46:49.867 回答