2013-09-23 7 views
14

अजीब डिफ़ॉल्ट JDK 6 AbstractList::equals()के कार्यान्वयन पहले जाँच करने के लिए करता है, तो दो सूचियों एक ही आकार है लगता है नहीं करता है:JDK कार्यान्वयन() सूची आकार समानता पहले जांच नहीं की जाती

public boolean equals(Object o) { 
    if (o == this) 
     return true; 
    if (!(o instanceof List)) 
     return false; 
    ListIterator<E> e1 = listIterator(); 
    ListIterator e2 = ((List) o).listIterator(); 
    while(e1.hasNext() && e2.hasNext()) { 
     E o1 = e1.next(); 
     Object o2 = e2.next(); 
     if (!(o1==null ? o2==null : o1.equals(o2))) 
      return false; 
    } 
    return !(e1.hasNext() || e2.hasNext()); 
} 

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

विशेष रूप से कि कई स्थितियों के सूचियों के आकार के अधिकांश समय अलग-अलग होंगे। इसके अलावा, अधिकांश जावा List कार्यान्वयन में ओ (1) size() प्रदर्शन (यहां तक ​​कि लिंक्डलिस्ट, जो इसका आकार कैश में रखता है) है।

क्या इस डिफ़ॉल्ट कार्यान्वयन के लिए कोई अच्छा कारण है?

उत्तर

12

बराबर विधि का संचालन कुछ विस्तार से निर्दिष्ट किया गया है, और यह को ओ (एन) व्यवहार की आवश्यकता है। हालांकि यह उप-वर्गों के लिए उप-विशिष्ट हो सकता है, जिनकी आकार विधि ओ (1) है, कुछ उप-वर्गों के लिए आकार विधि स्वयं ओ (एन) हो सकती है और अनुरोधित व्यवहार वास्तव में एक अवक्रमण होगा। किसी भी घटना में spec स्पष्ट है और यह परिवर्तन नहीं बनाया जा सकता है।

ध्यान दें कि यदि कोई वांछित हो तो सबक्लास बराबर हो सकता है, आकार उचित होने पर तुलना करें।

Reference.

+3

तो अगर अच्छी तरह से समझते हैं, यह अक्षम है क्योंकि यह इस तरह के रूप प्रलेखित किया गया है है? :) –

+3

@Laurent "इस तरह से दस्तावेज नहीं किया गया है" कारण के कारण डिजाइन के निर्णय के कारण "कुछ उप-वर्गों के लिए आकार विधि स्वयं ओ (एन) हो सकती है और अनुरोधित व्यवहार वास्तव में एक अवक्रमण होगा" :) –

+2

मैं समझता हूं, लेकिन सभी कार्यान्वयन के लिए पहली जगह प्रदर्शन को खराब कर रहा हूं क्योंकि "उनमें से कुछ" धीमे हो सकते हैं, मेरे लिए अच्छा निर्णय नहीं लगता है। मैं ओ (1) आकार की सूचियों के लिए एक अनुकूलित बराबर बना देता, और बाकी के लिए अनुकूलित नहीं होता। विशेष रूप से ऐरेलिस्ट के लिए जो जावा में वर्कहोर है ... –

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