Въведение в Java ArrayDeque

1. Общ преглед

В този урок ще ви покажем как да се използва на Java ArrayDeque клас - което е изпълнение на Deque интерфейс.

Един ArrayDeque (известен също като "Array Double Ended Queue", се произнася като "ArrayDeck") е специален вид на growable масив, който ни позволява да добавяте или премахвате елемент от двете страни.

Изпълнението на ArrayDeque може да се използва като стек (Last-In-First-Out) или опашка (First-In-First-Out).

2. API накратко

За всяка операция имаме основно две възможности.

Първата група се състои от методи, които хвърлят изключение, ако операцията се провали. Другата група връща състояние или стойност:

Операция Метод Изхвърляне на метод
Вмъкване от глава офертаПърва (д) addFirst (e)
Премахване от главата pollFirst () removeFirst ()
Извличане от Head peekFirst () getFirst ()
Вмъкване от опашката offerLast (e) addLast (e)
Отстраняване от опашката pollLast () removeLast ()
Извличане от Tail peekLast () getLast ()

3. Използване на методи

Нека разгледаме няколко прости примера за това как можем да използваме ArrayDeque .

3.1. Използване на ArrayDeque като стек

Ще започнем с пример за това как можем да се отнасяме към класа като стек - и да натиснем елемент:

@Test public void whenPush_addsAtFirst() { Deque stack = new ArrayDeque(); stack.push("first"); stack.push("second"); assertEquals("second", stack.getFirst()); } 

Нека също да видим как можем да пуснем елемент от ArrayDeque - когато се използва като стек:

@Test public void whenPop_removesLast() { Deque stack = new ArrayDeque(); stack.push("first"); stack.push("second"); assertEquals("second", stack.pop()); } 

В поп метод хвърля NoSuchElementException когато стека е празен.

3.2. Използване на ArrayDeque като опашка

Нека сега започнем с прост пример, показващ как можем да предложим елемент в ArrayDeque - когато се използва като обикновена опашка :

@Test public void whenOffer_addsAtLast() { Deque queue = new ArrayDeque(); queue.offer("first"); queue.offer("second"); assertEquals("second", queue.getLast()); } 

И нека видим как можем да анкетираме елемент от ArrayDeque , също когато се използва като Опашка :

@Test public void whenPoll_removesFirst() { Deque queue = new ArrayDeque(); queue.offer("first"); queue.offer("second"); assertEquals("first", queue.poll()); } 

Методът на анкета връща нулева стойност, ако опашката е празна.

4. Как е ArrayDeque Изпълнители

Под капака ArrayDeque е подкрепен от масив, който удвоява размера си, когато се запълни.

Първоначално масивът се инициализира с размер 16. Той се изпълнява като двойна опашка, където поддържа два указателя, а именно глава и опашка.

Нека видим тази логика в действие - на високо ниво.

4.1. ArrayDeque като стек

Както се вижда, когато потребител добавя елемент с помощта на метода push , той премества показалеца на главата по един.

Когато извадим елемент, той задава елемента в позицията на главата като нула, така че елементът да може да бъде събран боклук и след това премества показалеца за глава назад по един.

4.2. ArrayDeque като опашка

Когато добавяме елемент с помощта на метода offer , той премества указателя на опашката по един.

Докато когато потребителят анкетира елемент, той задава елемента в позицията на главата да е нула, така че елементът да може да се събира, и след това премества указателя за глава.

4.3. Бележки по ArrayDeque

И накрая, още няколко бележки, които си струва да разберете и запомните за това конкретно изпълнение:

  • Не е безопасно за нишки
  • Нулеви елементи не се приемат
  • Работи значително по-бързо от синхронизирания стек
  • Е по-бърза опашка от LinkedList поради по-доброто местоположение на референцията
  • Повечето операции имат амортизирана постоянна времева сложност
  • Един Итераторът завърна от ArrayDeque е безпогрешна бързо
  • ArrayDeque автоматично удвоява размера на масив, когато указателят за глава и опашка се срещат помежду си, докато добавяте елемент

5. Заключение

В тази кратка статия илюстрирахме използването на методите в ArrayDeque .

Изпълнението на всички тези примери може да бъде намерено в проекта GitHub; това е проект, базиран на Maven, така че трябва да е лесно да се импортира и да се изпълнява както е.