Java Academy · पाठ

EnumSet और EnumMap

कुशल और type-safe enum-आधारित collections के लिए EnumSet और EnumMap का उपयोग करें।

पाठ 4, कुल 4 में से13 चरण

EnumSet और EnumMap, CoddyKit पर Java Academy का एक निःशुल्क पाठ है। यह 4 में से 4वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Java Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

EnumSet और EnumMap

EnumSet और EnumMap enum के लिए अत्यधिक अनुकूलित संग्रह कार्यान्वयन हैं। ये आंतरिक रूप से बिट वेक्टर का उपयोग करते हैं—enum कुंजियों के लिए HashSet/HashMap से बहुत तेज़।

EnumSet: समुच्चय बनाना

EnumSet enum नियतांकों के समुच्चय बनाने के लिए फ़ैक्टरी विधियाँ प्रदान करता है।

import java.util.*;

enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }

EnumSet<Day> weekdays  = EnumSet.range(Day.MON, Day.FRI);
EnumSet<Day> weekend   = EnumSet.of(Day.SAT, Day.SUN);
EnumSet<Day> allDays   = EnumSet.allOf(Day.class);
EnumSet<Day> noDays    = EnumSet.noneOf(Day.class);

System.out.println(weekdays); // [MON, TUE, WED, THU, FRI]
System.out.println(weekend);  // [SAT, SUN]
System.out.println(allDays.size()); // 7

EnumSet: समुच्चय क्रियाएँ

EnumSet मानक समुच्चय क्रियाओं—यूनियन, इंटरसेक्शन और कॉम्प्लीमेंट—का समर्थन करता है। बिट-वेक्टर कार्यान्वयन के कारण ये बेहद तेज़ होती हैं।

import java.util.*;

enum Permission { READ, WRITE, DELETE, ADMIN, EXPORT }

EnumSet<Permission> userPerms  = EnumSet.of(Permission.READ, Permission.WRITE);
EnumSet<Permission> adminPerms = EnumSet.allOf(Permission.class);

// Complement
EnumSet<Permission> missing = EnumSet.complementOf(userPerms);
System.out.println("Missing: " + missing);
// Missing: [DELETE, ADMIN, EXPORT]

// Intersection (retain)
EnumSet<Permission> shared = EnumSet.copyOf(userPerms);
shared.retainAll(adminPerms);
System.out.println("Shared: " + shared); // [READ, WRITE]

EnumMap: enum को मानों से मैप करना

EnumMap आंतरिक रूप से enum के क्रमांक का उपयोग ऐरे इंडेक्स के रूप में करता है—इसका O(1) लुकअप HashMap से तेज़ होता है।

import java.util.*;

enum Quarter { Q1, Q2, Q3, Q4 }

EnumMap<Quarter, Double> revenue = new EnumMap<>(Quarter.class);
revenue.put(Quarter.Q1, 125_000.0);
revenue.put(Quarter.Q2, 148_500.0);
revenue.put(Quarter.Q3, 132_750.0);
revenue.put(Quarter.Q4, 175_200.0);

double total = revenue.values().stream()
    .mapToDouble(Double::doubleValue).sum();
System.out.printf("Annual revenue: $%.0f%n", total);
// Annual revenue: $581450

EnumMap: क्रम में पुनरावृत्ति

EnumMap हमेशा कुंजियों पर enum की घोषणा के क्रम में पुनरावृत्ति करता है—न कि प्रविष्टि क्रम या हैश क्रम में।

import java.util.*;

enum Month { JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC }

EnumMap<Month, Integer> salesUnits = new EnumMap<>(Month.class);
salesUnits.put(Month.MAR, 1420);
salesUnits.put(Month.JAN, 980);
salesUnits.put(Month.FEB, 1105);

// Iterates JAN, FEB, MAR (declaration order, not insertion order)
for (var entry : salesUnits.entrySet()) {
    System.out.println(entry.getKey() + ": " + entry.getValue());
}
// JAN: 980
// FEB: 1105
// MAR: 1420

EnumSet के साथ अनुमति प्रणाली

कुशल अनुमति जाँच और साफ़ API डिज़ाइन के लिए EnumSet का उपयोग करने वाली भूमिका-आधारित अनुमति प्रणाली।

import java.util.*;

enum Permission { READ, WRITE, DELETE, PUBLISH, ADMIN }

record Role(String name, EnumSet<Permission> permissions) {
    boolean can(Permission p) { return permissions.contains(p); }
}

Role editor = new Role("Editor",
    EnumSet.of(Permission.READ, Permission.WRITE, Permission.PUBLISH));
Role viewer = new Role("Viewer",
    EnumSet.of(Permission.READ));

System.out.println(editor.can(Permission.WRITE));  // true
System.out.println(viewer.can(Permission.DELETE)); // false

EnumMap के साथ फ़ीचर फ़्लैग

फ़ीचर फ़्लैग प्रणालियों के लिए EnumMap बिल्कुल उपयुक्त है: enum कुंजियों के साथ तेज़ O(1) लुकअप।

import java.util.*;

enum Feature { DARK_MODE, BETA_EDITOR, AI_SUGGESTIONS, EXPORT_PDF }

class FeatureFlags {
    private final EnumMap<Feature, Boolean> flags = new EnumMap<>(Feature.class);

    public FeatureFlags() {
        for (Feature f : Feature.values()) flags.put(f, false);
    }

    public void enable(Feature f)  { flags.put(f, true); }
    public void disable(Feature f) { flags.put(f, false); }
    public boolean isEnabled(Feature f) { return flags.getOrDefault(f, false); }
}

FeatureFlags ff = new FeatureFlags();
ff.enable(Feature.DARK_MODE);
System.out.println(ff.isEnabled(Feature.DARK_MODE));      // true
System.out.println(ff.isEnabled(Feature.AI_SUGGESTIONS)); // false

प्रदर्शन: EnumSet बनाम HashSet

EnumSet एकल long बिटमास्क का उपयोग करता है (64 या उससे कम नियतांकों वाले enum के लिए)—इसकी क्रियाएँ O(1) बिट क्रियाएँ होती हैं। HashSet हैश बकेट का उपयोग करता है, इसलिए अधिक ओवरहेड के साथ धीमा होता है।

import java.util.*;

enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }

// EnumSet: bit operations on a long value
EnumSet<Day> workDays = EnumSet.range(Day.MON, Day.FRI);

// HashSet: hash table with boxing overhead
Set<Day> hashWorkDays = new HashSet<>(Arrays.asList(
    Day.MON, Day.TUE, Day.WED, Day.THU, Day.FRI));

// Both work, but EnumSet is ~5x faster for contains/add/remove
// and uses less memory
System.out.println(workDays.contains(Day.SAT));     // false
System.out.println(workDays.contains(Day.MON));     // true

EnumMap में getOrDefault और computeIfAbsent

EnumMap सभी Map क्रियाओं का समर्थन करता है, जिनमें getOrDefault, computeIfAbsent और merge शामिल हैं।

import java.util.*;

enum Category { FOOD, ELECTRONICS, CLOTHING, BOOKS }

EnumMap<Category, List<String>> catalog = new EnumMap<>(Category.class);

// computeIfAbsent creates the list on first use
catalog.computeIfAbsent(Category.BOOKS, k -> new ArrayList<>()).add("Clean Code");
catalog.computeIfAbsent(Category.BOOKS, k -> new ArrayList<>()).add("Effective Java");
catalog.computeIfAbsent(Category.ELECTRONICS, k -> new ArrayList<>()).add("Laptop");

System.out.println(catalog.get(Category.BOOKS));
// [Clean Code, Effective Java]
System.out.println(catalog.getOrDefault(Category.FOOD, List.of()));
// []

EnumMap के साथ मल्टीमैप पैटर्न

enum-कुंजी वाले मल्टीमैप बनाने के लिए EnumMap को List मानों के साथ संयोजित करें—इससे श्रेणी के अनुसार वस्तुओं का कुशल समूहकरण होता है।

import java.util.*;
import java.util.stream.*;

enum Priority { LOW, NORMAL, HIGH, URGENT }
record Task(String name, Priority priority) {}

List<Task> tasks = List.of(
    new Task("Fix login bug", Priority.URGENT),
    new Task("Update docs",   Priority.LOW),
    new Task("Add unit tests",Priority.NORMAL),
    new Task("Deploy hotfix", Priority.URGENT)
);

// Group by priority into EnumMap
EnumMap<Priority, List<Task>> byPriority = tasks.stream()
    .collect(Collectors.groupingBy(Task::priority,
        () -> new EnumMap<>(Priority.class),
        Collectors.toList()));

byPriority.forEach((p, ts) ->
    System.out.println(p + ": " + ts.stream().map(Task::name).collect(Collectors.joining(", "))));

EnumSet बनाम EnumMap का उपयोग कब करें

किसे कब चुनना चाहिए, इसका सारांश:

  • EnumSet: जब आपको enum मानों का समुच्चय चाहिए—अनुमतियाँ, सक्रिय फ़ीचर या चुने हुए दिन
  • EnumMap: जब आपको प्रत्येक enum नियतांक को किसी मान से मैप करना हो—प्रत्येक फ़ीचर का कॉन्फ़िगरेशन, प्रत्येक स्तर का स्कोर या प्रत्येक श्रेणी की वस्तुएँ
  • दोनों: enum कुंजियों के लिए HashSet/HashMap की जगह इन्हें प्राथमिकता दें—ये तेज़ हैं, कम मेमोरी लेते हैं और क्रम बनाए रखते हैं

त्वरित जाँच

64 या उससे कम नियतांकों वाले enum के लिए EnumSet किस आंतरिक डेटा संरचना का उपयोग करता है?

पुनरावृत्ति: EnumSet और EnumMap

मुख्य बातें:

  • EnumSet बिट वेक्टर का उपयोग करता है—छोटे enum समुच्चयों के लिए बेहद तेज़
  • EnumSet.of(), range(), allOf(), noneOf() सामान्य फ़ैक्टरी विधियाँ हैं
  • EnumMap क्रमांक-अनुक्रमित ऐरे का उपयोग करता है—O(1) लुकअप और घोषणा के क्रम में व्यवस्थित
  • अनुमति समुच्चयों, फ़ीचर फ़्लैग और सप्ताह के दिनों की फ़िल्टरिंग के लिए EnumSet का उपयोग करें
  • प्रति-श्रेणी कॉन्फ़िगरेशन, स्कोरिंग तालिकाओं और फ़ीचर-से-मान मैपिंग के लिए EnumMap का उपयोग करें
  • दोनों enum घोषणा का क्रम बनाए रखते हैं और हैश-आधारित संग्रहों से अधिक कुशल हैं
शुरुआत निःशुल्क

एआई शिक्षक के साथ Java सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
104
पाठ
374

अक्सर पूछे जाने वाले प्रश्न

क्या “EnumSet और EnumMap” पाठ निःशुल्क है?

हाँ—“EnumSet और EnumMap” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Java Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“EnumSet और EnumMap” में मैं क्या सीखूँगा?

कुशल और type-safe enum-आधारित collections के लिए EnumSet और EnumMap का उपयोग करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Java Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Java Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Java Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 4वाँ पाठ है।

“EnumSet और EnumMap” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Java Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Java Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. Enums को परिभाषित करना और उपयोग करना
  2. Fields और Methods वाले Enums
  3. Enums के साथ Switch Expressions
  4. EnumSet और EnumMap
← Java Academy पर वापस जाएँ