2013-07-10 81 views
0
boolean temp1,temp2; 

     temp1 = true; 
     temp2 = temp1; 
     Log.d("rvg", "temp1:"+temp1+" temp2:"+temp2); 

     temp1 = false; 
     Log.d("rvg", "temp1:"+temp1+" temp2:"+temp2); 

當我執行此,我得到分配默認值:JAVA

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得到了相同的值和溫度2.

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

如何避免這種情況?

+0

使用'TEMP2 [0] = TEMP1 [0]; '而不是'Temp2 = Temp1;' – johnchen902

+0

如何通過在循環中迭代而不是直接通過Temp2 [] = Temp1將值從temp1複製到temp2,這會導致通過引用進行復制,因此您隱式地綁定它們,從而導致影響彼此 –

回答

2

您需要複製數組。取而代之的

Temp2 = Temp1; 

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

在第一種情況下,temp2讀取temp1(true)並在其中設置真值。在第二種情況下,您將爲兩個數組分配相同的內存,以便它們內部的值相同。

解決方案:

Temp2[0] = Temp1[0]; 

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

第一種情況將讀取內部temp1目錄[0]的值,並且將其分配給[0] TEMP2。在第二種情況下,Temp2將是Temp1的新副本,不共享相同的內存,因此您可以獨立修改每個

1

數組變量引用。當您說Temp2 = Temp1;時,您將對名爲Temp2的數組的引用分配到變量Temp1中,以便兩者都參考相同的數組。不相等,相同。因此,在使用其他引用時,使用其中一個引用在此數組中完成的所有更改都是可見的。這就是爲什麼你會得到相同的結果。

0

簡答:你不能避免這種情況。由於Java中的數組基本上是一個對象(或至少可以這樣對待),因此Temp2 = Temp1;將指向與Temp1相同的內存塊。所以如果你改變Temp1Temp2會反映這些改變。

它使用原始類型boolean時表現不同的原因是,temp2 = temp1;使值的temp1代替的副本。但temp2仍然有自己的內存塊。

爲了使數組與基元類型具有相同的行爲,您可以改爲使用Arrays.copyOf(boolean[], int)。無論數組大小如何,它都可以工作。

0

我不明白你發佈的代碼和你想達到什麼樣的錯誤。

但是我敢肯定,這個問題與這個事實有關,boolean是java中的一種基本數據類型。這意味着每個布爾變量都存儲一個值,並且運算符將該值從一個變量複製到另一個變量。

相反,當你使用一個數組時,你有兩個變量是對同一個內存位置的引用。所以當你改變一個變量的值時,你會發現變化也會傳播給另一個變量,因爲你正在從同一個內存位置讀取數據。

0

在第一個示例中,temp1和temp2是基元類型(不是對象)。將temp1分配給temp2時,只分配該值,但有兩個不同的變量temp1和temp2。如果你改變一個的值,另一個不會改變。

在第二種情況下,Temp1和Temp2是數組(對象)。當您將Temp1分配給Temp2時,您說Temp2是指向Temp1指向的同一對象的指針:相同的對象,兩個要訪問它的變量。如果您更改Temp1訪問的對象或Temp2訪問您正在更改同一個對象。

如果你想避免這種情況,你必須保持兩個不同的對象,改變只值,即:

Temp2[0]=Temp1[0]
代替

Temp2=Temp1