जावा गणना और Iterator के बीच अंतर


120

इन दो इंटरफेस के बीच सटीक अंतर क्या है? करता है Enumerationका उपयोग करने पर लाभ है Iterator? यदि कोई विस्तृत रूप दे सकता है, तो एक संदर्भ लेख की सराहना की जाएगी।


3
मैंने एक Google खोज का उपयोग किया था और पहला परिणाम Enumeration बनाम Iterator के
विजेता ह्यूगो

जवाबों:


142

Iteratorइंटरफ़ेस के लिए जावा एपीआई विनिर्देश को देखते हुए, निम्नलिखित के बीच अंतर की व्याख्या है Enumeration:

Iterators दो तरीकों से गणना से भिन्न होते हैं:

  • Iterators कॉल करने वाले को अच्छी तरह से परिभाषित शब्दार्थ के साथ चलना के दौरान अंतर्निहित संग्रह से तत्वों को निकालने की अनुमति देते हैं।
  • विधि नामों में सुधार किया गया है।

लब्बोलुआब यह है, दोनों Enumerationऔर Iteratorलगातार तत्वों दे देंगे, लेकिन Iteratorइस तरह से सुधार हुआ है तो विधि के नाम छोटे होते हैं, और एक अतिरिक्त है removeविधि। यहाँ एक पक्ष की तुलना है:

  Enumeration                     Iterator
  ----------------                ----------------
  hasMoreElement()                hasNext()
  nextElement()                   next()
  N/A                             remove()

जैसा कि जावा एपीआई विनिर्देशों में भी उल्लेख किया गया है, नए कार्यक्रमों के लिए, Iteratorपर प्राथमिकता दी जानी चाहिए Enumeration, क्योंकि "Iterator जावा संग्रह ढांचे में गणना की जगह लेता है।" ( Iteratorविनिर्देशों से।)


9
मुझे लगता है कि संक्षिप्त विवरण के बारे में इस उत्तर से थोड़ा स्पष्टीकरण गायब है।
मार्टन बॉड्यूज

@Pa__Draper: संपादन पोस्ट में नए अर्थ नहीं जोड़ने चाहिए, जो कि टिप्पणियों के लिए हैं।
एमिल

2
@coobird क्या आप सुनिश्चित हैं कि "गणना आमतौर पर तेज़ हैं"? चूँकि एन्यूमरेशन में "अगले इलेमेंट के अंदर कोड का ब्लॉकिंग सिंक्रोनाइज़ेशन" () है और हमारे पास Iterators पर सिंक्रोनाइज़ेशन नहीं है जिसके कारण ConcurrentModificationException rit है? क्या हम कहते हैं कि Iterators आमतौर पर तेज़ होते हैं और Enumerations थोड़ा सुरक्षित होते हैं। ??
कानूनगो सुगुमार

@KanagaveluSugumar आपको इंगित करने के लिए धन्यवाद। (मैंने इस बात पर ध्यान नहीं दिया कि इस चर्चा में अतिरिक्त चर्चा जोड़ी गई थी।) मैंने संपादन को वापस ले लिया है, क्योंकि यह पूरी तरह से सही नहीं था।
कोबर्ड

मुझे लगता है कि यह इंगित करने योग्य है कि हटाने () Iterator इंटरफ़ेस पर एक वैकल्पिक विधि है और काफी कार्यान्वयन कक्षाएं इसे लागू नहीं करती हैं।
कुटज़ी

35

Iterators विफल-तेज़ हैं । यानी जब कोई थ्रेड जोड़ / निकालें ऑपरेशन के द्वारा संग्रह को बदलता है, जबकि एक अन्य थ्रेड hasNext() or next()विधि का उपयोग करके एक इटरेटर के माध्यम से इसे ट्रेस कर रहा है, तो थ्रेटर फेंकने से जल्दी विफल हो जाता है ConcurrentModificationException। पुनरावृत्तियों के असफल-तेज़ व्यवहार का उपयोग केवल बग का पता लगाने के लिए किया जा सकता है। हैशटेबल, वेक्टर जैसी कक्षाओं के तरीकों द्वारा लौटाए गए एन्युमरेशन्स फेल-फास्ट नहीं हैं जो कोड के ब्लॉक को उस nextElement()पद्धति के अंदर सिंक्रनाइज़ करके प्राप्त किया जाता है जो वर्तमान वेक्टर ऑब्जेक्ट को लॉक करता है जिसमें बहुत समय खर्च होता है।


5
केवल आंशिक रूप से सच है: यह व्यवहार इंटरफ़ेस में परिभाषित नहीं है, यह Iterator के कार्यान्वयन पर निर्भर है। यह सच है कि java.util (HashSet, ArrayList आदि) में 'पुराना' संग्रह कार्यान्वयन इस व्यवहार को प्रदर्शित करता है। हालाँकि, नए 'समवर्ती' संग्रह कभी भी एक समवर्ती संगीत एकीकरण को नहीं फेंकेंगे, वे पुनरावृति के निर्माण के समय के रूप में संग्रह को पार कर लेंगे। अन्य कार्यान्वयन अभी भी अलग व्यवहार दिखा सकते हैं।
कुटज़ी

1
यह भी इंगित करने के लायक है: "ध्यान दें कि असफल-तेज़ व्यवहार की गारंटी नहीं दी जा सकती है क्योंकि यह आम तौर पर बोल रहा है, असम्बद्ध समवर्ती संशोधन की उपस्थिति में किसी भी हार्ड गारंटी को असंभव करना है। असफल-फास्ट ऑपरेशन एक सर्वोत्तम-प्रयास के आधार पर ConcurrentModificationException को फेंकते हैं। इसलिए। यह एक ऐसा प्रोग्राम लिखना गलत होगा जो इस अपवाद पर निर्भर करता है इसकी शुद्धता के लिए: ConcurrentModificationException का उपयोग केवल बग का पता लगाने के लिए किया जाना चाहिए। " docs.oracle.com/javase/7/docs/api/java/util/…
Kutzi

11

"आधिकारिक तौर पर", वे अतिरिक्त संचालन (जैसे, हटाने) का समर्थन करने वाले इट्रेटर इंटरफ़ेस के साथ समान माना जाता है। आमतौर पर, प्रवृत्ति पुनरावृत्तियों का उपयोग करना है।

यहाँ गणना इंटरफ़ेस javadocs से है :

नोट: इस इंटरफ़ेस की कार्यक्षमता Iterator इंटरफ़ेस द्वारा दोहराई गई है। इसके अलावा, Iterator एक वैकल्पिक निष्कासन ऑपरेशन जोड़ता है, और इसमें कम विधि नाम होते हैं। गणना के लिए नए कार्यान्वयन को Iterator का उपयोग करने पर विचार करना चाहिए।


6

एक साधारण तथ्य लेकिन पिछले उत्तरों में उल्लेख नहीं किया गया है कि Iterator<T>इसका उपयोग संरचना की Iterable<T>व्याख्या करने में किया जाता है for(_type_ element:collection){...}


5

Enumeration और Iterator में बुनियादी तीन अंतर हैं

एन्यूमरेशन
1. यह केवल लैगसी क्लास (उदाहरण के लिए Vector) के लिए उपयोग किया जाता है।

    Enumeration e = v.elements();  
    v is the object of `Vector` class

2. पढ़ें ऑपरेशन किया जा सकता है, हम तत्व नहीं निकाल सकते हैं।
3. दो विधि उपलब्ध हैं

  • सार्वजनिक बूलियन hasNextElement ();
  • सार्वजनिक वस्तु अगला भुगतान ();

इटरेटर

  1. यह सभी संग्रह के लिए लागू है

    Iterator itr = c.iterator();  
    where c is any `Collection` class
  2. पढ़ें और निकालें ऑपरेशन किया जा सकता है

  3. तीन विधि उपलब्ध हैं

    • सार्वजनिक बूलियन hasNext ();
    • सार्वजनिक वस्तु अगला ();
    • सार्वजनिक शून्य हटाने ();

दोनों में मर्यादा

  • केवल आगे की दिशा में ले जाएं
  • के लिए कोई विधि नहीं है Add objectऔरReplace object

2

यदि आप अपना स्वयं का संग्रह वर्ग लिख रहे हैं, और आप किसी भी मौजूदा वर्ग का विस्तार कर रहे हैं या संग्रह ढांचे के किसी भी इंटरफेस को लागू कर रहे हैं, तो आपके पास मूल रूप से Iterator का उपयोग करने के अलावा कोई विकल्प नहीं है।

यदि किसी कारण से (जो मैं नहीं सोच सकता) आप एक कस्टम संग्रह वर्ग बना रहे हैं जो java.util.Collection या java.util से किसी भी तरह से संबंधित नहीं है। आप अभी भी Iterable को लागू करना चाहिए ताकि लोग उपयोग कर सकें लूप के लिए आपकी कक्षा।


2

मुख्य अलग है एन्यूमरेशन निष्कासन () विधि को उजागर नहीं करता है। इसके अलावा, Iterator एक अंतर्निहित वस्तु पर एक साथ नेविगेशन और संशोधन की अनुमति नहीं देता है। उनके पास यह देखने के लिए नियंत्रण है कि समवर्ती संशोधन हैं या नहीं, और इसलिए अधिक प्रसंस्करण होता है। तो Enumeration का प्रदर्शन Iterator की तुलना में लगभग 50% तेज है। अगर हमें इस तरह के सिंक्रोनाइज़ेशन को अनदेखा करते हुए केवल नेविगेशन की आवश्यकता है, तो बस एन्यूमरेशन का उपयोग करें।


यह सच है कि एन्यूमरेशन निष्कासन (") विधि को" नहीं "करता है - लेकिन यह संग्रह के निष्कासन () एपी के आह्वान पर भी ध्यान नहीं देता है। उदाहरण के लिए निम्नलिखित कोड सिर्फ प्रिंट करेगा: एएए, सीसीसी, ईईई। -------------------------------------------------- --- वेक्टर <स्ट्रिंग> v = नया वेक्टर <स्ट्रिंग> (6); v.add ( "एएए"); v.add ( "बीबीबी"); v.add ( "सीसीसी"); v.add ( "DDD"); v.add ( "EEE"); v.add ( "FFF"); एनुमरेशन <string> en = v.elements (); जबकि (en.hasMoreElements ()) स्ट्रिंग मूल्य = (स्ट्रिंग) en.nextElement (); Println (मूल्य); v.remove (मान);
javauser71

1

1) Iterator और Enumeration के बीच मुख्य अंतर तत्व को हटाते समय संग्रह को हटाता है। Iterator संग्रह के ट्रैवर्सल के दौरान तत्व को निकाल सकता है क्योंकि इसमें हटा () विधि है। गणना में हटाने () विधि नहीं है।

2) अभिज्ञान प्रकृति में विफल-सुरक्षित है। यह समवर्तीModificationException फेंक नहीं करता है यदि संग्रह ट्रैवर्सल के दौरान संशोधित किया गया है। Iterator प्रकृति में असफल-तेज़ है। यदि यह संग्रह को अपने स्वयं के निष्कासन () विधि के अलावा पुनरावृति करते समय संशोधित किया जाता है, तो यह समवर्तीModificationException को फेंकता है।

3) एन्यूमरेशन एक विरासत इंटरफ़ेस है, जिसका उपयोग वेक्टर, हैशटेबल ट्रैवर्सिंग के लिए किया जाता है। Iterator एक विरासत इंटरफ़ेस नहीं है। Iterator का उपयोग HashMap, LinkedList, ArrayList, HashSet, TreeMap, TreeSet के ट्रैवर्सल के लिए किया जा सकता है।


0

गणना का उपयोग केवल विरासत वर्ग (वेक्टर, स्टैक ...) के लिए किया जा सकता है, जबकि Iterator का उपयोग सभी के लिए किया जा सकता है।


-1

डेटा को पुनः प्राप्त करने के लिए पुनरावृत्ति और गणना दोनों का उपयोग किया जाता है, अंतर यह है कि गणना का उपयोग केवल विरासत वर्गों अर्थात वेक्टर / स्टैक के लिए किया जा सकता है जबकि पुनरावृत्तियों का उपयोग बाकी के लिए किया जा सकता है। मैप में कुंजी सेट के लिए गणना का भी उपयोग किया जा सकता है।


आपने कहाँ देखा कि आप मैप के प्रमुख सेटों के लिए Enumeration का उपयोग कर सकते हैं ??
कुटज़ी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.