2013-01-03 18 views
5

मैं जानना चाहता हूं कि जावा में लूप के लिए उन्नत कैसे काम करता है (मान लीजिए कि मुझे यह पता चलता है कि इस लूप का मूल उपयोग कैसे है और यह सामान्य रूप से कैसे काम करता है) ।जावा लूप के लिए उन्नत - संपादन मूल ऐरे मान

निम्नलिखित कोड को देखते हुए:

String[] a = {"dog", "cat", "turtle"}; 

for (String s : a) { 
    out.println("String: " + s); 
    s = in.readLine("New String? "); 
} 

यह वास्तव में मूल सूची 'एक' संशोधित नहीं करता है। क्यों नहीं? स्मृति प्रबंधन कैसे काम करता है? 'एक [i]' के समान मेमोरी सेल का संदर्भ नहीं है?

मैंने ऑरैक दस्तावेज पर पढ़ा है जो मूल सरणी से तत्वों को निकालने के लिए लूप के लिए बढ़ाया नहीं जा सकता है, यह समझ में आता है। क्या यह मूल्यों को संशोधित करने के लिए समान है?

अग्रिम

+3

स्ट्रिंग अपरिवर्तनीय है .. http://stackoverflow.com/a/8798424/112500 – Shashi

+0

's' एक चर है जिसमें कंटेनर के तत्व का संदर्भ शामिल है। –

उत्तर

10

धन्यवाद 'एक [i]' का एक ही स्मृति सेल के लिए एक संदर्भ नहीं 'एस' है?

मूल रूप से, हाँ। लेकिन फिर in.readLine एक नई स्ट्रिंग ऑब्जेक्ट का संदर्भ प्रस्तुत करता है, जिसे आप s को ओवरराइट करने के लिए उपयोग करते हैं। लेकिन केवल s ओवरराइडिंग स्ट्रिंग नहीं है, न ही सरणी में संदर्भ।

+0

बहुत बहुत धन्यवाद, यह वास्तव में सहायक था। अब यह स्पष्ट है। – jnardiello

+1

@ ओलिवर, क्या आपका मतलब है कि संदर्भ [i] के बजाय किसी अन्य स्ट्रिंग ऑब्जेक्ट को रेफर करना शुरू कर देता है जब हम ऐसा करते हैं = नया स्ट्रिंग ("एक्स")? – Abhinav

+1

@Abhinav: हाँ .. –

4

s एक स्थानीय चर है जो String उदाहरण को इंगित करता है। यह a[i] से जुड़ा नहीं है, वे बस शुरुआत में वही मान रखते हैं।

3

आप केवल लिख सकते हैं

for (int i = 0; i < a.length; i++) { 
    out.println("String: " + a[i]); 
    a[i] = in.readLine("New String? "); 
} 

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

+0

आपने आखिरी बिंदु को साफ़ कर दिया जो अभी भी धुंधला था। आपका बहुत बहुत धन्यवाद! – jnardiello

+1

यदि आप सूची के लिए प्रविष्टियों को हटाना चाहते हैं() या प्रविष्टियों को बदलना चाहते हैं, तो आपको स्पष्ट रूप से एक इटरेटर का उपयोग करना होगा। –

1

किसी ऑब्जेक्ट पर पता जैसे s पर विचार करें। यहां बात यह है कि s लूप का उपयोग करते समय सरणी के एक निश्चित मान को इंगित कर रहा है। जब आप लूप के अंदर s को पुन: प्राप्त करते हैं तो बस होता है कि s अन्य मान पर इंगित करता है लेकिन सरणी का मूल मान संशोधित नहीं होता है क्योंकि आप केवल पताs बदल रहे हैं।

String[] a = {"dog", "cat", "turtle"}; 

for (String s : a) { 
    //s --> "dog" 
    out.println("String: " + s); 
    s = in.readLine("New String? "); 
    //s --> the new string the user inputs 
} 
+1

विस्तृत उत्तर के लिए बहुत बहुत धन्यवाद। जो मैं खो रहा था वह तथ्य यह है कि रीडलाइन एक नया पता लौट रही है। – jnardiello

+0

यदि आपके प्रश्न का उत्तर दिया गया है तो उसे उत्तर देने और उत्तर स्वीकार करने के लिए स्वतंत्र महसूस करें;) – Averroes

1

प्रत्येक पुनरावृत्ति के लिए स्ट्रिंग का प्रारंभिक स्ट्रिंग ऑब्जेक्ट में स्ट्रिंग ए [] में संदर्भ होता है। लेकिन फिर इसे किसी अन्य स्ट्रिंग ऑब्जेक्ट को संदर्भित किया जाता है जिसे inreadLine() द्वारा वापस किया जाता है।