Introduction to ArrayDeque: Resizable Array-Backed Deque Implementation
Introduction to ArrayDeque: Resizable Array-Backed Deque Implementation
What is ArrayDeque?
ArrayDeque Java Collection Framework का एक बहुत ही useful और efficient class है जो double-ended queue (Deque) को implement करता है। इसका मतलब है कि आप elements को both ends (front और rear) से insert और remove कर सकते हैं।
यह class internally एक resizable array का उपयोग करती है — यानी जब array भर जाता है, तो इसका size अपने आप बढ़ जाता है। ArrayDeque Array और LinkedList दोनों के features का combination है लेकिन performance के मामले में यह दोनों से तेज़ होती है।
Key Features of ArrayDeque
- यह Resizable Array पर आधारित है, जो memory को dynamically manage करता है।
- Null elements को allow नहीं करता।
- ArrayDeque non-thread-safe है, यानी multi-threaded environment में synchronization की जरूरत होती है।
- यह Stack और Queue दोनों की तरह काम कर सकता है।
- यह ArrayList और LinkedList की तुलना में fast operations प्रदान करता है।
Class Declaration
ArrayDeque class java.util package में मौजूद है। इसका declaration कुछ इस प्रकार होता है:
public class ArrayDeque<E> extends AbstractCollection<E> implements Deque<E>, Cloneable, Serializable
Constructors of ArrayDeque
ArrayDeque के कुछ commonly used constructors इस प्रकार हैं:
| Constructor | Description |
|---|---|
ArrayDeque() |
एक खाली deque बनाता है जिसकी default capacity होती है। |
ArrayDeque(int numElements) |
निर्दिष्ट initial capacity के साथ एक deque बनाता है। |
ArrayDeque(Collection<? extends E> c) |
दिए गए collection के elements को शामिल करता है। |
Important Methods of ArrayDeque
ArrayDeque class में कई useful methods हैं जो insertion, deletion और retrieval operations के लिए इस्तेमाल किए जाते हैं:
Insertion Methods
add(E e)— element को tail (rear end) में add करता है।addFirst(E e)— element को front में जोड़ता है।addLast(E e)— element को end में जोड़ता है।offer(E e)— element को tail में add करता है और boolean return करता है।
Removal Methods
remove()— front से element remove करता है।removeFirst()— first element remove करता है।removeLast()— last element remove करता है।poll()— front से element remove करता है और अगर deque खाली हो तो null return करता है।
Access Methods
getFirst()— first element को return करता है लेकिन remove नहीं करता।getLast()— last element को return करता है लेकिन remove नहीं करता।peek()— front element को check करता है लेकिन remove नहीं करता।
Example of ArrayDeque in Java
अब एक simple example देखते हैं जिससे आप समझ पाएंगे कि ArrayDeque कैसे काम करता है।
import java.util.*;
public class ArrayDequeExample {
public static void main(String[] args) {
ArrayDeque<String> deque = new ArrayDeque<>();
// adding elements
deque.add("Ravi");
deque.add("Vijay");
deque.add("Ajay");
// adding element at front and end
deque.addFirst("Gaurav");
deque.addLast("Ramesh");
System.out.println("Elements in Deque: " + deque);
// removing elements
deque.removeFirst();
deque.removeLast();
System.out.println("After Removal: " + deque);
// accessing elements
System.out.println("First Element: " + deque.getFirst());
System.out.println("Last Element: " + deque.getLast());
}
}
Output:
Elements in Deque: [Gaurav, Ravi, Vijay, Ajay, Ramesh]
After Removal: [Ravi, Vijay, Ajay]
First Element: Ravi
Last Element: Ajay
How ArrayDeque Works Internally
ArrayDeque internally एक circular array के रूप में काम करता है। जब array भर जाता है, तो इसका size double हो जाता है और elements को automatically reposition किया जाता है ताकि front और rear properly manage रहें।
यह circular indexing का उपयोग करता है ताकि insertions और deletions fast हो सकें — मतलब front और rear दोनों operations O(1) time complexity में perform होते हैं।
ArrayDeque as Stack
ArrayDeque को आप Stack के रूप में भी use कर सकते हैं क्योंकि यह LIFO (Last In, First Out) principle को support करता है।
ArrayDeque<Integer> stack = new ArrayDeque<>();
stack.push(10);
stack.push(20);
stack.push(30);
System.out.println(stack.pop()); // 30
यहाँ push() element को top पर जोड़ता है और pop() उसे remove करता है। Stack operations O(1) time complexity में perform होते हैं।
ArrayDeque as Queue
Queue के रूप में use करने पर ArrayDeque FIFO (First In, First Out) principle follow करता है।
ArrayDeque<String> queue = new ArrayDeque<>();
queue.offer("A");
queue.offer("B");
queue.offer("C");
System.out.println(queue.poll()); // A
यहाँ offer() element को end में जोड़ता है और poll() front से remove करता है।
Time Complexity of ArrayDeque Operations
| Operation | Time Complexity |
|---|---|
| Insertion (add, offer) | O(1) |
| Deletion (remove, poll) | O(1) |
| Access (peek, getFirst, getLast) | O(1) |
| Search (contains) | O(n) |
Difference Between ArrayDeque and LinkedList
| Aspect | ArrayDeque | LinkedList |
|---|---|---|
| Internal Structure | Resizable Array | Doubly Linked List |
| Performance | Faster for insert/delete at both ends | Comparatively slower |
| Null Elements | Not allowed | Allowed |
| Memory Usage | Less memory overhead | More memory overhead due to node references |
Advantages of ArrayDeque
- यह Stack और Queue दोनों की functionality provide करता है।
- यह synchronized नहीं है, इसलिए single-threaded applications में यह बहुत fast है।
- Dynamic resizing के कारण यह memory efficient है।
- ArrayDeque null elements को reject करता है, जिससे data consistency बनी रहती है।
Limitations of ArrayDeque
- यह thread-safe नहीं है, यानी multi-threaded applications के लिए suitable नहीं है।
- Null elements को store नहीं कर सकता।
- Random access supported नहीं है।
When to Use ArrayDeque
- जब आपको Stack और Queue दोनों operations की जरूरत हो।
- जब high performance और fast insertion-deletion चाहिए।
- जब आप memory-efficient data structure चाहते हैं।
Important Points for Exam
- ArrayDeque एक Resizable array-based implementation है।
- यह Deque interface को implement करता है।
- Null elements allowed नहीं हैं।
- यह Stack और Queue दोनों की तरह काम कर सकता है।
- All basic operations O(1) time complexity में perform होते हैं।
ArrayDeque in Java 8 and Beyond
Java 8 और उसके बाद के versions में ArrayDeque को Streams और Lambda Expressions के साथ भी इस्तेमाल किया जा सकता है। आप deque elements पर iteration या filtering operations भी perform कर सकते हैं।
ArrayDeque<Integer> deque = new ArrayDeque<>(Arrays.asList(1,2,3,4,5));
deque.stream()
.filter(x -> x % 2 == 0)
.forEach(System.out::println);
Summary of ArrayDeque
- ArrayDeque fast, resizable और flexible data structure है।
- यह Stack और Queue दोनों की operations efficiently handle करता है।
- Insertion, deletion और access operations constant time (O(1)) में होते हैं।
- Null values की अनुमति नहीं है, जिससे reliability बनी रहती है।