2010-09-02 14 views
6

यदि संग्रह iterext() के बजाय हैक्स्ट() को परिभाषित करता है। हैक्स्ट(), हम लूप को आसानी से लिख सकते हैं:Java.util.Collection क्यों नहीं है(), अगला अगला() है?

while(collection.hasNext()){…} 

इसके बजाय:

Iterator it= collection.iterator(); 
While(it.hasNext()){…} 

बेशक, मैं लूप for(E e:collection) मौजूद है के लिए आसान तरीका पता है।

इंटरफ़ेस इटरेटर क्यों मौजूद है?

उत्तर

7

यह धागा सुरक्षित नहीं होगा। संग्रह केवल एक "वर्तमान स्थिति" को बनाए रखने में सक्षम होगा ताकि आप इसे दो अलग-अलग धागे में एक साथ फिर से चालू नहीं कर सके।

इटेटरेटर एक साथ कई बार फिर से चलने वाले धागे की अनुमति देता है जो एक दूसरे के पैर की उंगलियों पर कदम नहीं उठाते हैं।

+1

... जब तक वे संग्रह को संशोधित नहीं करते हैं, वे इंगित कर रहे हैं। बाद के मामले में, एक ConcurrentModificationException फेंक दिया जाएगा। – gawi

9

क्योंकि आपके पास एक साथ Collection ऑब्जेक्ट के लिए एकाधिक मान्य Iterator ऑब्जेक्ट्स हो सकते हैं।

यह उपयोगी हो सकता है। यदि Collection ने next और hasNext विधियों को परिभाषित किया है, तो यह दृष्टिकोण रोक दिया जाएगा।

+0

एकाधिक इटरेटर? क्या आप एक उदाहरण दे सकते हैं? –

+0

शेनगुआन लू: जॉन कुगेलमैन अपने जवाब में बताते हुए एकाधिक इटरेटर थ्रेड का उपयोग करके आ सकते हैं। –

+0

ऐसे मामले भी हैं जहां आप एक ही धागे से एक से अधिक 'इटरेटर' चाहते हैं। उदाहरण के लिए, किसी भी डेटा संरचना जहां आपको एक दिखने की ज़रूरत है। – Borealid

2

प्राथमिक कारण यह है कि संग्रह को पुनरावृत्ति "राज्य" होना चाहिए। आप एक साथ कई पुनरावृत्तियों का समर्थन नहीं कर सके। PHP सरणी में पुनरावृत्ति स्थिति में कुछ ऐसा बनाया गया है और यह मुझे भ्रमित कर देता है।

3

मैं समझता हूं कि संग्रह से बाहर निकलने वाले इटरेटर को तर्क देने के लिए तर्क यह है कि उनमें से प्रकार (संग्रह के माध्यम से आगे बढ़ने के अलावा) हो सकते हैं। आप पीछे की ओर जाने के लिए अपना खुद का इटरेटर बना सकते हैं या सभी नोड्स पर जाकर एक डोम ग्राफ के माध्यम से पुनरावृत्ति की तरह कुछ कर सकते हैं।

संबंधित मुद्दे