Инициализация ArrayList с новым оператором в Java? - PullRequest
4 голосов
/ 27 августа 2010

Как лучше всего инициализировать ArrayList в Java?

Если я инициализирую ArrayList с помощью оператора new, то ArrayList по умолчанию будет иметь память, выделенную для 10 сегментов.Что является ударом по производительности.

Я не знаю, возможно я ошибаюсь, но мне кажется, что я должен создать ArrayList, упомянув размер, если я уверен в размере!

Ответы [ 8 ]

5 голосов
/ 27 августа 2010

Это удар по производительности.

Я бы не стал беспокоиться о "падении производительности".Создание объектов в Java очень быстро.Разница в производительности вряд ли будет измеряться вами.

Во что бы то ни стало, используйте размер, если вы его знаете.Если вы этого не сделаете, с этим ничего не поделаешь.

То, что вы здесь делаете, называется «преждевременной оптимизацией».Дональд Кнут говорит, что это корень всего зла.

Лучший подход - заставить ваш код работать, прежде чем вы сделаете его быстрым.Оптимизируйте, используя данные, которые сообщают вам, где ваш код медленный.Не угадайте - вы, вероятно, ошибаетесь.Вы обнаружите, что редко знаете, где находятся узкие места.

3 голосов
/ 27 августа 2010

Это лучший совет, который я могу вам дать:

  • Не беспокойтесь об этом.Да, у вас есть несколько вариантов создания ArrayList, но использование new, опция по умолчанию , предоставляемая библиотекой, не является выбором BAD , в противном случае это 'Было бы глупо сделать этот выбор по умолчанию для всех, не уточняя, что лучше.
  • Если окажется, что это проблема, вы быстро обнаружите ее, когда будете в профиле.Это подходящее место для поиска проблем, когда вы профилируете свое приложение для проблем с производительностью / памятью.Когда вы впервые пишете код, вы не беспокоитесь об этом - это преждевременная оптимизация - вы просто беспокоитесь о написании хорошего, чистого кода с хорошим дизайном.
  • Если ваш дизайн хорош, вам следуетбыть в состоянии решить эту проблему в кратчайшие сроки, с небольшим воздействием на остальную часть системы. Effective Java 2nd Edition, Item 52: Ссылки на объекты по их интерфейсам .Вы даже можете переключиться на LinkedList или любой другой вид List, если это окажется лучшей структурой данных.Дизайн для такой гибкости.
  • Наконец, Effective Java 2nd Edition, Item 1: Рассмотрим статические фабричные методы вместо конструкторов .Вы даже можете комбинировать это с Элемент 5: Избегайте создания ненужных объектов , если на самом деле новые экземпляры на самом деле не нужны (например, Integer.valueOf не всегда создает новыйэкземпляр).

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


Вкл. ArrayList Микроуправление

Вот несколько конкретных советов, если вам нужно микроуправление ArrayList:

  • Вы можете использовать ArrayList(int initialCapacity), чтобы установить начальную емкость списка.При необходимости список будет автоматически превышать эту емкость.
  • Когда вы собираетесь заполнить / добавить к ArrayList, и вы знаете, сколько будет общее количество элементов, вы можете использовать ensureCapacity(int minCapacity) (или непосредственно конструктор выше), чтобы уменьшить количество промежуточного роста.Каждый add будет работать в амортизированном постоянном времени независимо от того, делаете ли вы это (как гарантировано в API), поэтому это может только снизить стоимость на постоянный коэффициент.
  • Вы можете trimToSize() для минимизации использования хранилища.

Этот вид микроуправления, как правило, не нужен, но если вы решите (что подтверждается убедительными результатами профилирования), что это стоит хлопот, вы можете сделать это.so.

См. также

  • Collections.singletonList - Возвращает неизменный список, содержащий только указанный объект.
3 голосов
/ 27 августа 2010

Если вы знаете, сколько элементов вы добавите, инициализируйте ArrayList с правильным количеством объектов.Если нет, не беспокойтесь об этом.Разница в производительности, вероятно, незначительна.

1 голос
/ 27 августа 2010

Если вы не знаете размер ArrayList, то вам, вероятно, лучше использовать LinkedList, поскольку операция LinkedList.add() - это постоянная скорость.здесь уже говорилось, что вам не следует беспокоиться о скорости, прежде чем выполнять какое-либо профилирование.

Вы можете использовать эту старую, но хорошую (на мой взгляд) статью для справки.http://chaoticjava.com/posts/linkedlist-vs-arraylist/

1 голос
/ 27 августа 2010

Вам не нужно указывать начальный размер ArrayList.Вы всегда можете легко добавить / удалить любой элемент из него.

Если это вопрос производительности, имейте в виду следующее:

  1. Инициализация ArrayList очень быстрая.Не беспокойтесь об этом.
  2. Добавление / удаление элемента из ArrayList также очень быстро.Не беспокойтесь об этом.
  3. Если ваш код работает слишком медленно.Первым виноват твой алгоритм, без обид.Спецификации машины, ОС и язык действительно участвуют тоже.Но их участие считается незначительным по сравнению с вашим алгоритмом участия.
1 голос
/ 27 августа 2010

Если вы уже знаете размер вашего ArrayList (приблизительно), вы должны использовать конструктор с емкостью.Но в большинстве случаев разработчики на самом деле не знают, что будет в Списке, поэтому при емкости 10 для большинства случаев этого должно быть достаточно.

10 сегментов - это приблизительное значение, а неснижение производительности, если вы уже не знаете, что ваш ArrayList содержит тонны элементов, в этом случае необходимость изменения размера массива все время будет снижением производительности.

0 голосов
/ 27 августа 2010

Если вам действительно важно, вы можете вызвать trimToSize () , как только вы построите и заполните объект.Javadoc утверждает, что емкость будет по крайней мере такой же, как размер списка .Как указывалось ранее, маловероятно, что вы обнаружите, что память, выделенная для ArrayList, является узким местом для производительности, и если бы это было так, я бы рекомендовал использовать вместо этого массив.

0 голосов
/ 27 августа 2010

Поскольку ArrayList реализуется массивом , лежащим в основе , мы должны выбрать начальный размер для массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...