मुझे यकीन है कि के लिए जवाब पता नहीं है, लेकिन मेरा अनुमान होगा: कोई। जावा कंपाइलर के लिए कोई रास्ता नहीं है, विशेष आवरण ArrayList से कम, यह जानने के लिए कि आपके द्वारा किए जाने वाले कार्यों को गैर-उत्परिवर्तित किया जाएगा और परिणामस्वरूप, आकार() के आवेषण को वही मान वापस करना चाहिए। इसलिए, मुझे यह बेहद असंभव लगता है कि जावा कंपाइलर आकार() को दोहराए गए कॉल को कारगर करेगा और उन्हें अस्थायी मान में संग्रहीत करेगा। यदि आपको उस स्तर के अनुकूलन की आवश्यकता है तो आपको मूल्य को स्थानीय चर में स्वयं स्टोर करना चाहिए। अन्यथा, हाँ, आप आकार() विधि को कॉल करने के साथ जुड़े फ़ंक्शन आमंत्रण ओवरहेड के लिए भुगतान करेंगे। नोट, हालांकि, आकार() विधि एक ArrayList के लिए ओ (1) है (हालांकि फ़ंक्शन कॉल ओवरहेड बहुत भारी है)। निजी तौर पर, मैं लूप से आकार() तक किसी भी कॉल को कारगर करता हूं और उन्हें लागू होने पर स्थानीय रूप से संग्रहीत करता हूं।
संपादित
हालांकि इस तरह के एक अनुकूलन एक जावा संकलक द्वारा नहीं किया जा सकता है, यह जिसे उपयुक्त है बताया गया है कि JIT ArrayList.size() के कार्यान्वयन इनलाइन कर सकते हैं ऐसी है कि यह केवल एक के बराबर होता है फ़ील्ड एक्सेस, बिना किसी अतिरिक्त विधि कॉल ओवरहेड के, इसलिए असल में लागत नगण्य है, हालांकि आप अभी भी एक अस्थायी रूप से सहेजकर थोड़ा बचा सकते हैं (जो संभावित रूप से मेमोरी लुकअप को खत्म कर सकता है और इसके बजाय एक सीपीयू रजिस्टर से परिवर्तनीय सेवा प्रदान कर सकता है)।
स्रोत
2010-05-18 11:44:02
यह ArrayList के लिए एक तेजी से कॉल है, लेकिन स्थानीय चर में परिणाम की दुकान करता है, तो आप एक परीक्षण के रूप में उपयोग प्रत्येक पाश पुनरावृत्ति में स्थिति। –
क्या आप इस प्रश्न को स्पष्ट कर सकते हैं। ऐसा लगता है कि कुछ लोग इसे "आकार() का आकलन करते हैं या यह एक क्षेत्र को" v. "के रूप में छोटा रूप से वापस कर देता है, आकार के लिए कई कॉल() को एक कॉल के साथ आकार में बदल दिया जाएगा() बाद में इनवॉक्शंस को प्रतिस्थापित किया जा रहा है एक स्थानीय चर द्वारा जिसमें पिछले परिणाम सहेजा गया था "। मैंने उत्तरार्द्ध के रूप में व्याख्या की है, जबकि अन्य ने पूर्व के रूप में व्याख्या की है। कृपया इसे पूरी तरह से स्पष्ट करें। स्पष्टीकरण के लिए –
धन्यवाद। –