2015-04-11 4 views
14

Документация ArrayDeque говорит:ArrayDeque против ArrayList реализовать стек

Этот класс, вероятно, будет быстрее, чем стек при использовании в качестве стека, и быстрее, чем при использовании LinkedList как очереди.

Там нет упоминания о различии между использованием ArrayDeque в качестве стека и используя ArrayList. Вы можете использовать ArrayList в виде стека следующим образом.

list.add(object);      // push 
object = list.remove(list.size() - 1); // pop 

Я обнаружил, что, когда я использовал ArrayList только таким образом, его производительность хуже, чем ArrayDeque. Что объясняет это различие? Наверняка, это не просто вызовы size()? Внутренне, как ArrayList, так и ArrayDeque реализованы с использованием Object[], который при необходимости заменяется большим массивом, так что, конечно же, производительность должна быть примерно одинаковой?

+1

Хорошее объяснение здесь - HTTP : //stackoverflow.com/questions/6129805/what-is-the-fastest-java-collection-with-the-basic-functionality-of-a-queue –

+1

Измерение такой предположительно крошечной разницы в производительности Java очень сложно делай правильно. И ArrayDeque - лучшая абстракция в любом случае, чем ArrayList, поскольку он напрямую предлагает методы push и pop. –

+0

@ JBNizet Согласен. Я всегда буду использовать 'ArrayDeque'. Мне просто интересно понять, что такое 'ArrayDeque'. Как он может поддерживать быструю вставку и удаление с обоих концов и все же бить типы данных, которые не поддерживают это? –

ответ

6

Основное различие между обоими реализации является стратегия изменения размера

  • ArrayList изменяется на новый размер oldCapacity + (oldCapacity >> 1), что приводит к increse из ~ 50%. По умолчанию мощность составляет 10, в результате чего емкость после изменения размера составляет 15,22,33,49,73,109,163,244,366 ...

  • ArrayDeque всегда изменяется в зависимости от мощности 2. При изменении размера емкость удваивается. Начиная с 16-умолчанию, то resuling мощность после изменения размера является 32,64,128,256 ...

Так ArrayDeque достигает более высокую мощность с гораздо меньше размера операции, которые являются дорогостоящими из-за копию массива. То есть для хранения 256 в ArrayList по умолчанию, для этого требуется 9 вызовов с изменением размера, в то время как для ArrayDeque требуется только 4. Копирование массива может быть быстрым, но может также потребовать, чтобы GC освободил место для новых наборов данных, в дополнение к памяти (где ArrayDeque также может работать лучше из-за его согласования с мощностью-2).

Оба datastructures имеют самый случай сложность O (1) для выталкивания и поп через прямой доступ на любой head & tail (ArrayDequeue) соответственно добавлять и удалять (Last) size (ArrayList)

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