Deque Interface =============== -> Deque interface is the sub type of Queue Interface. -> Deque Interface can be extended from Queue Interface. Syntax: public Deque extends Queue{ } -> Deque Interface is present in "java.util" package. -> Deque ==> Double Ended Queue -> Deque can have two pointers in both sides. Here: we can add or remove elements from either side. -> Deque can be defined in two ways: 1) using ArrayDequeue class 2) using LinkedList class -> To create the Deque object as not thread safe, we can use "ArrayQueue" class for the creation of Deque Object. -> To create the Deque object as thread safe, we can use "LinkedList" class for the Deque object creation. Creation of Deque using Array Deque: ==================================== package pack1.p1.p01; import java.util.ArrayDeque; import java.util.Deque; public class MainClass { public static void main(String[] args) { // Creating the Deque Object using ArrayQueue Deque dq = new ArrayDeque<>(); // adding of elements dq.add("Java"); dq.addFirst("Springboot"); dq.addLast("Micro Services"); System.out.println("The Given Deque = "+dq); dq.remove("Java"); // dq.removeLast(); dq.removeFirst(); System.out.println("After the delete operation, the Deque = "+dq); } } Hierarchy of Deque: =================== Iterable Interface <=========== Collection interface <============ Queue Interface extends extends Queue <=============== PriorityQueue class implements Queue <================ Deque extends Deque <============== ArrayDeque class implements Deque <============== LinkedList class implements Creation of Deque using LinkedList: =================================== add(): ===== can add element into the Deque at the end addFirst(): =========== can add element into the Deque at the beginning of the Deque addLast(): ========== can add element at the last of the Deque push(): ======= can add element at the beginning of the Deque offer(): ======== can add element at the last. remove(): ========= can remove the element of the Deque from the beginning by default. remove(element): ================ can remove the specified element from the Deque. return "true", when the specified element is present in the Deque and remove that element. return "false", when the specified element is not in the Deque removeFirst(): ============= Remove and return the first element of the Deque removeLast(): ============= Remove and return the last element of the Deque Note: ===== When we can use remove operations on the empty Deque, we can get "NoSuchElementException" from JVM. package pack1.p1.p01; import java.util.Deque; import java.util.LinkedList; public class Main { public static void main(String[] args) { Deque d = new LinkedList<>(); // adding of elements // d.add(null); d.add("Element 1(Tail)"); d.addFirst("Element 2(Head)"); d.addLast("Element 3(Tail)"); d.push("Element 4(Head)"); d.offer("Element 5(Tail)"); System.out.println(d); // System.out.println(d[0]); // removing elements from Deque System.out.println(d.remove()); System.out.println(d.remove("Element 3(Tail)")); System.out.println(d.removeFirst()); System.out.println(d.removeLast()); System.out.println(d.removeAll(d)); System.out.println(d); // d.remove(); } } ========================================================= Iteration on Deque: ================== package pack1.p1.p01; import java.util.Deque; import java.util.Iterator; import java.util.LinkedList; public class Main { public static void main(String[] args) { Deque d = new LinkedList<>(); // adding of elements // d.add(null); d.add("Element 1(Tail)"); d.addFirst("Element 2(Head)"); d.addLast("Element 3(Tail)"); d.push("Element 4(Head)"); d.offer("Element 5(Tail)"); // iteration using iterator object // Iterator it = d.iterator(); // while(it.hasNext()) { // System.out.println(it.next()); // } for(Iterator it = d.iterator();it.hasNext();) { System.out.println(it.next()+" "); } } } ============================================================ package pack1.p1.p01; import java.util.Deque; import java.util.LinkedList; public class BrowserHistory { private Deque backStack = new LinkedList<>(); private Deque forwardStack = new LinkedList<>(); private String currentPage = "home"; public void visit(String page) { backStack.push("currentPage"); currentPage = page; forwardStack.clear(); System.out.println("Visited = "+currentPage); } public void back() { if(!backStack.isEmpty()) { forwardStack.push(currentPage); currentPage = backStack.pop(); System.out.println("Back To:"+currentPage); } } public void forward() { if(!forwardStack.isEmpty()) { backStack.push(currentPage); currentPage = forwardStack.pop(); System.out.println("Forward To:"+currentPage); } } public static void main(String[] args) { BrowserHistory bh = new BrowserHistory(); bh.visit("page1"); bh.visit("page2"); bh.back(); bh.back(); bh.forward(); } }