Как Java обрабатывает ссылки и назначения ArrayList? - PullRequest
0 голосов
/ 06 мая 2010

Я в основном пишу на C, но использую Java для этого проекта. Я хочу знать, что делает Java здесь под капотом.

ArrayList<Integer> prevRow, currRow;
currRow = new ArrayList<Integer>();
for(i =0; i < numRows; i++){
    prevRow = currRow;
    currRow.clear();
    currRow.addAll(aBunchOfItems);
}

Копирует ли строка prevRow = currRow список или теперь prevRow указывает на тот же список, что и currRow? Если prevRow указывает на тот же список, что и currRow, я должен создать новый ArrayList вместо очистки ....

private ArrayList<Integer> someFunction(ArrayList<Integer> l){
    Collections.sort(l);
    return l;
}

main(){
    ArrayList<Integer> list = new ArrayList<Integer>(Integer(3), Integer(2), Integer(1));

    list = someFunction(list);  //Option 1
    someFunction(list);  //Option 2
}

В аналогичном вопросе, делают ли Вариант 1 и Вариант 2 одно и то же в приведенном выше коде?

1009 * Благодарения и *

Jonathan

Ответы [ 3 ]

8 голосов
/ 06 мая 2010

Если вы пришли в Java из C / C ++, запомните это золотое правило, которое ответит почти на все эти сомнения: в Java переменная (кроме примитивов) - это всегда ссылка (своего рода указатель) на объект никогда не объект сам по себе.

Например

 prevRow = currRow;

присваивает ссылку, так что prevRow и currRow теперь ссылаются на один и тот же объект. Объекты не копируются ни в присваиваниях, ни в передаче аргументов (то, что копируется / присваивается, является ссылкой). И так далее.

1 голос
/ 06 мая 2010

Является ли копирование строки prevRow = currRow список или предыстория теперь указывают на тот же список, что и currRow? Если предыдущая указывает на тот же список, что и currRow, я вместо этого следует создать новый ArrayList очистки ..

Теперь это ссылка на тот же список. Таким образом, очистка это уничтожит ваш предыдущий список. Insead do currRow = new ArrayList<Integer>()

В аналогичном вопросе выполните Вариант 1 и Вариант 2 сделать то же самое в код выше?

Да, они делают. Вы передаете ссылку на свой список и меняете его. Так что оба работают. Вариант 2 немного более ясен в отношении того, что вы делаете, и я предпочитаю это по стилю, но оба работают.

Помните, Java всегда передается по VALUE .. но для не примитивных (любой класс, который начинается с заглавной буквы обычно ...), вы передаете значение адреса памяти, а не значение содержимого внутри , Для примитива (int, float) вы просто передаете значение.

1 голос
/ 06 мая 2010
  1. Думайте о любом экземпляре, созданном с ключевым словом "new", в качестве указателя. prevRow теперь указывает на то же самое, что делает currRow. Единственными типами значений в Java являются примитивы (byte, char, int, long, float, double). Все остальное является объектом. Массивы примитивов попадают в категорию объектов (создается с помощью «new»).
  2. Да (если вы исправите оператор return type / return, чтобы он скомпилировался;)).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...