Лучше практиковать повторную инстанцию ​​List или вызывать clear () - PullRequest
33 голосов
/ 29 сентября 2010

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

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

Так что лучше сделать вызов flush clear () или new ArrayList ()?

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

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

Ответы [ 4 ]

33 голосов
/ 29 сентября 2010

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

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

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

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

2 голосов
/ 29 сентября 2010

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

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

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

1 голос
/ 29 сентября 2010

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

0 голосов
/ 05 апреля 2018

Для list.clear () нет преимущества перед новым XXList.Вот мое исследование для сравнения производительности.

            import java.util.ArrayList;
            import java.util.List;

            public class ClearList {


                public static void testClear(int m, int n) {
                    List<Integer> list = new ArrayList<>();
                    long start = System.currentTimeMillis();

                    for (int i = 0; i < m; i++) {
                        for (int j = 0; j < n; j++) {
                            list.add(Integer.parseInt("" + j + i));
                        }
                        list.clear();
                    }

                    System.out.println(System.currentTimeMillis() - start);
                }

                public static void testNewInit(int m, int n) {
                    List<Integer> list = new ArrayList<>();
                    long start = System.currentTimeMillis();

                    for (int i = 0; i < m; i++) {
                        for (int j = 0; j < n; j++) {
                            list.add(Integer.parseInt("" + j + i));
                        }
                        list = new ArrayList<>();
                    }

                    System.out.println(System.currentTimeMillis() - start);
                }

                public static void main(String[] args) {
                    System.out.println("clear ArrayList:");
                    testClear(991000, 100);
                    System.out.println("new ArrayList:");
                    testNewInit(991000, 100);
                }

            }


            /*--*
             * Out:
             *
             * clear ArrayList:
             * 8391
             * new ArrayList:
             * 6871
            */
...