2010-10-28 8 views
9

जावा में सूची या मानचित्र पर कॉलिंग आकार() कितना महंगा है? या यदि अक्सर उपयोग किया जाता है तो एक चर में आकार() का मान सहेजना बेहतर होता है?जावा में सूची या मानचित्र पर कॉलिंग आकार() कितना महंगा है?

+1

+1 अच्छा क्यूएन निरु – abi1964

उत्तर

13

उत्तर यह है कि यह वास्तविक कार्यान्वयन वर्ग पर निर्भर करता है। कुछ Map और Collection कक्षाओं के लिए, size() एक सस्ता निरंतर समय ऑपरेशन है। दूसरों के लिए, यह सदस्यों की गिनती हो सकती है।

Java Collections Cheatsheet (V2) आमतौर पर इस तरह की जानकारी के लिए एक अच्छा स्रोत है, लेकिन मेजबान सर्वर वर्तमान में थोड़ा बीमार है।

"coderfriendly.com" डोमेन अब और नहीं है, लेकिन मैंने scribd.com पर the cheat-sheet की एक प्रति को ट्रैक किया।

size() की लागत स्रोत कोड को देखने से भी स्पष्ट होगी। (और यह एक "कार्यान्वयन विस्तार कि" यह बहुत अधिक परिवर्तन नहीं करने के लिए ... मानक संग्रह कक्षाओं के लिए गारंटी है है।)

अनुसरण करे

दुर्भाग्य से, cheatsheet केवल कतार के लिए size की जटिलता दस्तावेजों कार्यान्वयन।मुझे लगता है कि ऐसा इसलिए है क्योंकि यह अन्य सभी संग्रहों के लिए O(1) है; @ seanizer का जवाब देखें।

+3

सब कुछ के लिए +1 लेकिन मैं संग्रह Cheatsheet के लिए एक अतिरिक्त +1 देना चाहता हूं (यह वास्तव में महान है) –

+0

आपका लिंक मुझे सभी जगह ले जा रहा है। – DeathByTensors

+0

@DrewBuckley - निश्चित। रिकॉर्ड के लिए, डोमेन नामों के साथ ऐसा होता है जो "पार्क किए गए" होते हैं। –

3

ArrayList के लिए कार्यान्वयन की तरह

public int size() { 
     return lastIndex - firstIndex; 
    } 

तो सिर

आप अपने आवश्यक Impl के लिए विस्तृत जानकारी के लिए स्रोत कोड की जांच कर सकते खत्म नहीं हुआ है।

नोट: स्रोत दिया openjdk

+0

मेरे ऐरेलिस्ट संस्करण 1.56 में यह पहले से ही इसे एक निजी int आकार विशेषता से प्राप्त करता है। – Manny

+0

@ मैनी यह ओपनजेडीके –

0

आप उस के बारे में ज्यादा चिंता की जरूरत नहीं है से है। सूची कार्यान्वयन आकार का ट्रैक रखता है। कॉल की लागत सिर्फ ओ (1) है। यदि आप बहुत उत्सुक हैं, तो आप संग्रह के ठोस वर्गों के कार्यान्वयन के लिए स्रोत कोड पढ़ सकते हैं और वहां आकार() विधि देख सकते हैं।

+0

आईएमओ का स्रोत है, आपको इसके बारे में चिंता करना चाहिए (सामान्य रूप से), श्लेलेमियल पेंटर एल्गोरिदम? – Ishtar

0

कार्यान्वयन इसे एक निजी पूर्व-गणना चर से प्राप्त करता है, इसलिए यह महंगा नहीं है।

0

स्टोर करने की कोई ज़रूरत नहीं है। यह बिल्कुल महंगा नहीं है। ArrayList और HashMap के स्रोत की जांच करें।

1

इसे लागू करें, फिर परीक्षण करें। यदि यह धीमा है, तो एक नजदीक देखो।

"समयपूर्व अनुकूलन सभी बुराइयों की जड़ है।" - डी। Knuth

इसके अलावा: आपको कुछ कार्यान्वयन सुविधाओं की आवश्यकता नहीं होनी चाहिए, खासकर यदि वे काले-बॉक्स वाले हैं। यदि आप बाद में किसी समवर्ती सूची के साथ उस सूची को प्रतिस्थापित करते हैं तो क्या होता है? क्या होगा यदि ओरेकल सूची को फिर से लिखने का फैसला करता है? क्या यह अभी भी तेज होगा? आप बस नहीं जानते

+3

यह * समयपूर्व अनुकूलन * है। Knuth अमेरिकी है :-) –

+0

* "क्या होता है यदि ओरेकल सूची को फिर से लिखने का फैसला करता है?" * (नाइटपिक - संभवतः आप एक सूची कार्यान्वयन वर्ग का मतलब है)। एक 'पुनः' 'ओ' (एन) 'ऑपरेशन बनाने वाला एक पुनःलेख, बड़ी संख्या में अनुप्रयोगों को तोड़ देगा। ओरेकल ऐसा करने के लिए पागल हो जाएगा। माइक्रोसॉफ्ट ओपन-सोर्सिंग विंडोज के रूप में होने की संभावना है। (वास्तव में कम संभावना ...) –

+0

@ स्टीफन सी: आप पूरी तरह से सही हैं, ओरेकल इस तिथि पर ऐरेलिस्ट में आकार() के व्यवहार को बदलने के लिए पागल हो जाएगा (और मैं अभी भी शर्त लगाता हूं कि इस तरह के बदलाव सभी प्रमुखों में हुए हैं कुछ बिंदु पर भाषा प्रयोगशालाएं)। यह इस विशिष्ट उदाहरण में प्रासंगिकता/प्रासंगिक नहीं है। मुख्य मुद्दा कार्यान्वयन का बाद में प्रतिस्थापन है, ArrayList से ConcurrentList, कुछ तृतीय पक्ष सूची या आपके पास क्या है। –

0

मुझे लगता है कि लिंक्डलिस्ट के कुछ कार्यान्वयन प्रत्येक कॉल के लिए कुल गणना करते हैं। एक विधि के लिए कॉल थोड़ा कर लग सकता है, लेकिन केवल तभी हम बड़े पुनरावृत्तियों या हार्डवेयर के लिए ड्राइवर कोडिंग के बारे में बात कर रहे हैं, यह वास्तव में एक मुद्दा होगा।

किसी भी मामले में, यदि आप इसे स्थानीय चर में सहेजते हैं, तो कोई समस्या नहीं होगी।

3

List और Map इंटरफेस हैं, इसलिए कहना असंभव है। जावा मानक एपीआई में कार्यान्वयन के लिए, आकार आम तौर पर एक क्षेत्र में रखा जाता है और इस प्रकार प्रदर्शन-प्रासंगिक नहीं होता है।

3

अधिकांश संग्रहों के लिए, size() पर कॉल करना निरंतर समय का ऑपरेशन है। हालांकि कुछ अपवाद हैं। एक ConcurrentLinkedQueue है। the size() method के जावाडोक से:

सावधान रहें, अधिकांश संग्रहों के विपरीत, यह विधि निरंतर समय संचालन नहीं है। इन कतारों की असीमित प्रकृति के कारण, तत्वों की वर्तमान संख्या को निर्धारित करने के लिए ओ (एन) ट्रैवर्सल की आवश्यकता होती है।

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

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