Являются массивами быстрее, чем arraylist?

Моя интуиция говорит, что массивы быстрее, чем arraylist, потому что arraylists реализованы с использованием массивов, которые изменяют размер, когда они заполняют/теряют элементы.

Я просто хотел подтвердить, верно это или нет, подразумевая, что никогда не будет причины использовать arraylist, если вы знаете количество элементов, которые вы хотите сохранить.

Ответ 1

Любая разница в производительности будет незначительной, особенно если вы инициализируете своего arraylist с помощью initialCapacity. Создайте свой код любым способом, который сделает его наиболее читаемым и поддерживаемым, и постарайтесь не оптимизировать такие вещи, если вы не определили через тестирование, что вы получаете значительное повышение производительности.

Потенциальные причины использования ArrayList:

  • полезные методы (contains и т.д.)
  • реализует Iterable, Collection и List и поэтому может использоваться во многих вызовах API, которые основаны на интерфейсах.
  • хотя вы в настоящее время "знаете", что размер вашей коллекции никогда не изменится, жизнь вызывает у нас неожиданные требования. Зачем блокировать себя в шаблоне, когда нет заметного преимущества, которое можно получить?

Ответ 2

ArrayList предоставляет вам множество функций, которые не имеют массив raw. Если вы знаете количество элементов, вы можете создать ArrayList этого размера.

new ArrayList<String>(100);

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

Не поддавайтесь преждевременной оптимизации. Это навредит вашему коду. Большинство вещей не имеет значения, только некоторые вещи делают. Вы можете найти только те немногие вещи, профилировав свой код. Попытка сделать каждую часть быстрой - очень неэффективный способ сделать все быстро. Сохранение чистой, простой конструкции намного более эффективно. Это даст вам необходимые швы для внедрения оптимизаций в одном или двух местах, в которых они действительно необходимы.

Ответ 3

ArrayList не может быть быстрее при простом get/set, но разница будет очень маленькой и, вероятно, не стоит беспокоиться практически в любом реалистичном сценарии.

API List имеет некоторые методы, которые могут вам понадобиться, даже если вы уже знаете, что размер будет исправлен. Например, подумайте contains(). Вы также должны использовать ArrayList в том случае, если вам нужно, чтобы Iterator или API нуждался в List - снова, даже если вы знаете, что список имеет фиксированный размер.

Ответ 4

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

Да, существует разница в производительности из-за дополнительных затрат на доступ, что не будет значительным в целом. Исключение из этого общего правила заключается в том, что вы сохраняете примитивные типы внутри вашего ArrayList. Это будет означать значительный успех, поскольку он преобразует объекты в/из Object и примитивных типов.

// easier to work with but slow
ArrayList<Double> slowList;

// faster primitive data array
double[] fasterList;

Ответ 5

Да, массивы намного быстрее. Вы можете заметить заметное ускорение, если вы выполняете численные алгоритмы.

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

Ответ 6

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

  • Я не знаю количества элементов или меняет много = > Список (не фиксировать на реализациях)

  • число элементов фиксировано заранее известным = > array

Ответ 7

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

Ответ 8

Массивы намного быстрее, чем список массивов. Разница может составлять сотни процентов и, вероятно, исходит из оптимизации JVM. Если вы объявите переменные массива нестабильными, вы получите аналогичную производительность.