2013-01-10 36 views
14

मैं समझता हूं कि प्रत्येक लूप के लिए नया Iterable और arrays के साथ काम करता है, लेकिन मुझे नहीं पता कि सरणी के साथ काम करते समय दृश्यों के पीछे क्या होता है।जावा में प्रत्येक लूप के लिए आदिम सरणी नए के साथ कैसे काम करती है?

क्या कोई इसे समझने में मेरी सहायता कर सकता है? अग्रिम में धन्यवाद।

int[] number = new int[10]; 

for(int i: number) { 

} 
+0

BTW, यह अगर आप ने कहा था कि क्यों सवाल मतदान किया गया था मदद की है का उपयोग करते हुए। –

+0

ऊपर की ओर, यदि यह दिलचस्प लगता है, खासकर अगर यह बाइट कोड आधार पर एक सामान्य (कुशल) पाश के बराबर है। लेकिन इसने किसी ने बिल्कुल जवाब नहीं दिया है। – AlexWien

उत्तर

3

अपने कोड में, आप स्मृति में 10 पूर्णांकों की एक सरणी आवंटित करते हैं और इसका संदर्भ प्राप्त करते हैं। फॉर-लूप में आप सरणी में प्रत्येक आइटम पर बस फिर से सक्रिय होते हैं, जो प्रारंभ में सभी वस्तुओं के लिए 0 होगा। प्रत्येक आइटम का मान आपके फॉर-लूप में घोषित चर i में संग्रहीत किया जाएगा क्योंकि आप सरणी तत्वों को पुन: सक्रिय करते हैं।

for(int j = 0; j < number.length; j++) { 
    int i = number[j]; 
    ... 
} 

जहां j एक आंतरिक उत्पन्न संदर्भ कि सामान्य उपयोगकर्ता पहचानकर्ता से विरोध नहीं करता है:

12

पाश के बराबर है।

+0

क्या यह संदर्भ प्रकारों के सरणी के लिए भी सच है? जैसेक्या जावा आंतरिक रूप से किसी ऑब्जेक्ट [] पर इस कार्यान्वयन का उपयोग करेगा, या यह कुछ और करेगा (जैसे इसे एक इटरटेबल में परिवर्तित करें)? – Karakuri

+0

@ करकुरी मैं यह भी दावा नहीं कर रहा हूं कि यह वास्तव में आदिम सरणी के लिए कैसे लागू किया जाता है, केवल आवश्यक व्यवहार बराबर है। 'ऑब्जेक्ट []' के लिए आवश्यक व्यवहार भी बराबर है। –

1

सरणियों पर एक अनिवार्य रूप से इस संरचना पर "चीनी" है के लिए:

for(int i = 0;i<number.length;i++) 
{ 
} 

ताकि लोगों को एक संरचना पर इस्तेमाल कर सकते हैं पाश के लिए बढ़ाया मैं कल्पना इस भाषा के एक निर्माण के रूप में प्रदान की गई थी होता है कि पुराने तरीके से फिर से शुरू किया गया था।

+0

इससे मुझे लंबाई -1 के माध्यम से मान 0 मिलेगा। यह सरणी तत्वों के मान लेना चाहिए, उदाहरण कोड में सभी 0। –

+1

@ पेट्रीसियाहानहान गलत है, मेरे ब्रेसिज़ के अंदर कोई कोड नहीं है। मैं चीनी – Woot4Moo

2

इस के बराबर है:

final int len = number.length; 
for(int j = 0; j < len; j++) { 
    int i = number[j]; 
} 

ध्यान दें कि foreach प्रत्येक पाश में .length का मूल्यांकन नहीं होगा:

for(int x = 0; x < number.length; x++) { 
    int i = number[x]; 
} 
1

इस के बराबर है। यह भी JVM द्वारा समाप्त किया जा सकता है, लेकिन विशेष रूप से संग्रह के मामले में, जहां कुछ

for(int j = 0; j < collection.size(); j++) { 

का प्रयोग करेंगे यह तेजी से

int len = collection.size() 
for(int j = 0; j < len; j++) { 
+0

के पीछे होने वाले निर्माण की व्याख्या कर रहा था धन्यवाद, मुझे प्रत्येक लूप के बारे में पता नहीं था, हर बार लंबाई का मूल्यांकन नहीं करता था। –

6

थोड़ा करने के लिए एक (छोटे) अंतर देर में आता है , लेकिन यह यहाँ है।

कंपाइलर जानता है कि क्या आप संग्रह के लिए या सरणी के लिए प्रत्येक लूप स्टेटमेंट का उपयोग कर रहे हैं।

यदि संग्रह के लिए उपयोग किया जाता है, कंपाइलर Iterator का उपयोग कर लूप के बराबर के लिए प्रत्येक लूप का अनुवाद करता है।

यदि किसी सरणी के लिए उपयोग किया जाता है, कंपाइलर प्रत्येक लूप को इंडेक्स वैरिएबल का उपयोग करके लूप के बराबर के लिए अनुवाद करता है।

Here is a description at oracle.com

0

IntStream.range (1,4), इस्तेमाल किया जा सकता है, तो जावा 8.

+0

धन्यवाद !!!!!!!!!! –