Страницы

Поиск по вопросам

понедельник, 28 января 2019 г.

Java - вопрос про ресурсоемкость параметров-объектов в методах

Как известно, объекты передаваемые в функциях являются ссылками, поэтому напрашивается такой вопрос: примерно одинаково затратно будут первые два способа либо второй практически равноценен созданию новых объектов, что, как я понимаю, безумно затратно (третий способ)?
Первый:
class A {
ArrayList < Point > list;
public A() { list = new ArrayList < Point > (); //представим, что тут лист заполняется сотней новых объектов update(); }
void update() { for (int i = 0; i < 100; i++) { list.get(i).set(i, i); // } } }
Второй:
class B {
ArrayList < Point > list;
public B() { list = new ArrayList < Point > (); //представим, что тут лист заполняется сотней новых объектов update(list); }
void update(ArrayList < Point > p) { for (int i = 0; i < 100; i++) { p.get(i).set(i, i); // } } }
Третий:
class С {
ArrayList list;
public С() { list = new ArrayList (); //представим, что тут лист заполняется сотней новых объектов list = update(); }
ArrayList update() { ArrayList pp = new ArrayList (); pp.addAll(list); for (int i = 0; i < 100; i++) { pp.get(i).set(i, i); // } return pp; } }
Смело использовать второй способ или все же продолжить проводить операции только с полями классов, если возможно?


Ответ

Первые два способа по стоимости практически одинаковы. Передача ссылочного типа есть не что иное, как передача ссылки (то есть, указателя, если вы знакомы с С или C++). Размер ссылки равен размеру одного регистра процессора на популярных платформах (то есть, практически бесплатно). Второй способ, однако, лучше тем, что у него меньшая связность: ваш метод update может использоваться не только с полем A.list, а и с любым другим объектом подходящего типа.
Третий способ, разумеется, дороже (особенно для больших списков): у вас дополнительные расходы на копирование списка (не ссылки на список, а данных списка!).

Комментариев нет:

Отправить комментарий