JShell Java 9 में पेश किया गया एक इंटरैक्टिव REPL टूल है जो मैप कार्यान्वयन जैसे डेटा संरचनाओं का त्वरित परीक्षण और सीखने के लिए आदर्श है। Java में Map इंटरफेस कुंजी-मान जोड़े को संग्रहीत करता है, और इसकी तीन मुख्य कार्यान्वयन कक्षाएं हैं जिनके अलग-अलग क्रम व्यवहार हैं।
तीन Map कार्यान्वयन की तुलना
| कार्यान्वयन | क्रम | नल कुंजी | नल मान | थ्रेड-सुरक्षित | प्रदर्शन |
|---|---|---|---|---|---|
| HashMap | कोई गारंटी नहीं (अनियमित) | अनुमत (1) | अनुमत | नहीं | O(1) सर्वोत्तम |
| LinkedHashMap | सम्मिलन क्रम | अनुमत (1) | अनुमत | नहीं | O(1) + ओवरहेड |
| TreeMap | कुंजियों का प्राकृतिक क्रम (सॉर्टेड) | अनुमत नहीं | अनुमत | नहीं | O(log n) |
JShell सत्र: HashMap
विशेषता: तत्व न तो सम्मिलन क्रम में और न ही सॉर्टेड क्रम में संग्रहीत होते हैं।
jshell> HashMap hashMap = new HashMap<>()
hashMap ==> {}
jshell> hashMap.put("Adithya", 101)
$2 ==> null
jshell> hashMap.put("Jai", 102)
$3 ==> null
jshell> hashMap.put("Chaitanya", 103)
$4 ==> null
jshell> hashMap.put("Ravi", 104)
$5 ==> null
jshell> hashMap
hashMap ==> {Chaitanya=103, Jai=102, Ravi=104, Adithya=101}
// नोट: क्रम अनियमित है (हैश-आधारित)
JShell सत्र: LinkedHashMap
विशेषता: तत्व सम्मिलन क्रम में संग्रहीत होते हैं।
jshell> LinkedHashMap linkedHashMap = new LinkedHashMap<>()
linkedHashMap ==> {}
jshell> linkedHashMap.put("Raja", 101)
$8 ==> null
jshell> linkedHashMap.put("Adithya", 102)
$9 ==> null
jshell> linkedHashMap.put("Surya", 103)
$10 ==> null
jshell> linkedHashMap.put("Vamsi", 104)
$11 ==> null
jshell> linkedHashMap
linkedHashMap ==> {Raja=101, Adithya=102, Surya=103, Vamsi=104}
// नोट: सम्मिलन क्रम संरक्षित है
JShell सत्र: TreeMap
विशेषता: तत्व कुंजियों के प्राकृतिक क्रम (सॉर्टेड) में संग्रहीत होते हैं।
jshell> TreeMap treeMap = new TreeMap<>()
treeMap ==> {}
jshell> treeMap.put("Raj", 101)
$14 ==> null
jshell> treeMap.put("Pavan", 102)
$15 ==> null
jshell> treeMap.put("Arjun", 103)
$16 ==> null
jshell> treeMap.put("Manoj", 104)
$17 ==> null
jshell> treeMap
treeMap ==> {Arjun=103, Manoj=104, Pavan=102, Raj=101}
// नोट: वर्णानुक्रम में सॉर्टेड (Arjun, Manoj, Pavan, Raj)
व्यावहारिक JShell प्रयोग
jshell> // TreeMap में कस्टम Comparator
jshell> TreeMap reverseMap = new TreeMap<>(Comparator.reverseOrder())
reverseMap ==> {}
jshell> reverseMap.put("Raj", 101)
$2 ==> null
jshell> reverseMap.put("Arjun", 103)
$3 ==> null
jshell> reverseMap
reverseMap ==> {Raj=101, Pavan=102, Manoj=104, Arjun=103}
// उल्टा वर्णानुक्रम
jshell> // LinkedHashMap: एक्सेस क्रम (LRU कैश के लिए)
jshell> LinkedHashMap lruCache = new LinkedHashMap<>(16, 0.75f, true)
lruCache ==> {}
jshell> lruCache.put(1, "One")
$5 ==> null
jshell> lruCache.put(2, "Two")
$6 ==> null
jshell> lruCache.get(1) // एक्सेस क्रम अपडेट करता है
$7 ==> "One"
jshell> lruCache
lruCache ==> {2=Two, 1=One} // 1 हाल ही में एक्सेस किया गया, अंत में चला गया
सामान्य ऑपरेशन (सभी Maps के लिए)
jshell> Map map = new HashMap<>()
map ==> {}
jshell> map.put("A", 1)
$2 ==> null
jshell> map.get("A")
$3 ==> 1
jshell> map.getOrDefault("Z", 99)
$4 ==> 99
jshell> map.containsKey("A")
$5 ==> true
jshell> map.containsValue(1)
$6 ==> true
jshell> map.remove("A")
$8 ==> 1
jshell> map.size()
$9 ==> 0
jshell> map.isEmpty()
$10 ==> true
jshell> // बल्क ऑपरेशन
jshell> map.putAll(Map.of("X", 10, "Y", 20, "Z", 30))
$11 ==> null
jshell> map.keySet()
$12 ==> [X, Y, Z]
jshell> map.values()
$13 ==> [10, 20, 30]
jshell> map.entrySet()
$14 ==> [X=10, Y=20, Z=30]
jshell> // Java 9+ फैक्टरी मेथड्स
jshell> Map.of("A", 1, "B", 2) // अपरिवर्तनीय
$15 ==> {A=1, B=2}
jshell> Map.ofEntries(Map.entry("A", 1), Map.entry("B", 2))
$16 ==> {A=1, B=2}
कौन सा चुनें?
- HashMap: सामान्य उद्देश्य, उच्चतम प्रदर्शन, क्रम मायने नहीं रखता।
- LinkedHashMap: जब सम्मिलन क्रम (या एक्सेस क्रम) मायने रखता है - कॉन्फ़िगरेशन, कैश, क्रमबद्ध प्रसंस्करण।
- TreeMap: जब सॉर्टेड कुंजियों की आवश्यकता होती है - रेंज क्वेरीज, नेविगेशन (
firstKey(),higherKey(),subMap())।
थ्रेड सुरक्षा नोट
इनमें से कोई भी थ्रेड-सुरक्षित नहीं है। समवर्ती पहुंच के लिए उपयोग करें:
ConcurrentHashMap(अनुशंसित - उच्च समवर्ती)Collections.synchronizedMap(new HashMap<>())(सरल लेकिन धीमा)