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, така че трябва да е лесно да се импортира и да се изпълнява както е.