2012-06-22 4 views

ответ

1
ArrayList list = someOtherArrayList; 

В этом случае прямому адресу someOtherArrayList присваивается список.

ArrayList list = getData(); 

public ArrayList getData() { 
    return otherList; 
} 

В этом случае адрес возвращаемого списка копируется во временную переменную, а затем временную переменную в список. Здесь адрес копируется во временную переменную, потому что: Когда функция возвращается, все ее данные в стеке освобождаются/удаляются, поэтому также ссылается на ссылку на объект otherList. Но до этого ссылка/адрес копируется во временную переменную. Когда адрес из временной переменной копируется в переменной списка. Он также удаляется.

+1

Почему вы думаете, что 'otherList' освобождается при выходе? Это не локальная переменная внутри этого метода. По-видимому, это поле члена класса. –

+0

Да обряд. Это поле члена класса. – Rookie

+0

@GrahamBorland: ссылка на объект удаляется, если список локально создан и возвращен. Но если это поле класса, то возвращается эта ссылка, но то же самое описано выше. –

3

Там нет никакой разницы. В обоих случаях вы назначаете list ссылку на существующий ArrayList.

+0

нет, его не переменная samw – Rookie

+1

Редактируйте код, чтобы сделать это понятнее. Измените имя одного из них. :) –

+0

Отредактировал свой ответ, чтобы отразить ваше редактирование на вопрос. –

1

№. Список всего Ссылка на объект в памяти. Это означает, что если вы делаете:

list1 = list2; 
list1.add("abc"); 

list2.get(list2.size()-1) будет "а" также.

В методе вы возвращаете ту же ссылку, поэтому она ведет себя одинаково. Если вы вернете копию списка в методе, тогда два подхода разные.

0

Это очень странно:

ArrayList list = getData(); 

public ArrayList getData(){ 
    return list; 
} 

Вы устанавливаете список свое значение, то есть изначально null.

Так что если someotherlist не является нулевым, есть разница, поскольку вы ничего не делаете.

EDIT: видел ваше редактирование. Теперь оба назначения идентичны. Нет никакой разницы. Мы могли бы утверждать, что один из них может быть немного медленнее по мере вызова функции, но в этом случае он будет быстро встроен компилятором JIT.

Смежные вопросы