Java Notes
Learn Java ArrayDeque from scratch — what a double-ended queue is, how ArrayDeque works internally, using it as a stack and queue, method differences, and common mistakes with full explanations.
Agar tumne kabhi books ki stack dekhi ho — sabse pehle rakhi book sabse neeche hoti hai, sabse baad mein rakhi book sabse upar. Aur tum hamesha sabse upar waali book uthate ho. Yahi Stack (LIFO) hai.
Ab socho ek queue — bank mein log line mein khade hain. Jo pehle aaya wo pehle serve hota hai. Yahi Queue (FIFO) hai.
ArrayDeque ek aisi data structure hai jo dono kaam kar sakti hai. "Deque" ka matlab hai Double-Ended Queue — iska matlab tum elements ko dono taraf se add aur remove kar sakte ho. Aur "Array" ka matlab hai — internally ye ek array use karta hai, linked list nahi. Isliye ye fast hai.
ArrayDeque kya hota hai physically?
Socho ek circular conveyor belt — jaise airport pe bags lete hain. Tum bag ko aage bhi laga sakte ho, peeche bhi. Aur aage se bhi utha sakte ho, peeche se bhi. Yahi ArrayDeque hai.
Internally Java ek resizable array rakhta hai. Jab array full hota hai, Java ek bada array banata hai aur sab kuch copy kar deta hai — exactly ArrayList ki tarah.
Kab use karein ArrayDeque?
- Jab Stack chahiye (LIFO) —
Stackclass se zyada fast hai - Jab Queue chahiye (FIFO) —
LinkedListse zyada fast hai - Jab dono ends pe kaam karna ho
Kab nahi use karein?
- Jab
nullstore karna ho — ArrayDeque null allow nahi karta - Jab thread-safety chahiye — ArrayDeque synchronized nahi hai
ArrayDeque as a Stack — LIFO
Stack ka concept: Last In, First Out. Jo element aakhir mein aaya, wo pehle bahar jaata hai. Jaise plates ki stack — upar se leni hai, upar pe rakhni hai.
Try it in WoHoCode
Edit the program, then run it here.
Run this example to see its output.
Har line ka matlab:
stack.push("First")—push()matlabaddFirst()— element ko sabse aage daalo. Yahan First gaya, phir Second aage aaya, phir Third aage aaya.stack.peek()— Sabse aage wala element dekho, nikalo mat. Bilkul waise jaise stack ke upar waali book ka title padho bina uthaye.stack.pop()— Sabse aage wala element nikalo aur return karo. Ek baar pop hua, to woh element gone — stack se hamesha ke liye nikal gaya.- Order: Third pehle push hua last mein, to pop mein Third pehle aayega. Yahi LIFO hai.
Real example kahan aata hai stack?
- Browser ka back button — jo page last mein visit kiya wo pehle back hota hai
- Text editor ka Ctrl+Z (undo) — jo kaam last mein kiya wo pehle undo hota hai
- Function calls — jo function last mein call hua wo pehle return karta hai
ArrayDeque as a Queue — FIFO
Queue ka concept: First In, First Out. Jo element pehle aaya, wo pehle bahar jaata hai. Jaise bank ki queue — jo pehle line mein lagaa wo pehle serve hoga.
Try it in WoHoCode
Edit the program, then run it here.
Run this example to see its output.
Har line ka matlab:
queue.offer("Customer A")—offer()matlabaddLast()— element ko sabse peeche daalo. Queue ke end mein lagao.queue.peek()— Queue ke sabse aage wala dekho (wo jo next serve hoga), par nikalo mat.queue.poll()— Queue ke sabse aage wala nikalo aur return karo. Wo element gone.queue.isEmpty()— Check karo queue khali hai ya nahi, warnapoll()nullreturn karta hai.
offer() vs add(): Dono element add karte hain. Difference: agar queue full ho (kuch specific Queue types mein), add() exception throw karta hai, offer() false return karta hai. ArrayDeque ke liye koi fark nahi — dono same kaam karte hain.
poll() vs remove(): Dono element nikaalte hain. Difference: queue khali ho to remove() exception throw karta hai, poll() null return karta hai. Production code mein poll() safer hai.
ArrayDeque as a Deque — Dono Ends
Jab tumhe dono taraf se add/remove karna ho — jaise sliding window, palindrome check, ya browser history:
Try it in WoHoCode
Edit the program, then run it here.
Run this example to see its output.
Jab aage se add karo: naya element sabse pehle wali position pe aa jaata hai, baaki sab ek jagah peeche shift ho jaate hain (conceptually).
Jab peeche se add karo: naya element last position pe jaata hai.
Kab Deque use karte hain dono ends ke liye?
- Palindrome check karna ho — aage aur peeche ka compare karo
- Sliding window maximum problem
- Browser history (back = removeFirst se purana page, forward = addFirst)
Method Table — Saare Methods Ek Jagah
ArrayDeque ke methods confuse karte hain kyunki same kaam ke liye multiple names hain. Yaha clear karta hoon:
| Kaam | Aage (First) | Peeche (Last) |
|---|---|---|
| Add karo | addFirst() / offerFirst() / push() | addLast() / offerLast() / offer() / add() |
| Remove karo | removeFirst() / pollFirst() / pop() / poll() | removeLast() / pollLast() |
| Dekho (remove mat) | peekFirst() / peek() / getFirst() | peekLast() / getLast() |
add/remove/get waale: Khaali hone par Exception throw karte hain.
offer/poll/peek waale: Khaali hone par null ya false return karte hain — safer hain.
Stack use karo to yaad rakho: push() = addFirst(), pop() = removeFirst(), peek() = peekFirst()
Queue use karo to yaad rakho: offer() = addLast(), poll() = removeFirst(), peek() = peekFirst()
ArrayDeque vs Stack vs LinkedList
Stack class kyu avoid karein? Stack class Java 1.0 ka hai. Iska har method synchronized hai — matlab har operation pe lock lagta hai. Single-threaded code mein ye bilkul unnecessary hai aur slow bana deta hai. ArrayDeque same kaam karta hai bina lock ke.
LinkedList kyu avoid karein queue ke liye? LinkedList mein har element ek "node" mein store hota hai jisme actual value ke saath previous aur next ka pointer bhi hota hai. Zyada memory use hoti hai aur CPU cache efficiently kaam nahi karta. ArrayDeque ek plain array use karta hai — CPU cache ke saath accha kaam karta hai, faster hota hai.
| ArrayDeque | Stack (legacy) | LinkedList | |
|---|---|---|---|
| Thread-safe | Nahi | Haan (slow) | Nahi |
| Null allow | Nahi | Haan | Haan |
| Performance | Fastest | Slowest | Middle |
| Stack ke liye | ✅ Prefer karo | Legacy only | Possible |
| Queue ke liye | ✅ Prefer karo | ❌ | Possible |
| Dono ends | ✅ | ❌ | ✅ |
Common Mistake 1: Null Store Karne Ki Koshish
Deque<String> deque = new ArrayDeque<>();
deque.add(null); // NullPointerException — null allowed nahi
// Agar null store karna hai to LinkedList use karo:
java.util.LinkedList<String> list = new java.util.LinkedList<>();
list.add(null); // allowedArrayDeque internally null ko special sentinel value ki tarah use karta hai isliye null elements allow nahi karta.
Common Mistake 2: pop() Khaali Deque Par
Deque<Integer> deque = new ArrayDeque<>();
deque.pop(); // NoSuchElementException — deque khali hai!
// Safe way:
if (!deque.isEmpty()) {
deque.pop();
}
// Ya poll() use karo jo null return karta hai khaali pe:
Integer val = deque.poll(); // null agar khaali hai, no exception
if (val != null) {
// use val
}Common Mistake 3: Stack Aur Queue Methods Mix Karna
Practice Task
Task: Ek number palindrome checker banao using ArrayDeque. User ek string of digits dega (jaise "1221" ya "1231"). Program dekhega ki wo palindrome hai ya nahi — ArrayDeque use karke, String methods use kiye bina.
Approach:
- String ke har character ko
ArrayDeque<Character>mein daalo - Ek loop chalaao:
removeFirst()aurremoveLast()— dono compare karo - Agar koi bhi mismatch mila — palindrome nahi
- Agar loop complete hua bina mismatch ke — palindrome hai
Hint: Jab deque mein 0 ya 1 element bacha ho to loop rok do. Even length mein 0 elements bachenge, odd length mein 1.
Solution:
Try it in WoHoCode
Edit the program, then run it here.
Run this example to see its output.
Kya observe karo:
deque.size() > 1— jab tak 2 ya zyada elements hain, compare karte raho. Ek element bacha to usse compare karne wala koi nahi — wo middle element hai odd length mein.removeFirst()aurremoveLast()— ye dono end se elements nikalte hain simultaneously. Deque shrink hoti jaati hai dono taraf se.- Try karo
"racecar"— 7 characters, middle'e'akela bachega, loop rok dega, true return karega. - Try karo
"hello"— 'h' vs 'o' mismatch — turant false.
Continue the lesson path