2015-04-20 3 views
0

Я не вижу причин, по которым вывод для этого сегмента кода должен быть другим в нижней части, чем сверху.Не понимаю выход

public static void main(String[] args) {  

     int[] list1 = {2, 4, 8, 16, 32, 64, 128, 256}; 
     int[] list2 = list1; 
     int max = list1.length - 1; 
     for (int k = 0; k < list1.length; k++) { 
      System.out.print(list1[k] + " "); 
      list2[k] = list1[max - k]; 
     } 
     System.out.print("\n"); 
     for (int k = 0; k < list1.length; k++) { 
      System.out.print(list1[k] + " "); 
     } 
    } 

ВЫХОД:

2 4 8 16 32 64 128 256 
256 128 64 32 32 64 128 256 

Верхняя часть выходного сигнала является то, что это песни1. Я распечатываю list1 для второго, но я не вижу причин для его отличия. list2 изменяется, но list1 никогда не изменяется.

Это из школы, и я просто смущен тем, почему два выхода отличаются друг от друга.

EDIT: Я знаю, что это как-то связано с list2[k] = list1[max - k];, но я не понимаю, почему это изменило бы список1 в любом случае.

+0

Если один из наших ответов помог вам, пожалуйста, примите его как ответ. – childofsoong

ответ

1

int[] является ссылочным типом. Это означает, что фактическое значение в переменных list1 и list2 является просто адресом массива.

Когда вы делаете следующее, вы на самом деле не копируете массив. Вы копируете только адрес массива.

int[] list2 = list1; 

С list2 и list1 теперь указывают на тот же массив, любые изменения, внесенные в элементы list2 будут также к элементам list1, потому что они одни и те же элементы.

+0

Вау, вы и все остальное просто сделали это очень просто. Я не могу вас поблагодарить. – Andyo98

3

Ваша проблема на самом деле с помощью следующей строки:

int[] list2 = list1; 

Это вызывает вас есть две ссылки на тот же объект в памяти. Таким образом, когда вы выполняете задание (где, как вы считали, ваша проблема), вы помещаете последний элемент в первый слот, второй - во второй слот и так далее, пока не дойдете до середины, а затем вы копируете новые значения, что означает, что они фактически не изменяются.

То, что вы, вероятно, хотите сделать, это сделать отдельную копию list1 с методом clone(), например, так:

int[] list2 = list1.clone(); 

ОДНАКО (как GRC указал), нет никаких оснований даже сделать копию в этом потому что ваш план состоит в том, чтобы все равно переписать все содержимое. Итак, вы можете просто сделать следующее:

int[] list2 = new int[list1.length]; 
+0

Это то, что было дано мне, я просто не могу понять, почему это будет проблемой. – Andyo98

+1

Я бы не сделал list.clone() вообще, потому что вы копируете list1, а не переписываете его позже. –

+0

Хорошая точка @GRC - я обновлю, чтобы это отразить. – childofsoong

5

Они разные, потому что обе переменные указывают на один и тот же объект. Чтобы иметь тот же результат, замените эту строку:

int[] list2 = list1; 

к:

int[] list2 = list1.clone(); 
+0

Ничего себе, что указание на те же предметы никогда не объяснялось нам в классе. Итак, чтобы получить это прямо: list1 и list2 в исходном коде используют один и тот же набор данных, даже если у них разные имена? – Andyo98

+0

Прочитайте немного о указателях на C и Java. Это прояснит ваше понимание об этом. :) – Laerte