2013-07-10 3 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 и Temp 2.

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

Что делать, чтобы избежать этого?

+0

Используйте 'Temp2 [0] = Temp1 [0]; 'вместо' Temp2 = Temp1; ' – johnchen902

+0

как насчет копирования значений из temp1 в temp2 путем итерации в цикле не непосредственно этим Temp2 [] = Temp1, который вызывает копирование по ссылке, поэтому вы неявно связываете их, что приводит к влиянию друг друга –

ответ

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] и назначит ему temp2 [0]. Во втором случае Temp2 будет новой копией Temp1 без совместного использования одной и той же памяти, чтобы вы могли независимо изменять каждый

1

массив переменных ссылки. Когда вы говорите Temp2 = Temp1;, вы назначаете ссылку на массив с именем Temp2 на переменную Temp1, так что оба ссылаются на тот же массив. Не равный, тот же. Поэтому все изменения, сделанные в этом массиве с использованием одной из ссылок, видны, когда вы используете другую ссылку. Вот почему вы получаете те же результаты.

0

Короткий ответ: вы не можете избежать этого. Поскольку массив в Java в основном является объектом (или, по крайней мере, рассматривается как таковой), то Temp2 = Temp1; будет иметь Temp2, указывая на тот же блок памяти, что и Temp1. Поэтому, если вы измените Temp1, Temp2 отразит эти изменения.

Причина он ведет себя иначе, когда с помощью примитивного типа 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
Смежные вопросы