2014-12-17 6 views
6

मुझे लगता है कि collection खाली है या नहीं की जांच के लिए isEmpty() और size()> 0 के बीच अंतर के रूप में इतने सारे लेख पढ़ सकते हैं और पाया isEmpty()size() से अधिक कार्यक्षमता है, लेकिन मैं आसानी से नहीं समझ सकता है क्यों isEmpty() की कार्यक्षमता भी isEmpty अंदर हालांकि अच्छा है (है) केवल आकार == 0 है?Collection.isEmpty() और Collection.size() == 0 के बीच अंतर को समझना?

मेरे सवाल हैं:

  1. किसी भी एक आसानी से व्याख्या कर सकते हैं, जिसमें परिदृश्य isEmpty() जब isEmpty() उपयोग करने के लिए और साथ ही तेजी से होता है और यह पता चल सके collectionempty है या नहीं के लिए size() समारोह?

  2. कोई भी कोड या अन्य तरीकों (आरेख, ग्राफ इत्यादि) का उपयोग करके इसे समझा सकता है ताकि कोई भी शुरुआती आसानी से समझ सके?

+1

आशा है कि आप जाँच कर ली है: http://stackoverflow.com/questions/11152536/check-if-a-collection-is-empty-in-java-which-is- सबसे अच्छी विधि http://stackoverflow.com/questions/9341740/ifliststr-size-0-versus-ifliststr-isempty http: // stackoverflow।कॉम/प्रश्न/1508975/क्यों-सूची-आकार 0-धीमी-से-सूची-छूट-इन-जावा –

+0

धन्यवाद @ पैम लेकिन मैंने पहले से ही इस लेख को पढ़ा था लेकिन सटीक अंतर नहीं मिला और साथ ही कैसे ** ओ (1) और ओ (एन) ** प्रदर्शन के संदर्भ में गणना की जाती है। –

+1

@ कमलेश कानाज़ारीया आप जटिलता के बारे में पढ़ना चाहेंगे http://stackoverflow.com/questions/3255/big-o-how-do-you-calculate-approximate-it – MihaiC

उत्तर

3

असल में मैंने पाया था कि .size() हो सकता है हे (1) या हे (एन), data structure पर निर्भर करता है; .isEmpty() कभी भी ओ (एन) नहीं है।

+1

सार संग्रह: 'सार्वजनिक बूलियन है लक्षण() { \t वापसी का आकार() == 0; } '। जिसका अर्थ है आकार() और isEmpty() में सभी प्रमुख संग्रहों में समान जटिलता है – Eran

+1

आपने अभी यहां से एक उत्तर की प्रतिलिपि बनाई है http://stackoverflow.com/questions/9341740/ifliststr-size-0-versus-ifliststr-isempty, बस ओपी को उस प्रश्न पर इंगित करें ... – MihaiC

+0

@ मिहाईसी मैंने कहा कि मैंने इसे स्टैक ओवरफ़्लो से ही पढ़ा था, लेकिन इसका मतलब यह नहीं है कि इसकी प्रतिलिपि सही है। :) –

6

यह हो सकता है कि कुछ संग्रह सिर्फ अपने isEmpty() विधि के अंदर size()==0 उपयोग करते हैं, लेकिन इसका मतलब यह नहीं है कि वे सब करते हैं। isEmpty() का डिफ़ॉल्ट कार्यान्वयन सिर्फ size() == 0 पर जांच करता है, लेकिन यह एक विशेष संग्रह है यदि यह अधिक कुशल है तो इसे किसी और चीज़ से ओवरराइड करने के लिए स्वतंत्र है।

यहां एक अच्छा उदाहरण है। ConcurrentSkipListSet documentation का कहना है:

खबरदार है कि, के विपरीत सबसे संग्रह में, आकार विधि एक निरंतर समय ऑपरेशन नहीं है।

इस वर्ग के लिए, आप निश्चित रूप से isEmpty() बजाय size() == 0 उपयोग करना चाहते हैं चाहते हैं।

(समझने के लिए क्यों यह एक छोड़ सूची के लिए सच है, आप कैसे छोड़ सूचियों के काम करने पर पढ़ने की जरूरत है, लेकिन वापस आने और उनके बारे में एक और सवाल पूछते हैं कि आप और अधिक जानना चाहते हैं।)

+2

लिंक्डलिस्ट का आकार() का कार्यान्वयन सूची को पार नहीं करता है, बल्कि सूची संशोधित होने पर आकार का ट्रैक रखता है। – Martin

+0

@ मार्टिन हां, मैंने अभी इसके बारे में कुछ जोड़ा है। यही कारण है कि मैंने 'लिंक्डलिस्ट' की बजाय "लिंक्ड लिस्ट" लिखा था। मानक कार्यान्वयन आकार का ट्रैक रखता है, लेकिन यह कहना नहीं है कि प्रत्येक संग्रह * को यह करना होगा। –

+0

@ मार्टिन मैंने लिंक किए गए सूची उदाहरण को हटा दिया है और एक स्पष्ट और ठोस उदाहरण के साथ प्रतिस्थापित किया है। –

1

isEmpty बजाय आकार प्रयोग करने के लिए मुख्य कारणों में होगा:

it is more expressive (the code is easier to read and to maintain) 

it is faster, in some cases by orders of magnitude. 

विस्तृत विवरण here

++ वही सवाल पूछा here

+0

धन्यवाद @ अंकुर-सिंगल, मैं आपके उत्तर से सहमत हूं लेकिन वर्तमान में मैं कोड शैली या रखरखाव के बजाय ** प्रदर्शन ** पर अंतर पर ध्यान केंद्रित कर रहा हूं। –

+0

प्रदर्शन-वार, 'isEmpty()' 'आकार *) की तुलना में कुछ अनुकूलन करने के लिए कार्यान्वयन * अनुमति दे सकता है। हालांकि, यदि 'isEmpty() 'का विस्तार किया गया है, तो प्रदर्शन-अनुकूलन पूरी तरह से लागू विशिष्ट कार्यान्वयन वर्ग तक है। मुझे लगता है कि केवल एक चीज पर निर्भर हो सकता है कि 'ओ (isEmpty) <= O (आकार) '। इसलिए, 'isEmpty' का उपयोग करके अधिक अभिव्यक्तिपूर्ण कोड बनता है और प्रदर्शन पर सबसे अच्छा प्रयास है। – JimmyB

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