Когда использовать Queue over ArrayList в Java?

Опубликовано: 6 Января, 2023

Список массивов:

  • ArrayList является частью Collection Framework и реализует интерфейс списка Java. Этот класс предоставляет методы для изменения размера списка в зависимости от потребностей.
  • Это позволяет иметь нулевые и повторяющиеся значения.
  • Список массивов похож на вектор в Java, за исключением того, что он не синхронизирован. Это не потокобезопасно, но быстрее, чем векторы.
  • Это упорядоченная коллекция , которая может вставлять элементы с помощью индексов.
  • ArrayList может содержать только объекты, но не может обрабатывать примитивные типы .

Операции, выполняемые в ArrayList:

  1. add() — вставить элемент в ArrayList
  2. clear() — удалить все элементы из списка.
  3. contains() — проверяет, присутствует ли элемент в списке.
  4. get() — возвращает индекс элемента.
  5. size() — возвращает размер списка.

Ниже приведен код, демонстрирующий реализацию ArrayList:

Преимущества ArrayList:

  1. Это очень быстро из-за его асинхронного поведения.
  2. Он поддерживает порядок, что означает, что новый элемент добавляется непосредственно в конец списка.
  3. При превышении ArrayList размер увеличивается только на 50%.
  4. Он динамичен по размеру

Недостатки ArrayList:

  1. ArrayList содержит только объекты, но не примитивные типы.
  2. Если элемент удаляется из массива, весь массив сдвигается для обновления списка, что приводит к потере памяти.
  3. Данные расположены последовательно, для больших списков требуется больший непрерывный блок памяти.

Очередь:

  • Очередь — это абстрактный линейный тип данных, который следует принципу FIFO (первым поступил — первым обслужен).
  • Очередь может ставить элементы в очередь на заднем конце и удалять элементы из очереди на переднем конце.
  • Java имеет интерфейс очереди, который является частью структуры коллекции.

Операции, выполняемые в очереди:

  1. enqueue(): добавляет элемент или данные в очередь.
  2. dequeue(): Dequeue удаляет элемент из очереди.
  3. peek(): эта функция получает элемент впереди, не удаляя его.
  4. isfull(): проверяет, заполнена ли очередь.
  5. isempty(): эта функция проверяет, пуста ли очередь.

Ниже представлена реализация Queue в Java:

Преимущества очереди:

  1. Очередь имеет два конца, один для вставки, другой для удаления.
  2. Постановка в очередь и удаление из очереди занимают всего O(1) раз.
  3. Очереди гибкие
  4. Это полезно для управления многочисленными потребностями пользователей.

Недостатки очереди:

  1. Вставка и удаление элементов из середины сложны.
  2. Размер ограничен и определен заранее.
  3. Новый элемент не может быть вставлен, когда очередь заполнена, старый элемент необходимо удалить, чтобы вставить новый.
  4. Память используется неэффективно, так как когда мы удаляем элемент, память которого снова не используется в линейной очереди, это можно преодолеть с помощью циклической очереди.

Когда использовать очереди над ArrayList?

  • Очереди эффективно используются , когда их размер заранее определен , так как невозможно увеличить размер очереди динамически.
  • Когда операции удаления и вставки элементов в середине списка нет , ее легко реализовать с помощью очередей, так как она может вставлять и удалять элементы в конце со сложностью O(1).
    • Например, в кассе торгового центра неудобно работать с ArrayList, когда клиенты из середины приходят для выставления счетов. Вместо этого использование структуры данных очереди является понятным и удобным для выставления счетов. Как мы знаем, используя очередь, мы должны следовать FIFO, чтобы первый клиент получил счет первым без каких-либо осложнений. При использовании ArrayList есть вероятность, что он может добавлять или удалять элементы из середины списка. Использование очередей для таких сценариев может помочь в лучшей оптимизации и параллелизме.
    • Из приведенного выше примера мы можем сделать вывод, что мы должны использовать очередь, когда мы хотим, чтобы элементы работали по порядку, в то время как мы должны использовать ArrayList, когда нам нужны данные из середины списка, а размер не задан заранее.
  • Стеки и очереди реализованы с использованием списков, но вставка и удаление элементов ограничены только концами.
  • Очереди используются, когда несколько объектов хотят использовать «ресурс», но только один объект может использовать ресурс одновременно .