Java очистка списка путем создания нового экземпляра - PullRequest
1 голос
/ 31 августа 2011

Я просматривал код Java и наткнулся на этот код:

list = new ArrayList();
uselist(list);

if (condition)
   list = new ArrayList();

Какая польза от этого, в отличие от простого использования метода clear () ArrayLists.

используется новая команда для очистки списка, и это быстрее, чем очистка списка?

Я использую Java версии 1.6

Ответы [ 5 ]

9 голосов
/ 31 августа 2011

Обратите внимание, что очистка и повторное создание списка - это не одно и то же!

Рассмотрим этот пример:

a = new ArrayList();
a.add("Hello")
b = a;
a = new ArrayList();   // a is now empty while b contains hello!

В сравнении

a = new ArrayList();
a.add("Hello")
b = a;
a.clear();            // Both a and b are now empty.

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

9 голосов
/ 31 августа 2011

Нет, они не делают то же самое.Метод clear () очищает существующий список - все, что все еще имеет ссылку на список и просматривает его позже, увидит, что оно пустое.

Подход с newКлючевое слово , изменяет значение переменной list, но ничего не делает с существующим ArrayList объектом - поэтому, если что-то еще имеет ссылку на тот же объект, они не увидят никаких изменений.

3 голосов
/ 31 августа 2011

Если список используется в другом месте, вызов clear() может вызвать побочные эффекты.Однако, если это не так, я бы сказал, что создание нового списка вместо очистки старого может быть быстрее (однако, вероятно, только для огромных списков, так как ArrayList * * 1005)* просто перебирает элементы и устанавливает их как null), но, скорее всего, это просто вопрос стиля программирования.

2 голосов
/ 31 августа 2011

Является ли это тем же или нет, это зависит от того, что uselist (...) внутренне делает со списком.

Например, предположим, у вас есть следующий код в списке использования:

public void uselist(List l) {
    this.mylist = l;
}

В этом случае ваш код создаст новый список и не коснется this.mylist. Если вместо этого вы вызываете .clear (), вы очищаете тот же список.

0 голосов
/ 31 августа 2011

Разница может быть фатальной и трудно увидеть. Например, hibernate выскочит из вас, используйте list = new ArrayList(); а затем попробуйте обновить список в БД, но он отлично работает с clear () как hibernate, затем может увидеть соединение.

clear() // operates on your old object 

list = new ArrayList(); // list will be a new object the old will be GCed
...