Подтвердить что ты не робот

Лучшая практика для повторного создания списка или вызова clear()

Используя Java (1.6), лучше ли вызывать метод clear() в List или просто повторно создать ссылку?

У меня есть ArrayList, который заполняется неизвестным количеством объектов и периодически "размывается" - там, где объекты обрабатываются, и список удаляется. Покрасневший список снова заполняется. Сброс происходит в случайное время. Число в списке может быть небольшим (10s объектов) или большим (миллионы объектов).

Так лучше ли вызывать "промывочный" вызов clear() или новый ArrayList()?

Стоит ли даже беспокоиться о подобных проблемах или я должен позволить VM беспокоиться об этом? Как я могу взглянуть на область памяти Java, чтобы работать с этим для себя?

Любая помощь очень ценится.

4b9b3361

Ответ 1

Главное, что нужно беспокоиться, - это то, что другой код может иметь ссылку на список. Если существующий список отображается в другом месте, вы хотите, чтобы этот код видел очищенный список или сохранял существующий?

Если больше ничего не увидит список, я бы, наверное, просто его очистил, но не по соображениям производительности; просто потому, что способ, которым вы описали операцию, звучит скорее как очистка, чем "создать новый список".

В документах ArrayList<T> не указывается, что происходит с базовыми структурами данных, но, глядя на реализацию 1.7 в Eclipse, похоже, что вы должны, вероятно, позвонить trimToSize() после clear() - иначе вы все равно можете список, поддерживаемый большим массивом нулевых ссылок. (Может быть, это не проблема для вас, конечно... может быть, это более эффективно, чем необходимость копировать массив по мере того, как размер снова увеличивается. Об этом вы узнаете больше, чем мы.)

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

Ответ 2

То, как вы его используете, очень похоже на использование Queue. Когда вы работаете с элементами в очереди, они удаляются при их обработке.

Использование одного из классов Queue может сделать код более элегантным.

Существуют также варианты, которые обрабатывают параллельные обновления предсказуемым образом.

Ответ 3

Я думаю, что если Arraylist слишком часто сбрасывается, например, если он работает непрерывно в цикле или что-то, то лучше использовать его, если промывка не слишком частая, тогда вы можете создать новый экземпляр. Также, поскольку вы говорите, что элементы могут варьируются от 10 объектов до миллионов, вы, вероятно, можете найти промежуточный размер для каждого нового созданного вами Arraylist, чтобы арраист мог избежать изменения размера времени.