Можем ли мы заменить ArrayList на ArrayDeque для лучшей производительности? - PullRequest
0 голосов
/ 13 февраля 2020

Я читал руководство Кэти Сьерры по OCP8 и нашел строчку, которая говорит:

«ArrayDeque похож на ArrayList с лучшей производительностью»

Теперь я запутался где использовать ArrayList и где использовать ArrayDeque. Я также знаю, что размер ArrayDeque всегда изменяется до степени 2. При изменении размера емкость удваивается, поэтому в некоторых случаях это может привести к снижению производительности. Но я хочу знать, что предпочтительнее между ними. Помощь очень ценится.

1 Ответ

1 голос
/ 13 февраля 2020

Я бы предложил использовать ArrayList вместо ArrayDeque в следующих случаях

  1. Используйте ArrayList, если вам нужен доступ к элементам по индексу, и вам нужно только вставить / удалить в конце.
  2. Использование ArrayDeque в качестве стека, очереди или очереди.

Вставка и удаление в обеих коллекциях.

ArrayList:

В худшем случае O (n), потому что вы должны сместить элементы. Вставка / удаление в конце происходит быстрее, потому что элементов меньше для смещения. Если вы вставляете, когда Arraylist заполнен, вы должны скопировать элементы в новый больший массив, который является O (n).

  • Вставка в конце ArrayList занимает амортизированное постоянное время. Это означает, что последовательность из n вставок в изначально пустой ArrayList имеет время выполнения в наихудшем случае O (n), поэтому среднее время выполнения для вставки равно O (1), хотя некоторые вставки могут быть медленнее. Это достигается путем постоянного увеличения размера массива на постоянный коэффициент, поскольку общее количество копируемых элементов является суммой геометрического ряда.

ArrayDeque:

  • Удаление спереди или сзади равно O (1), а вставка спереди или сзади занимает амортизированное постоянное время. Реализация JCF не позволяет вставлять / удалять по индексу (если бы это было разрешено, это было бы наихудшим O (n) из-за сдвига).
  • У запросов массива нет ограничений по емкости, и они растут по мере необходимости для поддержка использования.
  • Они не являются поточно-ориентированными, что означает, что при отсутствии внешней синхронизации
  • Нулевые элементы запрещены в ArrayDeque.

теперь ответ на ваш вопрос , Это полностью зависит от ваших требований. После анализа вы можете легко предсказать.

для более подробной информации, пожалуйста, взгляд

...