2013-12-24 1 views
2

Как разработчик, все, кто их позаботился, столкнулись с требованием, когда вам нужна изменчивая коллекция, где вы можете добавлять, удалять, извлекать (FIFO).Почему список предпочтительнее для очередей?

В каждом приложении я вижу использование List (ArrayList), чтобы удовлетворить это требование, но мой вопрос, почему разработчик не подходит для очереди (возможно, ArrayDeque). В соответствии с моим текущим пониманием я нахожу как ArrayList (List), так и ArrayDeque (Queue) одинаково хорошими для требования, которое я изложил. Но все же я никогда не видел очереди в своей карьере , всегда нахожу только Список.

Так что мой вопрос в том, почему очередь не является предпочтительной над списком. Я уверен, что должна быть какая-то причина, но почему-то мне не хватает понимания ?

Update: - здесь мои четкие требования

1) Добавление происходит в конце и должен быть fast.Probably O (1)

2) Итерация должна быть быстрой

3) поиск и удаление любого конкретного элемента должны быть быстрее.

Выполняя вышеуказанные требования, я думаю, что Arralist имеет смысл над ArrayDeque. Вот моя точечная причина

1) И как Arraylist, так и ArrayDeque будет O (1). Правильно?

2) Итерационные характеристики будут одинаковыми для обоих, так как это будет на основе индекса. Индекс ArrayDeque будет основываться на отметке времени, тогда как для пользователя arraylist можно явно указать индекс. Правильно?

3) Это будет O индекс ом (1) для обоих в качестве поиска будет происходить на основе

+0

Связанный (я действительно искал его, потому что думал, что я вспомнил дубликат): [Почему типичные реализации списка массивов не являются двукратными?] (Http://stackoverflow.com/q/6147618/319403) – cHao

ответ

1

Я предпочитаю использовать любые ссылки даст мне минимальный набор функциональных возможностей, что нужно для простой миграции, если я изменю реализации ,

Если мне просто нужно добавлять и удалять, я могу просто сделать

Collection<T> myCol = new // pick any implementation 

Если мне нужно, чтобы получить их в порядке их поступления, я не буду использовать List, потому что интерфейс List не имеет методов для вытаскивая самый старый. У него есть метод для popping index 0, но это не то же самое. Если мне нужен FIFO-заказ, я должен подать в отставку, используя ссылку Очередь.

Queue<T> myQueue = new // pick any implementation 

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

ArrayDeque<T> myQueue = new ArrayDeque<T>(); // yuck! don't use a concrete reference! 

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

+0

corsiKlause Ho Ho Ho. Пожалуйста, см. Мой обновленный пост и любезно сообщите мне свои мысли об этом –

+0

Я думаю, что если мне нужно получить FIFO, я должен использовать Queue, но если я хочу, чтобы индекс мудрого времени я должен использовать List .Is, что правильно? –

+0

Звучит правильно. Если вам нужно только удалить REMOVAL с концов, рассмотрите 'CircularArrayQueue' - нет реализации Java по умолчанию, но есть возможности, доступные для поиска в Интернете. – corsiKa

1

Если вы только собираетесь получить доступ к концам своей коллекции, то ArrayList и ArrayDeque будут по существу иметь одинаковую функциональность. Если ваша цель состоит в том, чтобы ограничить использование коллекции FIFO, я бы сказал, что вам лучше просто использовать очередь, так как deque позволит расширять и сокращать с обоих концов (а не FIFO).

С другой стороны, если вам интересно использовать ArrayDeque для лучшей производительности, чем ArrayList, я думаю, что они эквивалентны. Оба должны будут изменять размер, когда им нужно больше места, и доступ к любому индексу все еще остается постоянным (хотя вы бы ограничивали его FIFO). Если производительность является проблемой, вы можете получить повышение производительности из-за использования «круговой очереди», где очередь может обернуться вокруг индекса N и снова запустить с нулевым индексом (что не позволяет вам изменять размер так часто из-за удаления, когда размер по-прежнему меньше емкости).

Другим преимуществом реализации массива является лучшая промаха или хитов кэша, что является хорошим перком.

0

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