Java ArrayDeque: High-Performance Double-Ended Queue
Java ArrayDeque: High-Performance Double-Ended Queue
Introduction to Java ArrayDeque
Java में ArrayDeque एक बहुत ही powerful और flexible data structure है जो Double-Ended Queue (Deque) को represent करता है। इसका मतलब है कि हम elements को दोनों ends — front और rear — से insert और remove कर सकते हैं।
ArrayDeque, Java Collections Framework का हिस्सा है और यह java.util package में available है। यह Array की तरह continuous memory पर काम करता है लेकिन Queue की तरह behavior दिखाता है। इसकी performance LinkedList की तुलना में काफी बेहतर होती है क्योंकि यह memory efficient और faster operations देता है।
Definition and Concept
Deque का full form है “Double Ended Queue” — जिसका मतलब है कि इसमें elements को दोनों सिरों (front और rear) से insert और delete किया जा सकता है।
ArrayDeque class एक resizable array का implementation है जो Deque interface को implement करती है। इसमें null elements allow नहीं होते और यह thread-safe नहीं होती।
ArrayDeque की विशेषताएँ (Key Features)
- यह dynamic resizing array पर आधारित होती है।
- Fast insertion और deletion operations दोनों ends पर करती है।
- No capacity restriction होती — size automatically grow करता है।
- No null elements allow होते हैं।
- यह Stack और Queue दोनों की तरह use की जा सकती है।
Class Hierarchy
ArrayDeque class की hierarchy को नीचे दिया गया diagram अच्छी तरह समझाता है:
java.lang.Object
↳ java.util.AbstractCollection
↳ java.util.ArrayDeque
ArrayDeque implements: Serializable, Cloneable, Iterable, Collection, Deque
Syntax of ArrayDeque
ArrayDeque को define करने का syntax बहुत simple है:
ArrayDeque<Type> deque = new ArrayDeque<>();
Example:
ArrayDeque<Integer> numbers = new ArrayDeque<>();
Constructors of ArrayDeque
ArrayDeque class में कुछ commonly used constructors available हैं:
| Constructor | Description |
|---|---|
ArrayDeque() | Default capacity (16) के साथ एक empty deque बनाता है। |
ArrayDeque(Collection<? extends E> c) | दिए गए collection के elements को जोड़कर एक नया deque बनाता है। |
ArrayDeque(int numElements) | एक specific initial capacity के साथ deque बनाता है। |
Important Methods of ArrayDeque
ArrayDeque class में insertion, deletion और retrieval के लिए बहुत सारे methods दिए गए हैं। नीचे कुछ commonly used methods की list है:
| Method | Description |
|---|---|
add(E e) | Element को tail में add करता है। |
addFirst(E e) | Deque के front में element insert करता है। |
addLast(E e) | Deque के end में element insert करता है। |
offer(E e) | Tail में element add करता है (return true/false)। |
offerFirst(E e) | Front में element add करता है। |
offerLast(E e) | End में element add करता है। |
remove() | Front element remove करता है। |
removeFirst() | पहला element हटाता है। |
removeLast() | अंतिम element हटाता है। |
peek() | Front element को return करता है बिना हटाए। |
peekFirst() | पहला element show करता है। |
peekLast() | अंतिम element show करता है। |
clear() | Deque से सभी elements remove करता है। |
size() | Deque का size return करता है। |
Example: Basic Operations on ArrayDeque
आइए एक simple example से समझते हैं कि ArrayDeque में elements कैसे add, remove और access किए जाते हैं।
import java.util.*;
public class ArrayDequeExample {
public static void main(String[] args) {
ArrayDeque<String> deque = new ArrayDeque<>();
deque.add("Java");
deque.addFirst("Python");
deque.addLast("C++");
deque.offer("C#");
System.out.println("Deque Elements: " + deque);
System.out.println("First Element: " + deque.peekFirst());
System.out.println("Last Element: " + deque.peekLast());
deque.removeFirst();
deque.removeLast();
System.out.println("After Removals: " + deque);
}
}
Output:
Deque Elements: [Python, Java, C++, C#] First Element: Python Last Element: C# After Removals: [Java, C++]
Using ArrayDeque as Stack
ArrayDeque को हम Stack के alternative के रूप में भी use कर सकते हैं क्योंकि यह LIFO (Last In First Out) behavior support करता है।
ArrayDeque<Integer> stack = new ArrayDeque<>();
stack.push(10);
stack.push(20);
stack.push(30);
System.out.println(stack.pop()); // 30
Note: ArrayDeque, Stack class से कहीं ज्यादा efficient है क्योंकि यह synchronized नहीं है और dynamic resizing करता है।
Using ArrayDeque as Queue
ArrayDeque को Queue की तरह भी use किया जा सकता है, यानी FIFO (First In First Out) structure में elements handle करना।
ArrayDeque<String> queue = new ArrayDeque<>();
queue.offer("A");
queue.offer("B");
queue.offer("C");
System.out.println(queue.poll()); // A
System.out.println(queue.peek()); // B
ArrayDeque vs LinkedList
नीचे दिए गए table में ArrayDeque और LinkedList के बीच तुलना की गई है:
| Feature | ArrayDeque | LinkedList |
|---|---|---|
| Memory Usage | कम memory लेता है | ज़्यादा memory लेता है (node-based structure) |
| Performance | Faster access (array-based) | थोड़ा धीमा |
| Null Values | Null elements allow नहीं | Null elements allow |
| Resizing | Automatically grow होता है | Dynamic nodes जोड़कर expand होता है |
| Thread Safety | Not synchronized | Not synchronized |
Advantages of ArrayDeque
- Faster insertion और removal operations।
- No memory overhead of nodes (जैसे LinkedList में होता है)।
- Resizing automatically handle होता है।
- Stack और Queue दोनों की functionality एक साथ provide करता है।
Limitations of ArrayDeque
- Null elements add नहीं किए जा सकते।
- Thread-safe नहीं है (multithreading में external synchronization चाहिए)।
- Capacity fixed नहीं होती, जिससे large data में resizing overhead हो सकता है।
Real-World Use Cases
- Undo/Redo operations (Stack behavior)।
- Browser history maintain करने के लिए।
- Task scheduling systems में (Queue behavior)।
- Tree और graph traversal algorithms में।
Time Complexity of ArrayDeque Operations
| Operation | Time Complexity |
|---|---|
| addFirst(), addLast() | O(1) |
| removeFirst(), removeLast() | O(1) |
| peekFirst(), peekLast() | O(1) |
| contains(Object o) | O(n) |
| Iteration | O(n) |
Important Points to Remember
- ArrayDeque null values accept नहीं करता।
- यह synchronized नहीं है, इसलिए multi-threaded environment में caution जरूरी है।
- Stack के मुकाबले performance बेहतर होती है।
- Memory overhead बहुत कम होता है क्योंकि यह array-based है।
Exam & Interview Notes (Quick Revision)
- ArrayDeque implements
Dequeinterface। - यह Stack और Queue दोनों को represent कर सकता है।
- Performance LinkedList से बेहतर होती है।
- Null elements allow नहीं करता।
- Insertion और Deletion दोनों ends पर O(1) time में होती है।
- Thread-safe नहीं है (unsynchronized)।
Final Quick Summary Notes for Exams
- Class: java.util.ArrayDeque
- Implements: Deque Interface
- Data Structure Type: Resizable Array
- Usage: Stack + Queue दोनों operations के लिए
- Complexity: Add/Remove – O(1)
- Thread Safety: Not synchronized
- Null Values: Not allowed
- Package: java.util