分配默认值:java

分配默认值:java,java,android,Java,Android,当我执行这个时,我得到了 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:tru

当我执行这个时,我得到了

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
当我执行这个时,我得到了Temp1和temp2的相同值

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]);

如何避免这种情况?

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

解决方案:

Temp1:true  Temp2:true
Temp1:false     Temp2:false


第一种情况将读取temp1[0]中的值,并将其分配给temp2[0]。在第二种情况下,Temp2将是Temp1的一个新副本,而不共享相同的内存,因此您可以独立修改每个副本。在第一种情况下,Temp2读取Temp1(true)并在其中设置true值。在第二种情况下,将相同的内存分配给两个数组,以便它们内部的值相同

解决方案:

Temp1:true  Temp2:true
Temp1:false     Temp2:false


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

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


您需要复制阵列。而不是

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


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

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

简短回答:你无法避免这一点。由于Java中的数组基本上是一个对象(或至少被视为对象),
Temp2=Temp1将使
Temp2
指向与
Temp1
相同的内存块。因此,如果您更改
Temp1
Temp2
将反映这些更改

使用基元类型
boolean
时,其行为不同的原因是
temp2=temp1复制
temp1
值。但是
temp2
仍然有自己的内存块


为了使数组具有与基元类型相同的行为,可以使用。无论阵列大小如何,它都可以工作。

简短回答:您无法避免这种情况。由于Java中的数组基本上是一个对象(或至少被视为对象),
Temp2=Temp1将使
Temp2
指向与
Temp1
相同的内存块。因此,如果您更改
Temp1
Temp2
将反映这些更改

使用基元类型
boolean
时,其行为不同的原因是
temp2=temp1复制
temp1
值。但是
temp2
仍然有自己的内存块


为了使数组具有与基元类型相同的行为,可以使用。无论数组大小如何,它都能工作。

我不明白您发布的代码有什么问题,以及您希望实现什么

然而,我很确定这个问题与
布尔值
在java中是一种原始数据类型这一事实有关。这意味着每个布尔变量存储一个值,
=
运算符将该值从一个变量复制到另一个变量


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

我不明白您发布的代码有什么问题,以及您希望实现什么

然而,我很确定这个问题与
布尔值
在java中是一种原始数据类型这一事实有关。这意味着每个布尔变量存储一个值,
=
运算符将该值从一个变量复制到另一个变量


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

在第一个示例中,temp1和temp2是基本类型(而不是对象)。将temp1指定给temp2时,只指定值,但有两个不同的变量,temp1和temp2。如果更改其中一个的值,则另一个不会更改

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

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

而Temp2[0]=Temp1[0]


Temp2=Temp1在第一个示例中,Temp1和Temp2是基本类型(不是对象)。将temp1指定给temp2时,只指定值,但有两个不同的变量,temp1和temp2。如果更改其中一个的值,则另一个不会更改

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

如果你想避免这种情况,你必须保持两种不同
Temp2 = Arrays.copyOf(Temp1, Temp1.length);
Temp2[0]=Temp1[0] Temp2=Temp1