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 (真) を読み取り、それに真の値を設定します。2 番目のケースでは、同じメモリを両方の配列に割り当てているため、それらの内部の値は同じです。

ソリューション:

Temp2[0]   = Temp1[0];

また

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

最初のケースでは、temp1[0] 内の値を読み取り、それを temp2[0] に割り当てます。2 番目のケースでは、Temp2 は Temp1 の新しいコピーになり、同じメモリを共有しないため、それぞれを個別に変更できます。

于 2013-07-10T10:39:51.653 に答える
1

配列変数は参照です。variableTemp2 = Temp1;という名前の配列への参照を割り当てると、両方が同じ arrayを参照するようになります。等しくない、同じ。したがって、参照の 1 つを使用してこの配列で行われたすべての変更は、他の参照を使用すると表示されます。これが、同じ結果が得られる理由です。Temp2Temp1

于 2013-07-10T10:40:57.323 に答える
0

最初の例では、temp1 と temp2 はプリミティブ型です (オブジェクトではありません)。temp1 を temp2 に割り当てる場合、値を割り当てるだけですが、temp1 と temp2 という 2 つの異なる変数があります。一方の値を変更しても、もう一方は変更されません。

2 番目のケースでは、Temp1 と Temp2 は配列 (オブジェクト) です。Temp1 を Temp2 に割り当てると、Temp2 は、Temp1 が指す同じオブジェクトへのポインターであると言えます。同じオブジェクト、それにアクセスするための 2 つの変数です。Temp1 でアクセスするか、Temp2 でアクセスするオブジェクトを変更すると、同じオブジェクトが変更されます。

それを避けたい場合は、2 つの異なるオブジェクトを維持し、値のみを変更する必要があります。

温度2[0]=温度1[0]
代わりは

温度2=温度1
于 2013-07-10T10:46:49.867 に答える
0

簡単な答え: これを避けることはできません。Java の配列は基本的にオブジェクト (または少なくともそのように扱われる) であるため、 と同じメモリ ブロックを指しTemp2 = Temp1;ます。したがって、 を変更すると、それらの変更が反映されます。Temp2Temp1Temp1Temp2

プリミティブ型を使用すると動作が異なる理由は、代わりに ののコピーを作成するためbooleanです。しかし、まだ独自のメモリブロックがあります。temp2 = temp1;temp1temp2

配列でプリミティブ型と同じ動作をさせるには、代わりに を使用できますArrays.copyOf(boolean[], int)。配列のサイズに関係なく機能します。

于 2013-07-10T10:42:05.173 に答える
0

投稿したコードの何が問題で、何を達成したいのかわかりません。

booleanただし、この問題は、aが Java のプリミティブ データ型であるという事実に関連していると確信しています。これは、各ブール変数が値を格納し、=オペレーターがその値を変数から別の変数にコピーすることを意味します。

反対に、配列を使用する場合、同じメモリ位置への参照である 2 つの変数があります。したがって、1 つの変数の値を変更すると、同じメモリの場所から読み取っているため、変更が他の変数にも伝播することがわかります。

于 2013-07-10T10:43:12.537 に答える