Feedback Form

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 बनी रहती है।