目次

১. সেট কী?

জাভা প্রোগ্রামিং-এ, সেট হল সবচেয়ে গুরুত্বপূর্ণ সংগ্রহের ধরনগুলোর একটি। “সেট” শব্দটি গণিত থেকে এসেছে, এবং গাণিতিক সেটের মতোই এর মূল বৈশিষ্ট্য হল এতে ডুপ্লিকেট উপাদান থাকতে পারে না
যদি আপনি শুধুমাত্র অনন্য মান পরিচালনা করতে চান, তা সংখ্যা, স্ট্রিং বা অবজেক্ট যাই হোক না কেন, তখন সেট ব্যবহার করা হয়.

সেট এবং লিস্টের পার্থক্য কী?

জাভা কালেকশনস ফ্রেমওয়ার্ক লিস্ট এবং ম্যাপের মতো বিভিন্ন ডেটা স্ট্রাকচার সরবরাহ করে। এদের মধ্যে, সেট এবং লিস্ট প্রায়ই তুলনা করা হয়। তাদের প্রধান পার্থক্যগুলো নিম্নরূপ:

  • লিস্ট : ডুপ্লিকেট মান অনুমোদন করে এবং উপাদানের ক্রম (ইন্ডেক্স-ভিত্তিক) বজায় রাখে।
  • সেট : ডুপ্লিকেট অনুমোদন করে না, এবং উপাদানের ক্রম গ্যারান্টি দেয় না (কিছু নির্দিষ্ট ইমপ্লিমেন্টেশনের ব্যতীত)।

সংক্ষেপে, লিস্ট হল “ক্রমবদ্ধ সংগ্রহ”, আর সেট হল “অনন্য উপাদানের সংগ্রহ”।
উদাহরণস্বরূপ, যদি আপনি ব্যবহারকারীর আইডি ডুপ্লিকেশন ছাড়া পরিচালনা করতে চান, তবে সেটই আদর্শ পছন্দ.

সেট ব্যবহার করার সুবিধা

  • স্বয়ংক্রিয় ডুপ্লিকেট অপসারণ ব্যবহারকারীদের থেকে বড় পরিমাণের ডেটা গ্রহণ করলেও, সেটে উপাদান যোগ করা হলে ডুপ্লিকেটগুলো শুধুমাত্র একবারই সংরক্ষিত হয়। এটি ম্যানুয়াল ডুপ্লিকেট চেকের প্রয়োজন দূর করে এবং বাস্তবায়নকে সহজ করে।
  • দক্ষ অনুসন্ধান ও অপসারণ সেটগুলো দ্রুত অস্তিত্ব যাচাই এবং অপসারণ অপারেশন করার জন্য ডিজাইন করা হয়েছে, যদিও পারফরম্যান্স ইমপ্লিমেন্টেশনের (যেমন HashSet বা TreeSet) উপর নির্ভর করে পরিবর্তিত হতে পারে।

কখন আপনাকে সেট ব্যবহার করা উচিত?

  • যখন এমন তথ্য পরিচালনা করা হয় যা ডুপ্লিকেট হতে পারে না, যেমন ব্যবহারকারীর ইমেইল ঠিকানা বা আইডি
  • যখন ডেটার অনন্যতা গ্যারান্টি করা প্রয়োজন
  • যখন আপনি বড় ডেটাসেট থেকে দক্ষতার সাথে অনন্য মানের একটি তালিকা তৈরি করতে চান

উপরের মতো, জাভাতে ডুপ্লিকেট অনুমোদন না করা সংগ্রহগুলোকে বুদ্ধিমত্তার সাথে পরিচালনা করার জন্য সেটই মানক পদ্ধতি।
পরবর্তী অংশগুলোতে, আমরা সেটের স্পেসিফিকেশন, ব্যবহার প্যাটার্ন এবং বাস্তব কোড উদাহরণগুলো বিশদভাবে অনুসন্ধান করব.

২. সেটের মৌলিক স্পেসিফিকেশন এবং সুবিধা

জাভাতে, সেট java.util.Set ইন্টারফেস দ্বারা সংজ্ঞায়িত। এই ইন্টারফেসটি ইমপ্লিমেন্ট করে আপনি ডুপ্লিকেট ছাড়া অনন্য উপাদানের একটি সংগ্রহ উপস্থাপন করতে পারেন। চলুন সেটের মূল স্পেসিফিকেশন এবং সুবিধাগুলোকে কাছ থেকে দেখি.

সেট ইন্টারফেসের মৌলিক বৈশিষ্ট্য

সেটের নিম্নলিখিত বৈশিষ্ট্যগুলো রয়েছে:

  • ডুপ্লিকেট উপাদান নেই যদি আপনি এমন একটি উপাদান যোগ করার চেষ্টা করেন যা ইতিমধ্যে আছে, তা যোগ হবে না। উদাহরণস্বরূপ, আপনি যদি set.add("apple") দুবার চালান, তবু শুধুমাত্র একটি “apple” সংরক্ষিত হবে।
  • ক্রম গ্যারান্টি নয় (ইমপ্লিমেন্টেশন-নির্ভর) ডিফল্টভাবে একটি সেট উপাদানের ক্রম গ্যারান্টি দেয় না। তবে LinkedHashSet এবং TreeSet এর মতো নির্দিষ্ট ইমপ্লিমেন্টেশনগুলো উপাদানগুলোকে নির্দিষ্ট ক্রমে পরিচালনা করে।
  • null উপাদানের হ্যান্ডলিং null অনুমোদন করা হবে কিনা তা ইমপ্লিমেন্টেশনের উপর নির্ভর করে। উদাহরণস্বরূপ, HashSet একটি null উপাদান অনুমোদন করে, তবে TreeSet তা করে না.

equals এবং hashCode এর গুরুত্ব

সেটের মধ্যে দুটি উপাদান ডুপ্লিকেট হিসেবে বিবেচিত হবে কিনা তা equals এবং hashCode মেথড দ্বারা নির্ধারিত হয়।
যদি কাস্টম ক্লাসকে সেটের উপাদান হিসেবে ব্যবহার করা হয় এবং এই মেথডগুলো সঠিকভাবে ওভাররাইড না করা হয়, তবে অপ্রত্যাশিত ডুপ্লিকেট বা ভুল সংরক্ষণ আচরণ ঘটতে পারে।

  • equals : নির্ধারণ করে দুটি অবজেক্ট লজিক্যালি সমান কিনা
  • hashCode : দক্ষ সনাক্তকরণের জন্য ব্যবহৃত একটি সংখ্যামূলক মান প্রদান করে

সেট ব্যবহার করার সুবিধা

সেটগুলো বেশ কিছু ব্যবহারিক সুবিধা প্রদান করে:

  • সহজ ডুপ্লিকেট অপসারণ শুধুমাত্র মানগুলোকে সেটে যোগ করলেই ডুপ্লিকেট স্বয়ংক্রিয়ভাবে সরিয়ে ফেলা হয়, ফলে ম্যানুয়াল চেকের প্রয়োজন দূর হয়।
  • দক্ষ অনুসন্ধান ও অপসারণ HashSet এর মতো ইমপ্লিমেন্টেশন দ্রুত লুকআপ এবং অপসারণ অপারেশন প্রদান করে, যা প্রায়শই লিস্টের চেয়ে ভাল পারফরম্যান্স দেয়।
  • সহজ ও স্বজ্ঞাত API add, remove, এবং contains এর মতো মৌলিক মেথডগুলো সেটকে ব্যবহার করা সহজ করে তোলে.

অভ্যন্তরীণ বাস্তবায়ন এবং পারফরম্যান্স

One of the most common Set implementations, HashSet, internally uses a HashMap to manage elements. This allows element addition, removal, and lookup to be performed with average O(1) time complexity.
যদি ক্রমবিন্যাস বা সাজানো প্রয়োজন হয়, তবে আপনার প্রয়োজন অনুযায়ী LinkedHashSet বা TreeSet এর মতো বাস্তবায়ন বেছে নিতে পারেন.

3. প্রধান বাস্তবায়ন ক্লাস এবং তাদের বৈশিষ্ট্য

Java Set ইন্টারফেসের বেশ কয়েকটি প্রধান বাস্তবায়ন প্রদান করে। প্রতিটি ভিন্ন বৈশিষ্ট্যযুক্ত, তাই আপনার ব্যবহারের ক্ষেত্রে সঠিকটি নির্বাচন করা গুরুত্বপূর্ণ।
এখানে, আমরা সবচেয়ে সাধারণভাবে ব্যবহৃত তিনটি বাস্তবায়ন ব্যাখ্যা করব: HashSet, LinkedHashSet, এবং TreeSet.

HashSet

HashSet হল সবচেয়ে সাধারণভাবে ব্যবহৃত Set বাস্তবায়ন.

  • বৈশিষ্ট্য
  • উপাদানের ক্রম সংরক্ষণ করে না (সন্নিবেশের ক্রম এবং পুনরাবৃত্তির ক্রম ভিন্ন হতে পারে)।
  • অভ্যন্তরীণভাবে একটি HashMap ব্যবহার করে, যা দ্রুত যোগ, অনুসন্ধান এবং অপসারণ অপারেশন প্রদান করে।
  • একটি null উপাদান অনুমোদন করে.
  • সাধারণ ব্যবহার ক্ষেত্র
  • যখন আপনি ডুপ্লিকেট বাদ দিতে চান এবং ক্রম গুরুত্বপূর্ণ নয় তখন আদর্শ.
  • নমুনা কোড
    Set<String> set = new HashSet<>();
    set.add("apple");
    set.add("banana");
    set.add("apple"); // Duplicate is ignored
    
    for (String s : set) {
        System.out.println(s); // Only "apple" and "banana" are printed
    }
    

LinkedHashSet

LinkedHashSet HashSet এর কার্যকারিতা সন্নিবেশের ক্রম সংরক্ষণ করে বাড়িয়ে দেয়.

  • বৈশিষ্ট্য
  • উপাদানগুলি সন্নিবেশের ক্রমে পুনরাবৃত্তি করা হয়.
  • অভ্যন্তরীণভাবে হ্যাশ টেবিল এবং লিঙ্কড লিস্টের সমন্বয়ে পরিচালিত হয়.
  • HashSet এর তুলনায় সামান্য ধীর, তবে ক্রম গুরুত্বপূর্ণ হলে ব্যবহারযোগ্য.
  • সাধারণ ব্যবহার ক্ষেত্র
  • সন্নিবেশের ক্রম বজায় রেখে ডুপ্লিকেট অপসারণ করতে চাইলে সর্বোত্তম.
  • নমুনা কোড
    Set<String> set = new LinkedHashSet<>();
    set.add("apple");
    set.add("banana");
    set.add("orange");
    
    for (String s : set) {
        System.out.println(s); // Printed in order: apple, banana, orange
    }
    

TreeSet

TreeSet একটি Set বাস্তবায়ন যা স্বয়ংক্রিয়ভাবে উপাদানগুলি সাজায়.

  • বৈশিষ্ট্য
  • অভ্যন্তরীণভাবে একটি Red-Black Tree (সামঞ্জস্যপূর্ণ গাছের কাঠামো) ব্যবহার করে.
  • উপাদানগুলি স্বয়ংক্রিয়ভাবে ঊর্ধ্বক্রমে সাজানো হয়.
  • Comparable বা Comparator ব্যবহার করে কাস্টম ক্রম নির্ধারণ করা সম্ভব.
  • null মান অনুমোদিত নয়.
  • সাধারণ ব্যবহার ক্ষেত্র
  • যখন আপনাকে উভয়ই অনন্যতা এবং স্বয়ংক্রিয় সাজানো দরকার তখন ব্যবহারযোগ্য.
  • নমুনা কোড
    Set<Integer> set = new TreeSet<>();
    set.add(30);
    set.add(10);
    set.add(20);
    
    for (Integer n : set) {
        System.out.println(n); // Printed in order: 10, 20, 30
    }
    

সারসংক্ষেপ

  • HashSet : যখন ক্রম প্রয়োজন হয় না তখন উচ্চ পারফরম্যান্সের জন্য সর্বোত্তম
  • LinkedHashSet : সন্নিবেশের ক্রম গুরুত্বপূর্ণ হলে ব্যবহার করুন
  • TreeSet : স্বয়ংক্রিয় সাজানো প্রয়োজন হলে ব্যবহার করুন

সঠিক Set বাস্তবায়ন নির্বাচন আপনার নির্দিষ্ট প্রয়োজনের উপর নির্ভর করে। সবচেয়ে উপযুক্তটি নির্বাচন করুন এবং তা কার্যকরভাবে ব্যবহার করুন.

4. সাধারণ মেথড এবং কীভাবে ব্যবহার করবেন

Set ইন্টারফেস সংগ্রহ অপারেশনের জন্য বিভিন্ন মেথড প্রদান করে। নিচে সবচেয়ে সাধারণভাবে ব্যবহৃত মেথডগুলি উদাহরণসহ ব্যাখ্যা করা হয়েছে.

প্রধান মেথডগুলি

  • add(E e) Set-এ একটি উপাদান যোগ করে। যদি উপাদানটি ইতিমধ্যে থাকে, তবে এটি যোগ হয় না.
  • remove(Object o) Set থেকে নির্দিষ্ট উপাদানটি অপসারণ করে। সফল হলে true রিটার্ন করে.
  • contains(Object o) Set-এ নির্দিষ্ট উপাদানটি আছে কিনা পরীক্ষা করে.
  • size() Set-এ উপাদানের সংখ্যা রিটার্ন করে.
  • clear() Set থেকে সব উপাদান অপসারণ করে.
  • isEmpty() Set খালি কিনা পরীক্ষা করে.
  • iterator() উপাদানগুলি পার করার জন্য একটি Iterator রিটার্ন করে.
  • toArray() Set-কে একটি অ্যারেতে রূপান্তর করে.

মৌলিক ব্যবহার উদাহরণ

Set<String> set = new HashSet<>();

// Add elements
set.add("apple");
set.add("banana");
set.add("apple"); // Duplicate ignored

// Get size
System.out.println(set.size()); // 2

// Check existence
System.out.println(set.contains("banana")); // true

// Remove element
set.remove("banana");
System.out.println(set.contains("banana")); // false

// Clear all elements
set.clear();
System.out.println(set.isEmpty()); // true

Iterating Over a Set

Since Set does not support index-based access (e.g., set.get(0)), use an Iterator or enhanced for-loop.

// Enhanced for-loop
Set<String> set = new HashSet<>();
set.add("A");
set.add("B");
set.add("C");

for (String s : set) {
    System.out.println(s);
}
// Using Iterator
Iterator<String> it = set.iterator();
while (it.hasNext()) {
    String s = it.next();
    System.out.println(s);
}

Important Notes

  • Adding an existing element using add does not change the Set.
  • Element order depends on the implementation (HashSet: unordered, LinkedHashSet: insertion order, TreeSet: sorted).

5. Common Use Cases and Typical Scenarios

Java Sets are widely used in many situations where duplicate values must be avoided. Below are some of the most common and practical use cases encountered in real-world development.

Creating a Unique List (Duplicate Removal)

When you want to extract only unique values from a large dataset, Set is extremely useful.
For example, it can automatically remove duplicates from user input or existing collections.

Example: Creating a Set from a List to Remove Duplicates

List<String> list = Arrays.asList("apple", "banana", "apple", "orange");
Set<String> set = new HashSet<>(list);

System.out.println(set); // [apple, banana, orange]

Ensuring Input Uniqueness

Sets are ideal for scenarios where duplicate values must not be registered, such as user IDs or email addresses.
You can immediately determine whether a value already exists by checking the return value of add.

Set<String> emailSet = new HashSet<>();
boolean added = emailSet.add("user@example.com");
if (!added) {
    System.out.println("This value is already registered");
}

Storing Custom Classes and Implementing equals/hashCode

When storing custom objects in a Set, proper implementation of equals and hashCode is essential.
Without them, objects with the same logical content may be treated as different elements.

Example: Ensuring Uniqueness in a Person Class

class Person {
    String name;

    Person(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Person person = (Person) obj;
        return Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name);
    }
}

// Example usage
Set<Person> people = new HashSet<>();
people.add(new Person("Taro"));
people.add(new Person("Taro")); // Without proper implementation, duplicates may occur
System.out.println(people.size()); // 1

Fast Lookup and Data Filtering

Because Set provides fast lookups via contains, it is often used for filtering and comparison tasks.
Converting a List to a Set can significantly improve performance when repeatedly checking for existence.

Example: Fast Keyword Lookup

Set<String> keywordSet = new HashSet<>(Arrays.asList("java", "python", "c"));
boolean found = keywordSet.contains("python"); // true

6. Performance Considerations and Pitfalls

While Set is a powerful collection for managing unique elements, improper usage can lead to unexpected behavior or performance issues. This section explains key performance characteristics and common pitfalls.

Performance Differences by Implementation

  • HashSet অভ্যন্তরীণভাবে একটি হ্যাশ টেবিল ব্যবহার করে, গড় O(1) পারফরম্যান্স প্রদান করে যোগ, মুছে ফেলা এবং অনুসন্ধান অপারেশনের জন্য। উপাদানের সংখ্যা অত্যন্ত বড় হলে বা হ্যাশ সংঘর্ষ ঘন ঘন ঘটলে পারফরম্যান্স হ্রাস পেতে পারে।
  • LinkedHashSet HashSet-এর সমান পারফরম্যান্স প্রদান করে, তবে সন্নিবেশের ক্রম বজায় রাখার জন্য অতিরিক্ত ওভারহেড থাকে। অধিকাংশ ক্ষেত্রে পার্থক্য নগণ্য, যদি না খুব বড় ডেটাসেট নিয়ে কাজ করা হয়।
  • TreeSet অভ্যন্তরীণভাবে একটি রেড-ব্ল্যাক ট্রি ব্যবহার করে, যার ফলে যোগ, মুছে ফেলা এবং অনুসন্ধান অপারেশনের জন্য O(log n) পারফরম্যান্স হয়। HashSet-এর তুলনায় ধীর, তবে স্বয়ংক্রিয় সাজানো প্রদান করে।

সেট উপাদান হিসেবে পরিবর্তনশীল অবজেক্ট ব্যবহার করা

একটি সেটে পরিবর্তনশীল অবজেক্ট সংরক্ষণ করার সময় অতিরিক্ত সতর্কতা প্রয়োজন।
HashSet এবং TreeSet উপাদান পরিচালনার জন্য hashCode বা compareTo মানের উপর নির্ভর করে।
যদি সন্নিবেশের পরে এই মানগুলি পরিবর্তিত হয়, তবে অনুসন্ধান এবং মুছে ফেলা ব্যর্থ হতে পারে

উদাহরণ: পরিবর্তনশীল অবজেক্টের সঙ্গে ফাঁদ

Set<Person> people = new HashSet<>();
Person p = new Person("Taro");
people.add(p);

p.name = "Jiro"; // Modifying after insertion
people.contains(p); // May return false unexpectedly

এই ধরনের সমস্যাগুলি এড়াতে, সম্ভব হলে অপরিবর্তনীয় অবজেক্টকে সেটের উপাদান হিসেবে ব্যবহার করা দৃঢ়ভাবে সুপারিশ করা হয়।

null মান পরিচালনা

  • HashSet / LinkedHashSet : একটি null উপাদান অনুমোদন করে
  • TreeSet : null অনুমোদন করে না (NullPointerException নিক্ষেপ করে)

অন্যান্য গুরুত্বপূর্ণ নোট

  • ইটারেশন চলাকালীন পরিবর্তন ইটারেট করার সময় সেট পরিবর্তন করলে ConcurrentModificationException ঘটতে পারে। সরাসরি সেট পরিবর্তন করার পরিবর্তে Iterator.remove() ব্যবহার করুন।
  • সঠিক ইমপ্লিমেন্টেশন নির্বাচন যখন ক্রম গুরুত্বপূর্ণ হয় তখন LinkedHashSet বা TreeSet ব্যবহার করুন। HashSet ক্রমের গ্যারান্টি দেয় না।

7. তুলনা চার্ট (সামগ্রিক দৃশ্য)

নিচের টেবিলটি প্রধান সেট ইমপ্লিমেন্টেশনগুলির পার্থক্যগুলো সংক্ষেপে উপস্থাপন করে, যাতে সহজে তুলনা করা যায়।

ImplementationNo DuplicatesOrder PreservedSortedPerformancenull AllowedTypical Use Case
HashSetYesNoNoFast (O(1))One allowedDuplicate removal, order not required
LinkedHashSetYesYes (Insertion order)NoSlightly slower than HashSetOne allowedDuplicate removal with order preservation
TreeSetYesNoYes (Automatic)O(log n)Not allowedDuplicate removal with sorting

মূল বিষয়গুলো

  • HashSet : যখন ক্রম গুরুত্বপূর্ণ নয় এবং পারফরম্যান্স গুরুত্বপূর্ণ, তখন ডিফল্ট পছন্দ।
  • LinkedHashSet : যখন সন্নিবেশের ক্রম বজায় রাখতে হয়, তখন সর্বোত্তম।
  • TreeSet : যখন স্বয়ংক্রিয় সাজানো প্রয়োজন, তখন আদর্শ।

8. প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী (FAQ)

প্রশ্ন১. প্রিমিটিভ টাইপ (int, char, ইত্যাদি) কি সেটে ব্যবহার করা যায়?

উত্তর১. না। পরিবর্তে Integer বা Character এর মতো র‍্যাপার ক্লাস ব্যবহার করুন।

প্রশ্ন২. একই মান একাধিকবার যোগ করলে কী হয়?

উত্তর২. শুধুমাত্র প্রথম সন্নিবেশ সংরক্ষিত হয়। যদি উপাদানটি ইতিমধ্যে থাকে, তবে add মেথডটি false রিটার্ন করে।

প্রশ্ন৩. কখন List এবং কখন Set ব্যবহার করা উচিত?

উত্তর৩. যখন ক্রম বা ডুপ্লিকেট গুরুত্বপূর্ণ, তখন List ব্যবহার করুন, এবং যখন ইউনিকনেস প্রয়োজন, তখন Set ব্যবহার করুন।

প্রশ্ন৪. একটি Set-এ কাস্টম অবজেক্ট সংরক্ষণ করতে কী প্রয়োজন?

উত্তর৪. equals এবং hashCode যথাযথভাবে ওভাররাইড করুন।

প্রশ্ন৫. সন্নিবেশের ক্রম কীভাবে বজায় রাখা যায়?

উত্তর৫. LinkedHashSet ব্যবহার করুন।

প্রশ্ন৬. উপাদানগুলোকে স্বয়ংক্রিয়ভাবে কীভাবে সাজানো যায়?

উত্তর৬. TreeSet ব্যবহার করুন।

প্রশ্ন৭. Set-এ null মান থাকতে পারে কি?

উত্তর৭. HashSet এবং LinkedHashSet একটি null অনুমোদন করে; TreeSet অনুমোদন করে না।

প্রশ্ন৮. Set-এর আকার কীভাবে পাওয়া যায়?

উত্তর৮. size() ব্যবহার করুন।

প্রশ্ন৯. Set-কে List বা array-তে কীভাবে রূপান্তর করা যায়?

উত্তর৯.

  • Array-এ রূপান্তর: toArray()
  • List-এ রূপান্তর: new ArrayList<>(set)

প্রশ্ন১০. ইটারেট করার সময় উপাদান মুছে ফেলা সম্ভব কি?

উত্তর১০. হ্যাঁ, তবে শুধুমাত্র Iterator.remove() ব্যবহার করে।

9. উপসংহার

এই প্রবন্ধে জাভা Set সংগ্রহগুলোর মৌলিক থেকে উন্নত ব্যবহার পর্যন্ত আলোচনা করা হয়েছে। মূল বিষয়গুলো হল:

  • Set অনন্য উপাদানের সংগ্রহ পরিচালনার জন্য ডিজাইন করা হয়েছে, যা ডুপ্লিকেট অপসারণের জন্য আদর্শ।
  • প্রধান ইমপ্লিমেন্টেশনগুলো হল HashSet (দ্রুত, অর্ডারবিহীন), LinkedHashSet (সন্নিবেশের ক্রম), এবং TreeSet (সাজানো)।
  • সাধারণ ব্যবহার ক্ষেত্রে ডুপ্লিকেট অপসারণ, ইউনিকনেস চেক, কাস্টম অবজেক্ট পরিচালনা, এবং দ্রুত লুকআপ অন্তর্ভুক্ত।
  • পারফরম্যান্স বৈশিষ্ট্য এবং পরিবর্তনশীল অবজেক্ট ও ইটারেশন নিয়মের মতো ফাঁদগুলো বোঝা অপরিহার্য।
  • তুলনা টেবিল এবং FAQ বাস্তব উন্নয়নের জন্য ব্যবহারিক নির্দেশনা প্রদান করে।

সেট সংগ্রহগুলিতে দক্ষতা অর্জন করলে জাভা প্রোগ্রামিং আরও পরিষ্কার, নিরাপদ এবং দক্ষ হয়।
পরবর্তীতে, সেটগুলিকে লিস্ট বা ম্যাপের সাথে যুক্ত করে আরও উন্নত ডেটা স্ট্রাকচার এবং সমাধান তৈরি করার বিষয় বিবেচনা করুন।