इन दो इंटरफेस के बीच सटीक अंतर क्या है? करता है Enumeration
का उपयोग करने पर लाभ है Iterator
? यदि कोई विस्तृत रूप दे सकता है, तो एक संदर्भ लेख की सराहना की जाएगी।
इन दो इंटरफेस के बीच सटीक अंतर क्या है? करता है Enumeration
का उपयोग करने पर लाभ है Iterator
? यदि कोई विस्तृत रूप दे सकता है, तो एक संदर्भ लेख की सराहना की जाएगी।
जवाबों:
Iterator
इंटरफ़ेस के लिए जावा एपीआई विनिर्देश को देखते हुए, निम्नलिखित के बीच अंतर की व्याख्या है Enumeration
:
Iterators दो तरीकों से गणना से भिन्न होते हैं:
- Iterators कॉल करने वाले को अच्छी तरह से परिभाषित शब्दार्थ के साथ चलना के दौरान अंतर्निहित संग्रह से तत्वों को निकालने की अनुमति देते हैं।
- विधि नामों में सुधार किया गया है।
लब्बोलुआब यह है, दोनों Enumeration
और Iterator
लगातार तत्वों दे देंगे, लेकिन Iterator
इस तरह से सुधार हुआ है तो विधि के नाम छोटे होते हैं, और एक अतिरिक्त है remove
विधि। यहाँ एक पक्ष की तुलना है:
Enumeration Iterator
---------------- ----------------
hasMoreElement() hasNext()
nextElement() next()
N/A remove()
जैसा कि जावा एपीआई विनिर्देशों में भी उल्लेख किया गया है, नए कार्यक्रमों के लिए, Iterator
पर प्राथमिकता दी जानी चाहिए Enumeration
, क्योंकि "Iterator जावा संग्रह ढांचे में गणना की जगह लेता है।" ( Iterator
विनिर्देशों से।)
Iterators विफल-तेज़ हैं । यानी जब कोई थ्रेड जोड़ / निकालें ऑपरेशन के द्वारा संग्रह को बदलता है, जबकि एक अन्य थ्रेड hasNext() or next()
विधि का उपयोग करके एक इटरेटर के माध्यम से इसे ट्रेस कर रहा है, तो थ्रेटर फेंकने से जल्दी विफल हो जाता है ConcurrentModificationException
। पुनरावृत्तियों के असफल-तेज़ व्यवहार का उपयोग केवल बग का पता लगाने के लिए किया जा सकता है। हैशटेबल, वेक्टर जैसी कक्षाओं के तरीकों द्वारा लौटाए गए एन्युमरेशन्स फेल-फास्ट नहीं हैं जो कोड के ब्लॉक को उस nextElement()
पद्धति के अंदर सिंक्रनाइज़ करके प्राप्त किया जाता है जो वर्तमान वेक्टर ऑब्जेक्ट को लॉक करता है जिसमें बहुत समय खर्च होता है।
"आधिकारिक तौर पर", वे अतिरिक्त संचालन (जैसे, हटाने) का समर्थन करने वाले इट्रेटर इंटरफ़ेस के साथ समान माना जाता है। आमतौर पर, प्रवृत्ति पुनरावृत्तियों का उपयोग करना है।
यहाँ गणना इंटरफ़ेस javadocs से है :
नोट: इस इंटरफ़ेस की कार्यक्षमता Iterator इंटरफ़ेस द्वारा दोहराई गई है। इसके अलावा, Iterator एक वैकल्पिक निष्कासन ऑपरेशन जोड़ता है, और इसमें कम विधि नाम होते हैं। गणना के लिए नए कार्यान्वयन को Iterator का उपयोग करने पर विचार करना चाहिए।
Enumeration और Iterator में बुनियादी तीन अंतर हैं
एन्यूमरेशन
1. यह केवल लैगसी क्लास (उदाहरण के लिए Vector
) के लिए उपयोग किया जाता है।
Enumeration e = v.elements();
v is the object of `Vector` class
2. पढ़ें ऑपरेशन किया जा सकता है, हम तत्व नहीं निकाल सकते हैं।
3. दो विधि उपलब्ध हैं
इटरेटर
यह सभी संग्रह के लिए लागू है
Iterator itr = c.iterator();
where c is any `Collection` class
पढ़ें और निकालें ऑपरेशन किया जा सकता है
तीन विधि उपलब्ध हैं
दोनों में मर्यादा
Add object
औरReplace object
यदि आप अपना स्वयं का संग्रह वर्ग लिख रहे हैं, और आप किसी भी मौजूदा वर्ग का विस्तार कर रहे हैं या संग्रह ढांचे के किसी भी इंटरफेस को लागू कर रहे हैं, तो आपके पास मूल रूप से Iterator का उपयोग करने के अलावा कोई विकल्प नहीं है।
यदि किसी कारण से (जो मैं नहीं सोच सकता) आप एक कस्टम संग्रह वर्ग बना रहे हैं जो java.util.Collection या java.util से किसी भी तरह से संबंधित नहीं है। आप अभी भी Iterable को लागू करना चाहिए ताकि लोग उपयोग कर सकें लूप के लिए आपकी कक्षा।
मुख्य अलग है एन्यूमरेशन निष्कासन () विधि को उजागर नहीं करता है। इसके अलावा, Iterator एक अंतर्निहित वस्तु पर एक साथ नेविगेशन और संशोधन की अनुमति नहीं देता है। उनके पास यह देखने के लिए नियंत्रण है कि समवर्ती संशोधन हैं या नहीं, और इसलिए अधिक प्रसंस्करण होता है। तो Enumeration का प्रदर्शन Iterator की तुलना में लगभग 50% तेज है। अगर हमें इस तरह के सिंक्रोनाइज़ेशन को अनदेखा करते हुए केवल नेविगेशन की आवश्यकता है, तो बस एन्यूमरेशन का उपयोग करें।
1) Iterator और Enumeration के बीच मुख्य अंतर तत्व को हटाते समय संग्रह को हटाता है। Iterator संग्रह के ट्रैवर्सल के दौरान तत्व को निकाल सकता है क्योंकि इसमें हटा () विधि है। गणना में हटाने () विधि नहीं है।
2) अभिज्ञान प्रकृति में विफल-सुरक्षित है। यह समवर्तीModificationException फेंक नहीं करता है यदि संग्रह ट्रैवर्सल के दौरान संशोधित किया गया है। Iterator प्रकृति में असफल-तेज़ है। यदि यह संग्रह को अपने स्वयं के निष्कासन () विधि के अलावा पुनरावृति करते समय संशोधित किया जाता है, तो यह समवर्तीModificationException को फेंकता है।
3) एन्यूमरेशन एक विरासत इंटरफ़ेस है, जिसका उपयोग वेक्टर, हैशटेबल ट्रैवर्सिंग के लिए किया जाता है। Iterator एक विरासत इंटरफ़ेस नहीं है। Iterator का उपयोग HashMap, LinkedList, ArrayList, HashSet, TreeMap, TreeSet के ट्रैवर्सल के लिए किया जा सकता है।
डेटा को पुनः प्राप्त करने के लिए पुनरावृत्ति और गणना दोनों का उपयोग किया जाता है, अंतर यह है कि गणना का उपयोग केवल विरासत वर्गों अर्थात वेक्टर / स्टैक के लिए किया जा सकता है जबकि पुनरावृत्तियों का उपयोग बाकी के लिए किया जा सकता है। मैप में कुंजी सेट के लिए गणना का भी उपयोग किया जा सकता है।