Странные результаты при использовании ArrayListв Яве - PullRequest
0 голосов
/ 24 января 2012

У меня странные проблемы в моем приложении для Android, и я думаю, что это может быть связано с поведением работы ArrayList.Проверьте следующий код и, пожалуйста, скажите мне, если я прав или делаю что-то не так:

ArrayList<ArrayList<String>> arr = new ArrayList<ArrayList<String>>();
ArrayList<String> tmp = new ArrayList<String>();
tmp.add("test");
arr.add(tmp);
tmp.clear();

После последней строки содержимое arr [0] очищается.Значит ли это, что при добавлении одного ArrayList к другому он делает это по ссылке?

Итак, если у меня есть следующий метод:

void addArray(ArrayList<String> arr) {
 group.add(arr); // group is ArrayList<ArrayList<String>>;
};

, я должен изменить его на:

void addArray(ArrayList<String> arr) {
 ArrayList<String> tmp = new ArrayList<String>();
 tmp.addAll(arr);
 group.add(tmp); // group is ArrayList<ArrayList<String>>;
};

, чтобы убедиться, что если я очищу входящий массив где-то еще, ничего не произойдет с массивом группы?

Ответы [ 3 ]

3 голосов
/ 24 января 2012

В Java нет передачи по значению, каждый объект передается по ссылке. Таким образом, в вашем случае arr[0] и tmp - это один и тот же объект, и очистка приведет к очистке arr[0]. Надеюсь это поможет.

EDIT

В качестве быстрого ответа на вторую часть вашего вопроса: вам не нужно использовать tmp ArrayList внутри addArray метода. Аргументом метода addArray является ссылка на объект, переданная значением . Таким образом, изменение его не будет иметь никакого эффекта любого вне метода addArray. Надеюсь, это понятно.

0 голосов
/ 24 января 2012

Для объектов Java всегда передает копию ссылочного значения, поэтому да, очищаемый ArrayList совпадает с тем, который вы добавили в другой ArrayList.

0 голосов
/ 24 января 2012

Да, объекты не клонируются при добавлении в коллекцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...