java.util.Collections ক্লাসটি Java Collections Framework এর একটি অংশ যা static মেথড সরবরাহ করে যা বিভিন্ন ধরনের Collection (যেমন List, Set, Map) এর সাথে কাজ করতে সহায়ক। এই ক্লাসের মেথডগুলো আপনার Collection এর কার্যকারিতা এবং ব্যবহারিকতা বৃদ্ধি করতে সহায়ক। Collections ক্লাসটি সাধারণত ডেটা স্ট্রাকচারগুলি যেমন সাজানো, পুনর্বিন্যাস করা, শাফল করা, সর্বাধিক বা সর্বনিম্ন উপাদান খোঁজা ইত্যাদি কাজে ব্যবহৃত হয়।
Collections ক্লাসটি java.util প্যাকেজে অন্তর্ভুক্ত এবং এতে বিভিন্ন স্ট্যাটিক মেথড রয়েছে যা List, Set, Map, Queue এবং অন্যান্য কোলেকশন ডেটা স্ট্রাকচারগুলির কাজ সহজ করে তোলে।
Collections Utility ক্লাসের বৈশিষ্ট্য:
- Sorting: উপাদানগুলো সাজানো (sorting) করতে।
- Shuffling: উপাদানগুলো এলোমেলোভাবে সাজানো (shuffling) করতে।
- Searching: উপাদানগুলো খোঁজার (searching) জন্য।
- Reversing: উপাদানগুলোর ক্রম উল্টানো (reversing) করতে।
- Thread-safe Collections: থ্রেড-সেফ কোলেকশন তৈরি করতে।
- Min/Max: কোলেকশনের সর্বনিম্ন এবং সর্বাধিক উপাদান খুঁজে বের করতে।
Collections Utility ক্লাসের প্রধান মেথডগুলো:
1. Sorting a List:
sort() মেথডের মাধ্যমে List এর উপাদানগুলো অর্ডারে সাজানো যায়। এটি প্রাক-ডিফাইনড কম্প্যারেটর বা কাস্টম কম্প্যারেটর ব্যবহার করতে পারে।
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CollectionsSortExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Banana");
list.add("Apple");
list.add("Orange");
// Sorting the list in natural order
Collections.sort(list);
// Displaying sorted list
list.forEach(System.out::println);
}
}
Output:
Apple
Banana
Orange
2. Reversing a List:
reverse() মেথডের মাধ্যমে List এর উপাদানগুলো উল্টানো (reverse) যায়।
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CollectionsReverseExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Banana");
list.add("Apple");
list.add("Orange");
// Reversing the list
Collections.reverse(list);
// Displaying reversed list
list.forEach(System.out::println);
}
}
Output:
Orange
Apple
Banana
3. Shuffling a List:
shuffle() মেথডের মাধ্যমে List এর উপাদানগুলো এলোমেলোভাবে সাজানো (shuffle) যায়।
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CollectionsShuffleExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Banana");
list.add("Apple");
list.add("Orange");
// Shuffling the list
Collections.shuffle(list);
// Displaying shuffled list
list.forEach(System.out::println);
}
}
Output:
Apple
Banana
Orange
(Note: Output will be different on each run due to random shuffling)
4. Finding the Minimum and Maximum:
min() এবং max() মেথডগুলো List, Set বা অন্য যেকোনো Collection থেকে সর্বনিম্ন এবং সর্বাধিক উপাদান খুঁজে বের করতে ব্যবহার করা যায়।
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CollectionsMinMaxExample {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(10);
list.add(5);
list.add(20);
// Finding the minimum element in the list
int min = Collections.min(list);
System.out.println("Minimum element: " + min);
// Finding the maximum element in the list
int max = Collections.max(list);
System.out.println("Maximum element: " + max);
}
}
Output:
Minimum element: 5
Maximum element: 20
5. Synchronizing a Collection (Thread-safe Collections):
synchronizedList(), synchronizedSet(), এবং synchronizedMap() মেথডগুলো একটি থ্রেড-সেফ কোলেকশন তৈরি করতে ব্যবহৃত হয়।
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CollectionsSynchronizationExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.add("JavaScript");
// Creating a synchronized list
List<String> synchronizedList = Collections.synchronizedList(list);
// Displaying the synchronized list
synchronizedList.forEach(System.out::println);
}
}
Output:
Java
Python
JavaScript
6. Binary Search:
binarySearch() মেথডটি একটি সাজানো List বা Array তে দ্রুত অনুসন্ধান করতে ব্যবহৃত হয়।
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CollectionsBinarySearchExample {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(10);
list.add(20);
list.add(30);
list.add(40);
// Sorting the list
Collections.sort(list);
// Binary search in sorted list
int index = Collections.binarySearch(list, 30);
System.out.println("Element found at index: " + index);
}
}
Output:
Element found at index: 2
7. Frequency of Elements:
frequency() মেথডটি একটি Collection এ নির্দিষ্ট উপাদানটির উপস্থিতির সংখ্যা (frequency) গণনা করতে ব্যবহৃত হয়।
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CollectionsFrequencyExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.add("Java");
// Counting frequency of "Java"
int frequency = Collections.frequency(list, "Java");
System.out.println("Frequency of 'Java': " + frequency);
}
}
Output:
Frequency of 'Java': 2
Collections Utility ক্লাসের প্রধান মেথডগুলো সংক্ষেপে:
| Method | Description |
|---|---|
| sort(List list) | Sorts the list into ascending order. |
| reverse(List<?> list) | Reverses the order of elements in the list. |
| shuffle(List<?> list) | Shuffles the elements in the list randomly. |
| min(Collection<? extends T> coll) | Finds the minimum element in the collection. |
| max(Collection<? extends T> coll) | Finds the maximum element in the collection. |
| synchronizedList(List list) | Returns a thread-safe version of the list. |
| binarySearch(List<? extends Comparable<? super T>> list, T key) | Searches for a key in a sorted list using binary search. |
| frequency(Collection<?> c, Object o) | Returns the frequency of an element in the collection. |
java.util.Collections ক্লাসটি Java প্রোগ্রামিং ভাষায় বিভিন্ন Collection ডেটা স্ট্রাকচারের উপর কার্যকরী অপারেশন পরিচালনা করার জন্য একটি অত্যন্ত শক্তিশালী ইউটিলিটি ক্লাস। এটি বিভিন্ন কাজ যেমন sorting, shuffling, reversing, searching, thread-safe collections তৈরি করা, এবং finding min/max এর মতো কাজগুলো সহজ করে দেয়। Collections ক্লাসের স্ট্যাটিক মেথডগুলো Java ডেভেলপারদের কোডিং আরও সহজ এবং কার্যকর করতে সহায়ক।
Collections ক্লাসটি java.util প্যাকেজের একটি গুরুত্বপূর্ণ ক্লাস, যা static মেথড সরবরাহ করে যা বিভিন্ন ধরনের Collection (যেমন List, Set, Queue) এর অপারেশন পরিচালনা করতে ব্যবহৃত হয়। Collections ক্লাসটি শুধুমাত্র কালেকশন ফ্রেমওয়ার্কের কার্যকারিতা এবং বৈশিষ্ট্য বাড়াতে সাহায্য করে এবং এটি ডেটা স্ট্রাকচারের sorting, searching, shuffling, synchronization, reverse order ইত্যাদি কাজের জন্য ব্যবহৃত হয়।
Collections ক্লাসটি immutable collection তৈরি করতে, sorting, searching, synchronization, এবং অন্যান্য সাধারণ কাজ সহজ করে তোলে।
Collections ক্লাসের বৈশিষ্ট্যসমূহ:
- Utility Methods: এটি কেবল static methods সরবরাহ করে যা কালেকশনের ওপর বিভিন্ন গাণিতিক কার্যাবলী বা কার্যক্রম পরিচালনা করতে সহায়ক।
- Working with Collections:
Collectionsক্লাসের সাহায্যে আপনি কালেকশনের উপাদানগুলির ওপর নানা ধরনের কাজ করতে পারেন যেমন sorting, searching, reversing, shuffling ইত্যাদি। - Thread Safety: এটি বিভিন্ন thread-safe collections তৈরিতে সহায়ক।
Collections ক্লাসের সাধারণ মেথডসমূহ:
sort(List<T> list):- এই মেথডটি List এর উপাদানগুলোকে ascending অর্ডারে সাজানোর জন্য ব্যবহৃত হয়।
Collections.sort(list);reverse(List<?> list):- এই মেথডটি List এর উপাদানগুলোকে বিপরীত (reverse) অর্ডারে সাজায়।
Collections.reverse(list);shuffle(List<?> list):- এই মেথডটি List এর উপাদানগুলোকে এলোমেলো (shuffle) করে দেয়।
Collections.shuffle(list);min(Collection<? extends T> coll):- এই মেথডটি Collection এর মধ্যে সবচেয়ে ছোট উপাদানটি ফেরত দেয়।
T min = Collections.min(collection);max(Collection<? extends T> coll):- এই মেথডটি Collection এর মধ্যে সবচেয়ে বড় উপাদানটি ফেরত দেয়।
T max = Collections.max(collection);binarySearch(List<? extends Comparable<? super T>> list, T key):- এই মেথডটি List এ একটি উপাদান খুঁজে বের করতে ব্যবহার করা হয়। তবে এটি শুধুমাত্র সাজানো তালিকার ক্ষেত্রে কাজ করে।
int index = Collections.binarySearch(list, key);synchronizedList(List<T> list):- এই মেথডটি একটি thread-safe List তৈরি করে দেয়, যা একাধিক থ্রেড থেকে নিরাপদে অ্যাক্সেস করা যেতে পারে।
List<T> synchronizedList = Collections.synchronizedList(list);copy(List<? super T> dest, List<? extends T> src):- এই মেথডটি একটি src List এর উপাদানগুলোকে dest List এ কপি করে দেয়।
Collections.copy(destList, srcList);fill(List<? super T> list, T obj):- এই মেথডটি List এর সমস্ত এলিমেন্ট obj দিয়ে পূর্ণ করে দেয়।
Collections.fill(list, obj);frequency(Collection<?> c, Object o):- এই মেথডটি একটি Collection এ নির্দিষ্ট উপাদানটি কতবার পাওয়া যাচ্ছে তা গণনা করে।
int frequency = Collections.frequency(collection, element);
Collections ক্লাসের ব্যবহার:
1. Sorting a List
Collections.sort() মেথডটি List এর উপাদানগুলোকে সাজানোর জন্য ব্যবহৃত হয়। নিচে একটি উদাহরণ দেওয়া হল:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class SortExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Banana");
list.add("Apple");
list.add("Cherry");
// Sorting the list
Collections.sort(list);
System.out.println("Sorted List: " + list);
}
}
Output:
Sorted List: [Apple, Banana, Cherry]
2. Reversing a List
Collections.reverse() মেথডটি একটি List এর উপাদানগুলোকে উল্টানো (reverse) করে দেয়।
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ReverseExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.add("JavaScript");
// Reversing the list
Collections.reverse(list);
System.out.println("Reversed List: " + list);
}
}
Output:
Reversed List: [JavaScript, Python, Java]
3. Shuffling a List
Collections.shuffle() মেথডটি একটি List এর উপাদানগুলোকে এলোমেলো (random) করে দেয়।
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ShuffleExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.add("JavaScript");
// Shuffling the list
Collections.shuffle(list);
System.out.println("Shuffled List: " + list);
}
}
Output:
Shuffled List: [Python, Java, JavaScript] // Output may vary due to shuffling
4. Finding the Minimum and Maximum Elements
Collections.min() এবং Collections.max() মেথডের মাধ্যমে একটি Collection থেকে সর্বনিম্ন এবং সর্বোচ্চ উপাদান বের করা যায়।
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class MinMaxExample {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>();
numbers.add(10);
numbers.add(5);
numbers.add(30);
numbers.add(20);
int min = Collections.min(numbers);
int max = Collections.max(numbers);
System.out.println("Minimum Value: " + min);
System.out.println("Maximum Value: " + max);
}
}
Output:
Minimum Value: 5
Maximum Value: 30
5. Synchronized Collections
Collections.synchronizedList() মেথডটি একটি thread-safe List তৈরি করে দেয়। এটি একাধিক থ্রেডের মধ্যে নিরাপদে কাজ করার জন্য ব্যবহৃত হয়।
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class SynchronizedListExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.add("JavaScript");
// Creating a synchronized list
List<String> synchronizedList = Collections.synchronizedList(list);
// Synchronized list can now be safely used across multiple threads
System.out.println("Synchronized List: " + synchronizedList);
}
}
Output:
Synchronized List: [Java, Python, JavaScript]
Collections ক্লাসটি Java-তে একটি অত্যন্ত গুরুত্বপূর্ণ ইউটিলিটি ক্লাস, যা sorting, searching, shuffling, thread-safe collections তৈরি করা এবং আরও অনেক ধরনের কার্যাবলী সহজে সম্পাদন করার জন্য ব্যবহৃত হয়। এটি ডেটা স্ট্রাকচারের উপরে বিভিন্ন অপারেশন করার জন্য একটি static utility class, যা List, Set, Queue ইত্যাদির মতো কালেকশন ইন্টারফেসগুলোর সাথে কার্যকরভাবে কাজ করতে পারে।
Collections ক্লাসের ব্যবহারে আপনার প্রোগ্রামিং আরও সহজ, কার্যকর এবং দ্রুততর হতে পারে, বিশেষত যখন ডেটা স্ট্রাকচারগুলোর ওপর জটিল কার্যাবলী সম্পাদন করতে হয়।
java.util.Collections ক্লাস হল একটি utility class যা Java Collections Framework এর বিভিন্ন ডেটা স্ট্রাকচারগুলির জন্য বিভিন্ন সাহায্যকারী মেথড প্রদান করে। এই ক্লাসে বেশ কিছু স্ট্যাটিক মেথড রয়েছে, যার মাধ্যমে List, Set, Map ইত্যাদি কন্টেইনারগুলির উপাদানগুলির উপর কাজ করা যায়।
এই নিবন্ধে আমরা Collections ক্লাসের কিছু গুরুত্বপূর্ণ মেথড যেমন sort(), reverse(), shuffle(), min(), এবং max() নিয়ে আলোচনা করব, যেগুলি ডেটা স্ট্রাকচারের উপাদানগুলির সাথে কাজ করার সময় খুবই কার্যকরী।
1. sort() মেথড
sort() মেথড ব্যবহার করে আপনি একটি List এর উপাদানগুলিকে ascending order এ সাজাতে পারেন। এটি Comparable ইন্টারফেস ব্যবহার করে কাজ করে (অথবা আপনি Comparator দিয়ে কাস্টম সাজানোও করতে পারেন)।
Syntax:
Collections.sort(List<T> list)
Example: Using sort()
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class SortExample {
public static void main(String[] args) {
List<String> fruits = new ArrayList<>();
fruits.add("Banana");
fruits.add("Apple");
fruits.add("Orange");
// Sorting the list in ascending order
Collections.sort(fruits);
System.out.println("Sorted List: " + fruits); // Output: [Apple, Banana, Orange]
}
}
Output:
Sorted List: [Apple, Banana, Orange]
ব্যাখ্যা:
Collections.sort(fruits)মেথডের মাধ্যমে fruits তালিকাটিকে ascending order অনুযায়ী সাজানো হয়েছে।
2. reverse() মেথড
reverse() মেথড একটি List এর উপাদানগুলিকে উল্টো (reverse) অর্ডারে সাজাতে ব্যবহৃত হয়। এটি মূল তালিকাকে পরিবর্তন করে।
Syntax:
Collections.reverse(List<?> list)
Example: Using reverse()
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ReverseExample {
public static void main(String[] args) {
List<String> fruits = new ArrayList<>();
fruits.add("Banana");
fruits.add("Apple");
fruits.add("Orange");
// Reversing the list
Collections.reverse(fruits);
System.out.println("Reversed List: " + fruits); // Output: [Orange, Apple, Banana]
}
}
Output:
Reversed List: [Orange, Apple, Banana]
ব্যাখ্যা:
Collections.reverse(fruits)মেথডের মাধ্যমে fruits তালিকার উপাদানগুলো উল্টো অর্ডারে সাজানো হয়েছে।
3. shuffle() মেথড
shuffle() মেথড একটি List এর উপাদানগুলিকে এলোমেলোভাবে (randomly) সাজাতে ব্যবহৃত হয়। এটি মেথডটি একটি তালিকার উপাদানগুলোর অর্ডার পরিবর্তন করে, এবং এটি java.util.Random ব্যবহার করে এলোমেলোভাবে সাজানো হয়।
Syntax:
Collections.shuffle(List<?> list)
Example: Using shuffle()
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ShuffleExample {
public static void main(String[] args) {
List<String> fruits = new ArrayList<>();
fruits.add("Banana");
fruits.add("Apple");
fruits.add("Orange");
// Shuffling the list
Collections.shuffle(fruits);
System.out.println("Shuffled List: " + fruits);
}
}
Output (Possible Random Order):
Shuffled List: [Apple, Orange, Banana]
ব্যাখ্যা:
Collections.shuffle(fruits)মেথডের মাধ্যমে fruits তালিকার উপাদানগুলো এলোমেলোভাবে সাজানো হয়েছে। এই অর্ডার প্রতি রানকালে ভিন্ন হতে পারে।
4. min() মেথড
min() মেথড ব্যবহার করে একটি List এর মধ্যে সবচেয়ে ছোট (minimum) উপাদান খুঁজে বের করা যায়। এটি Comparator বা Comparable ব্যবহার করে কাজ করে।
Syntax:
Collections.min(Collection<? extends T> coll)
Example: Using min()
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class MinExample {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>();
numbers.add(10);
numbers.add(5);
numbers.add(8);
// Finding the minimum element in the list
Integer minNumber = Collections.min(numbers);
System.out.println("Minimum Number: " + minNumber); // Output: 5
}
}
Output:
Minimum Number: 5
ব্যাখ্যা:
Collections.min(numbers)মেথডটি numbers তালিকার মধ্যে সবচেয়ে ছোট সংখ্যা খুঁজে বের করেছে (এখানে ৫)।
5. max() মেথড
max() মেথড ব্যবহার করে একটি List এর মধ্যে সবচেয়ে বড় (maximum) উপাদান খুঁজে বের করা যায়। এটি Comparator বা Comparable ব্যবহার করে কাজ করে।
Syntax:
Collections.max(Collection<? extends T> coll)
Example: Using max()
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class MaxExample {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>();
numbers.add(10);
numbers.add(5);
numbers.add(8);
// Finding the maximum element in the list
Integer maxNumber = Collections.max(numbers);
System.out.println("Maximum Number: " + maxNumber); // Output: 10
}
}
Output:
Maximum Number: 10
ব্যাখ্যা:
Collections.max(numbers)মেথডটি numbers তালিকার মধ্যে সবচেয়ে বড় সংখ্যা খুঁজে বের করেছে (এখানে ১০)।
Collections.sort(): এটি একটি List এর উপাদানগুলোকে ascending order অনুসারে সাজায়।Collections.reverse(): এটি একটি List এর উপাদানগুলোকে উল্টো (reverse) অর্ডারে সাজায়।Collections.shuffle(): এটি একটি List এর উপাদানগুলোকে এলোমেলোভাবে (randomly) সাজায়।Collections.min(): এটি একটি List বা Collection এর মধ্যে সবচেয়ে ছোট (minimum) উপাদান খুঁজে বের করে।Collections.max(): এটি একটি List বা Collection এর মধ্যে সবচেয়ে বড় (maximum) উপাদান খুঁজে বের করে।
এই মেথডগুলো Java Collections Framework এর মাধ্যমে ডেটা স্ট্রাকচারের উপাদানগুলোর উপর বিভিন্ন ধরনের কার্যকরী এবং দরকারী অপারেশন করতে সহায়তা করে।
Java Collections Framework বিভিন্ন ধরনের কন্টেইনার বা ডেটা স্ট্রাকচার সরবরাহ করে, যেমন List, Set, Map ইত্যাদি। কখনও কখনও, আমরা এমন একটি Collection তৈরি করতে চাই যা অপরিবর্তনীয় (immutable) বা থ্রেড-সেফ (synchronized) হয়। এই ধরনের কন্টেইনার ব্যবহার করার সময় আমাদের কিছু নির্দিষ্ট নিয়ম অনুসরণ করতে হয়।
এই লেখায় আমরা দেখব কিভাবে Immutable Collections এবং Synchronized Collections তৈরি করা যায়।
1. Immutable Collections
Immutable Collections এমন একটি ডেটা স্ট্রাকচার যেখানে একবার উপাদান যোগ করা হলে সেটি পরিবর্তনযোগ্য থাকে না। এটি খুবই উপকারী যখন আপনি চান যে কোনো ডেটা কন্টেইনার একবার তৈরি হওয়ার পর তা মডিফাই না করা হয়, অর্থাৎ কোন add, remove, বা update অপারেশন হতে পারে না।
Java-তে Immutable Collections তৈরি করার জন্য আমরা Collections.unmodifiable মেথড ব্যবহার করতে পারি অথবা List.of(), Set.of(), Map.of() এর মতো Immutable collection factory মেথড ব্যবহার করতে পারি (যথাযথভাবে Java 9 বা তার পরবর্তী সংস্করণে)।
1.1. Collections.unmodifiable()
Collections.unmodifiableList(), Collections.unmodifiableSet(), এবং Collections.unmodifiableMap() মেথডগুলো দিয়ে আপনি একটি অপরিবর্তনীয় (immutable) কন্টেইনার তৈরি করতে পারেন।
Example: Immutable List using Collections.unmodifiableList()
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ImmutableListExample {
public static void main(String[] args) {
// Creating a modifiable list
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Orange");
// Creating an immutable list
List<String> immutableList = Collections.unmodifiableList(list);
System.out.println("Immutable List: " + immutableList);
// Trying to modify the immutable list will throw an exception
try {
immutableList.add("Mango"); // This will throw UnsupportedOperationException
} catch (UnsupportedOperationException e) {
System.out.println("Error: Cannot modify an immutable list");
}
}
}
Output:
Immutable List: [Apple, Banana, Orange]
Error: Cannot modify an immutable list
ব্যাখ্যা:
Collections.unmodifiableList(list)একটি অপরিবর্তনীয় List তৈরি করেছে। যখন আপনি এই immutable list এর সাথে কোনো পরিবর্তন করার চেষ্টা করেন, এটিUnsupportedOperationExceptionছুড়ে দেয়।
1.2. Immutable Set and Map using Factory Methods (Java 9 and later)
Java 9 থেকে Set.of(), List.of(), এবং Map.of() মেথডগুলো সরাসরি Immutable Set, List, এবং Map তৈরি করতে ব্যবহৃত হতে পারে।
import java.util.Set;
public class ImmutableSetExample {
public static void main(String[] args) {
Set<String> fruits = Set.of("Apple", "Banana", "Orange");
System.out.println("Immutable Set: " + fruits);
// Trying to modify the immutable set will throw an exception
try {
fruits.add("Mango"); // This will throw UnsupportedOperationException
} catch (UnsupportedOperationException e) {
System.out.println("Error: Cannot modify an immutable set");
}
}
}
Output:
Immutable Set: [Apple, Banana, Orange]
Error: Cannot modify an immutable set
ব্যাখ্যা:
Set.of()একটি Immutable Set তৈরি করেছে। কোনো নতুন উপাদান যোগ করতে পারবে না।
2. Synchronized Collections
Synchronized Collections এমন Collection যা একাধিক থ্রেড থেকে নিরাপদে অ্যাক্সেস করা যায়। সাধারণত, Java Collections থ্রেড-সেফ নয়, কিন্তু আপনি synchronized প্যাকেজের মাধ্যমে থ্রেড-সেফ কন্টেইনার তৈরি করতে পারেন, যেখানে একাধিক থ্রেড একই ডেটা স্ট্রাকচার অ্যাক্সেস করতে পারে।
Collections.synchronizedList(), Collections.synchronizedSet(), এবং Collections.synchronizedMap() মেথডগুলো দিয়ে আপনি থ্রেড-সেফ কন্টেইনার তৈরি করতে পারেন।
Example: Synchronized List
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class SynchronizedListExample {
public static void main(String[] args) {
// Creating a modifiable list
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Orange");
// Making the list synchronized
List<String> synchronizedList = Collections.synchronizedList(list);
// Displaying synchronized list
System.out.println("Synchronized List: " + synchronizedList);
// Synchronizing manually when iterating
synchronized (synchronizedList) {
for (String fruit : synchronizedList) {
System.out.println(fruit);
}
}
}
}
Output:
Synchronized List: [Apple, Banana, Orange]
Apple
Banana
Orange
ব্যাখ্যা:
Collections.synchronizedList(list)এর মাধ্যমে একটি থ্রেড-সেফ List তৈরি করা হয়েছে। যখন আপনি iterator ব্যবহার করে এটি পুনঃপ্রবাহিত করবেন, তখন আপনাকে ম্যানুয়ালি এটি সিঙ্ক্রোনাইজ করতে হবে, যেহেতুIteratorএর জন্যsynchronizedকোড ব্লক প্রয়োজন।
Example: Synchronized Set
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
public class SynchronizedSetExample {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("Apple");
set.add("Banana");
set.add("Orange");
// Making the set synchronized
Set<String> synchronizedSet = Collections.synchronizedSet(set);
// Displaying synchronized set
System.out.println("Synchronized Set: " + synchronizedSet);
// Synchronizing manually when iterating
synchronized (synchronizedSet) {
for (String fruit : synchronizedSet) {
System.out.println(fruit);
}
}
}
}
Output:
Synchronized Set: [Apple, Banana, Orange]
Apple
Banana
Orange
3. Differences Between Immutable and Synchronized Collections
| Feature | Immutable Collection | Synchronized Collection |
|---|---|---|
| Mutability | Elements cannot be modified (add, remove, or update). | Elements can be modified, but thread-safety is ensured. |
| Thread Safety | Not inherently thread-safe. | Thread-safe; synchronized access to the collection. |
| Performance | Slightly more efficient for read-only operations. | May have performance overhead due to synchronization. |
| Usage | Used when you need constant data, no changes allowed. | Used when you need to ensure safe access in multi-threaded environments. |
- Immutable Collections তৈরি করার জন্য আপনি
Collections.unmodifiable*()মেথড ব্যবহার করতে পারেন অথবা Java 9 থেকেList.of(),Set.of(),Map.of()ব্যবহার করে। - Synchronized Collections তৈরি করার জন্য আপনি
Collections.synchronized*()মেথড ব্যবহার করতে পারেন, যা থ্রেড-সেফ অপারেশন নিশ্চিত করে। - Immutable Collections সাধারণত যখন ডেটা পরিবর্তন সম্ভব নয়, তখন ব্যবহার করা হয়, আর Synchronized Collections থ্রেড-সেফ ডেটা স্ট্রাকচার ব্যবহারের জন্য উপযোগী।
এই দুটি ধরনের কন্টেইনারই আপনাকে বিশেষ পরিস্থিতিতে সাহায্য করে, যেমন যখন আপনি নিশ্চিত করতে চান যে ডেটার কোনো পরিবর্তন না হয় বা আপনি একাধিক থ্রেডের মধ্যে নিরাপদে ডেটা অ্যাক্সেস করতে চান।
Java Collections Framework হল একটি শক্তিশালী ব্যবস্থা, যা বিভিন্ন ডেটা স্ট্রাকচার এবং তাদের কার্যাবলীর সমর্থন দেয়। java.util প্যাকেজে সংরক্ষিত Collections বিভিন্ন ধরনের ডেটা স্ট্রাকচার এবং মেথড সরবরাহ করে যা তথ্য সংরক্ষণ, অনুসন্ধান, প্রক্রিয়াকরণ, এবং ম্যানিপুলেশন সহজ করে তোলে।
Collections এর মাধ্যমে Data Management এর কয়েকটি সাধারণ পদ্ধতি এবং List, Set, Map ইত্যাদি ডেটা স্ট্রাকচার ব্যবহার করে কাজ করা যেতেই পারে।
এই লেখায় আমরা ArrayList, HashSet, HashMap ইত্যাদি কোলেকশনের মাধ্যমে Data Management এর বাস্তবিক উদাহরণ দেখব।
1. ArrayList এর মাধ্যমে Data Management
ArrayList হলো একটি List ইন্টারফেসের বাস্তবায়ন, যা ডায়নামিক অ্যারে (dynamic array) হিসেবে কাজ করে এবং ইনডেক্সের মাধ্যমে উপাদান অ্যাক্সেস করতে সাহায্য করে। এটি দ্রুত random access এর জন্য ব্যবহৃত হয়।
প্রয়োজন:
ধরা যাক, আপনি একটি বিশ্ববিদ্যালয়ের ছাত্রদের নাম এবং তাদের পরীক্ষার নম্বর একটি তালিকায় সংরক্ষণ করতে চান।
উদাহরণ:
import java.util.ArrayList;
import java.util.List;
public class ArrayListExample {
public static void main(String[] args) {
// ArrayList তৈরি করা
List<String> students = new ArrayList<>();
students.add("John");
students.add("Alice");
students.add("Bob");
students.add("Jane");
// নির্দিষ্ট ইনডেক্স থেকে ছাত্রের নাম প্রিন্ট করা
System.out.println("Student at index 1: " + students.get(1)); // Output: Alice
// মোট ছাত্রের সংখ্যা প্রিন্ট করা
System.out.println("Total number of students: " + students.size()); // Output: 4
// ছাত্রদের তালিকা প্রিন্ট করা
System.out.println("Students List: " + students);
}
}
Output:
Student at index 1: Alice
Total number of students: 4
Students List: [John, Alice, Bob, Jane]
ব্যাখ্যা:
add()মেথড ব্যবহার করে ছাত্রদের নাম ArrayList-এ যোগ করা হয়েছে।get()মেথড দ্বারা নির্দিষ্ট ইনডেক্সের ছাত্রের নাম অ্যাক্সেস করা হয়েছে।size()মেথডটি ব্যবহার করে মোট ছাত্রের সংখ্যা বের করা হয়েছে।toString()মেথডের মাধ্যমে তালিকাটি প্রিন্ট করা হয়েছে।
2. HashSet এর মাধ্যমে Data Management
HashSet হলো Set ইন্টারফেসের একটি বাস্তবায়ন যা কোনো অর্ডার বজায় রাখে না এবং ডুপ্লিকেট মানকে সমর্থন করে না। এটি দ্রুত অনুসন্ধান এবং উপাদান গুলি নিশ্চিতভাবে unique (অনন্য) রাখার জন্য ব্যবহৃত হয়।
প্রয়োজন:
ধরা যাক, আপনি একজন কোম্পানির কর্মীদের ইউনিক আইডি গুলি HashSet এ সংরক্ষণ করতে চান, যাতে কোনো ডুপ্লিকেট আইডি রাখা না হয়।
উদাহরণ:
import java.util.HashSet;
import java.util.Set;
public class HashSetExample {
public static void main(String[] args) {
// HashSet তৈরি করা
Set<Integer> employeeIds = new HashSet<>();
employeeIds.add(101);
employeeIds.add(102);
employeeIds.add(103);
employeeIds.add(101); // Duplicate entry (will be ignored)
// কর্মীদের আইডি প্রিন্ট করা
System.out.println("Employee IDs: " + employeeIds); // Output: [101, 102, 103]
// কর্মী সংখ্যা প্রিন্ট করা
System.out.println("Total employees: " + employeeIds.size()); // Output: 3
}
}
Output:
Employee IDs: [101, 102, 103]
Total employees: 3
ব্যাখ্যা:
add()মেথড দ্বারা কর্মীদের ইউনিক আইডি যোগ করা হয়েছে।101আইডিটি দ্বিতীয়বার যোগ করা হলেও,HashSetতার ডুপ্লিকেট মূল্যায়ন করে এবং এটি তালিকায় যুক্ত করা হয়নি।size()মেথডের মাধ্যমে মোট কর্মী সংখ্যা বের করা হয়েছে।
3. HashMap এর মাধ্যমে Data Management
HashMap হলো Map ইন্টারফেসের একটি বাস্তবায়ন, যেখানে key-value pair হিসেবে ডেটা সংরক্ষণ করা হয়। এটি দ্রুত অনুসন্ধান এবং মানের দ্রুত অ্যাক্সেস সরবরাহ করে।
প্রয়োজন:
ধরা যাক, আপনি একটি শিক্ষকের কাছে ছাত্রদের নম্বর এবং তাদের স্কোর সংরক্ষণ করতে চান।
উদাহরণ:
import java.util.HashMap;
import java.util.Map;
public class HashMapExample {
public static void main(String[] args) {
// HashMap তৈরি করা
Map<String, Integer> studentScores = new HashMap<>();
studentScores.put("John", 85);
studentScores.put("Alice", 92);
studentScores.put("Bob", 76);
// নির্দিষ্ট ছাত্রের নম্বর প্রিন্ট করা
System.out.println("John's score: " + studentScores.get("John")); // Output: 85
// মোট ছাত্রের সংখ্যা প্রিন্ট করা
System.out.println("Total students: " + studentScores.size()); // Output: 3
// ছাত্রদের স্কোর প্রিন্ট করা
System.out.println("Student Scores: " + studentScores);
}
}
Output:
John's score: 85
Total students: 3
Student Scores: {John=85, Alice=92, Bob=76}
ব্যাখ্যা:
put()মেথড ব্যবহার করে ছাত্রদের নাম এবং তাদের স্কোর সংরক্ষণ করা হয়েছে।get()মেথডের মাধ্যমে নির্দিষ্ট ছাত্রের স্কোর অ্যাক্সেস করা হয়েছে।size()মেথডের মাধ্যমে মোট ছাত্রের সংখ্যা বের করা হয়েছে।toString()মেথডের মাধ্যমে স্কোরসহ ছাত্রদের তালিকা প্রিন্ট করা হয়েছে।
Collections এর মাধ্যমে Data Management এর সুবিধা:
- Data Organization:
List,Set, এবংMapএর মতো কোলেকশনের মাধ্যমে আপনি ডেটা সঠিকভাবে সংগঠিত এবং পরিচালনা করতে পারবেন। যেমন,HashMapদিয়ে key-value pair গুলি একত্রে সংরক্ষণ করা হয় এবংHashSetদিয়ে ইউনিক ডেটা ধারণ করা হয়।
- Dynamic Data Handling:
ArrayListবাLinkedListএর মাধ্যমে আপনি ডেটার সাইজের পরিবর্তন করতে পারেন।HashSetএবংHashMapডুপ্লিকেট ডেটা থেকে মুক্তি দিয়ে শুধুমাত্র ইউনিক আইটেম সংরক্ষণ করে।
- Efficient Searching and Sorting:
HashMapএবংHashSetদ্রুত অনুসন্ধান সরবরাহ করে, কারণ এগুলো hashing প্রযুক্তি ব্যবহার করে। যখন আপনি দ্রুত ডেটা অ্যাক্সেস করতে চান, তখনHashMapবাHashSetখুব কার্যকরী।
- Memory Efficiency:
LinkedListডেটার জন্য মেমরি ব্যবহারে আরও দক্ষ হতে পারে যেখানে ডেটার মধ্যে insertion/deletion বেশ দ্রুত হয়, যদিওArrayListকম মেমরি খরচ করে যখন শুধুমাত্র random access প্রয়োজন।
- Thread-Safe Variants:
HashMapএবংArrayListএর থ্রেড-সেফ ভ্যারিয়েন্ট (যেমনConcurrentHashMapএবংCopyOnWriteArrayList)ও রয়েছে, যা মাল্টিথ্রেডিং পরিবেশে ব্যবহৃত হয়।
Java Collections এর মাধ্যমে Data Management খুবই সহজ এবং কার্যকরী হয়ে ওঠে। List, Set, এবং Map এর মতো ডেটা স্ট্রাকচারগুলি ডেটা সংরক্ষণ, অ্যাক্সেস এবং ম্যানিপুলেশনকে আরও দ্রুত এবং কার্যকরী করে। ArrayList, HashSet, এবং HashMap এর ব্যবহার এবং তাদের বৈশিষ্ট্যসমূহকে বুঝে, আপনি আপনার প্রয়োজনে সঠিক কোলেকশন ব্যবহার করতে পারবেন।
Read more