Lesson ১১৮ মিনিট পড়া

কালেকশন ফ্রেমওয়ার্ক (Collections Framework)

নমনীয় কিছু পাত্র বা কন্টেইনার, যেগুলো বড় বা ছোট হতে পারে এবং ডেটা গুছিয়ে রাখতে পারে

কালেকশন কেন প্রয়োজন? (Why Collections?)

অ্যারে (Arrays) বেশ উপকারী, কিন্তু এর একটি বড় সীমাবদ্ধতা হলো: নির্দিষ্ট আকার (fixed size)। যদি আপনি না জানেন যে আপনার কতগুলো আইটেম বা উপাদানের দরকার হবে, তখন কী করবেন? আপনি যদি কোনো ভ্যালু বা মানকে নম্বর বা ইনডেক্সের বদলে তার নাম দিয়ে দ্রুত খুঁজে নিতে চান, তখন কী করবেন? ঠিক এই জায়গাগুলোতেই কালেকশন ফ্রেমওয়ার্ক (Collections Framework) কাজে আসে।

একে আপনি আধুনিক কিছু কন্টেইনার বা পাত্রের একটি টুলবক্স হিসেবে ভাবতে পারেন:

  • ArrayList — এমন একটি অ্যারে যার আকার পরিবর্তন করা যায়। অনেকটা সেই জাদুর ব্যাগের মতো, আপনি যতই জিনিস ঢোকান না কেন এটি নিজের আকার বাড়িয়ে নিতে পারে।
  • LinkedList — নোডের (node) একটি শেকল। শুরু বা শেষ থেকে কোনো উপাদান যোগ করা বা মুছে ফেলার জন্য এটি দারুণ কাজ করে।
  • HashSet — এমন একটি ব্যাগ যেখানে কোনো জিনিসের ডুপ্লিকেট (duplicate) বা প্রতিলিপি রাখা যায় না। অনেকটা সেই অতিথি তালিকার মতো, যেখানে প্রত্যেকের নাম কেবলমাত্র একবারই থাকতে পারে।
  • HashMap — একটি ডিকশনারি বা অভিধান। চাবি বা কি (key) ব্যবহার করে মান বা ভ্যালুগুলো (value) খুঁজে বের করুন, ঠিক যেমন নাম দিয়ে কারো ফোন নম্বর খুঁজে পাওয়া যায়।

সবগুলো কালেকশনই জেনেরিকস বা generics (অ্যাঙ্গেল ব্র্যাকেটের ভেতরের <Type>) ব্যবহার করে, যাতে তারা কী ধরনের উপাদান ধারণ করছে তা নির্দিষ্ট করে দেওয়া যায়।

আপনার নিত্যদিনের সঙ্গী — অ্যারেলিস্ট (ArrayList — Your Go-To List)

import java.util.ArrayList;
import java.util.Collections;
public class Main {
public static void main(String[] args) {
ArrayList<String> fruits = new ArrayList<>();
// Add items
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Cherry");
fruits.add("Banana"); // duplicates are OK!
System.out.println("Fruits: " + fruits);
System.out.println("Size: " + fruits.size());
System.out.println("First: " + fruits.get(0));
// Remove by value
fruits.remove("Banana"); // removes first occurrence
System.out.println("After remove: " + fruits);
// Check if it contains something
System.out.println("Has Cherry? " + fruits.contains("Cherry"));
// Sort alphabetically
fruits.add("Avocado");
Collections.sort(fruits);
System.out.println("Sorted: " + fruits);
// Loop through
System.out.print("Each: ");
for (String f : fruits) {
System.out.print(f + " ");
}
System.out.println();
}
}
Output
Fruits: [Apple, Banana, Cherry, Banana]
Size: 4
First: Apple
After remove: [Apple, Cherry, Banana]
Has Cherry? true
Sorted: [Apple, Avocado, Banana, Cherry]
Each: Apple Avocado Banana Cherry

হ্যাশসেট এবং হ্যাশম্যাপ (HashSet & HashMap)

যখন আপনার কাছে অনন্য বা ইউনিক (uniqueness) হওয়াটা সবচেয়ে জরুরি, তখন একটি HashSet সবচেয়ে ভালো কাজ করে। নতুন কোনো ডুপ্লিকেট আইটেম যুক্ত করতে চাইছেন? এটি স্রেফ ওই আইটেমটিকে এড়িয়ে যাবে বা অগ্রাহ্য করবে। এটিকে ডাকটিকিট সংগ্রহের মতো ভাবতে পারেন — আপনি নিশ্চয়ই একই টিকিটের দুটো কপি রাখতে চাইবেন না।

একটি HashMap মূলত কি-ভ্যালু পেয়ার (key-value pairs) বা জোড়ায় জোড়ায় ডেটা সংরক্ষণ করে। এটি একদম সত্যিকারের ডিকশনারি বা অভিধানের মতোই: এর ভেতরের শব্দগুলো হলো চাবি বা কি (key) এবং এর অর্থগুলো হলো অবজেক্টের মান বা ভ্যালু (value)। আপনি কি (key)-এর সাহায্য নিয়ে জিনিসপত্র খুঁজে বের করতে পারেন এবং এটি অবিশ্বাস্য রকম দ্রুত কাজ করে — ডিকশনারির ভেতর এন্ট্রির সংখ্যা যতই হোক না কেন, এটি আপনাকে প্রায় সঙ্গে সঙ্গেই উত্তর দিয়ে দিতে পারে।

হ্যাশসেট — ডুপ্লিকেট চলবে না (HashSet — No Duplicates Allowed)

import java.util.HashSet;
public class Main {
public static void main(String[] args) {
HashSet<String> visitors = new HashSet<>();
visitors.add("Anika");
visitors.add("Rafi");
visitors.add("Anika"); // duplicate — ignored!
visitors.add("Sadia");
visitors.add("Rafi"); // duplicate — ignored!
System.out.println("Visitors: " + visitors);
System.out.println("Count: " + visitors.size()); // 3, not 5
System.out.println("Has Anika? " + visitors.contains("Anika"));
System.out.println("Has Dave? " + visitors.contains("Dave"));
visitors.remove("Rafi");
System.out.println("After removing Rafi: " + visitors);
// Great for removing duplicates from a list!
String[] words = {"cat", "dog", "cat", "bird", "dog", "cat"};
HashSet<String> unique = new HashSet<>();
for (String w : words) {
unique.add(w);
}
System.out.println("Unique words: " + unique);
}
}
Output
Visitors: [Anika, Rafi, Sadia]
Count: 3
Has Anika? true
Has Dave? false
After removing Rafi: [Anika, Sadia]
Unique words: [cat, bird, dog]

হ্যাশম্যাপ — কি-ভ্যালু পেয়ারের শক্তি (HashMap — The Power of Key-Value Pairs)

import java.util.HashMap;
public class Main {
public static void main(String[] args) {
HashMap<String, Integer> scores = new HashMap<>();
// Put key-value pairs
scores.put("Anika", 95);
scores.put("Rafi", 82);
scores.put("Sadia", 91);
// Get by key
System.out.println("Anika's score: " + scores.get("Anika"));
// Check if key exists
System.out.println("Has Rafi? " + scores.containsKey("Rafi"));
// Update a value
scores.put("Rafi", 88); // same key = replace value
System.out.println("Rafi's new score: " + scores.get("Rafi"));
// getOrDefault — safe lookup
System.out.println("Dave's score: " + scores.getOrDefault("Dave", 0));
// Loop through all entries
System.out.println("\nAll scores:");
for (String name : scores.keySet()) {
System.out.println(" " + name + ": " + scores.get(name));
}
// Count word frequency — classic HashMap pattern
String sentence = "the cat sat on the mat the cat";
HashMap<String, Integer> freq = new HashMap<>();
for (String word : sentence.split(" ")) {
freq.put(word, freq.getOrDefault(word, 0) + 1);
}
System.out.println("\nWord counts: " + freq);
}
}
Output
Anika's score: 95
Has Rafi? true
Bob's new score: 88
Dave's score: 0

All scores:
  Rafi: 88
  Anika: 95
  Sadia: 91

Word counts: {the=3, cat=2, sat=1, on=1, mat=1}
Note: কালেকশনগুলো সরাসরি int বা double এর মতো প্রিমিটিভ (primitive) টাইপগুলোকে ধারণ করতে পারে না। এর বদলে জাভা র‍্যাপার ক্লাস (wrapper classes) ব্যবহার করে: যেমন Integer, Double, Boolean ইত্যাদি। জাভা স্বয়ংক্রিয়ভাবেই এদের মধ্যে রূপান্তর করতে পারে (যাকে অটোবক্সিং বা autoboxing বলা হয়), তাই ArrayList<Integer> অনায়াসেই যেকোনো int মান বা ভ্যালুর সাথে সুন্দরভাবে কাজ করতে পারে।
চ্যালেঞ্জ

ছোট কুইজ

আপনি যখন কোনো HashSet-এ একটি ডুপ্লিকেট এলিমেন্ট বা উপাদান যুক্ত করার চেষ্টা করেন, তখন কী হয়?

পড়া চালিয়ে যান

Interfaces & Abstract ClassesGenerics