java - ArrayList में() विधि ऑब्जेक्ट का मूल्यांकन कैसे करती है?




object evaluation (6)

मान लें कि मैं एक ऑब्जेक्ट बनाता हूं और इसे अपने ArrayList जोड़ता हूं। यदि मैं फिर एक ही ऑब्जेक्ट को उसी कन्स्ट्रक्टर इनपुट के साथ बना देता हूं, तो क्या contains() विधि दो ऑब्जेक्ट्स का मूल्यांकन करने के लिए समान होगी? मान लें कि कन्स्ट्रक्टर इनपुट के साथ कुछ भी मजाकिया नहीं करता है, और दोनों ऑब्जेक्ट्स में संग्रहीत चर समान हैं।

ArrayList<Thing> basket = new ArrayList<Thing>();  
Thing thing = new Thing(100);  
basket.add(thing);  
Thing another = new Thing(100);  
basket.contains(another); // true or false?
class Thing {  
    public int value;  

    public Thing (int x) {
        value = x;
    }

    equals (Thing x) {
        if (x.value == value) return true;
        return false;
    }
}

क्या इस class को कार्यान्वित किया जाना चाहिए contains() वापस true ?


ArrayList बराबर तुलना करने के लिए कक्षा (आपके मामले थिंग क्लास) में लागू बराबर विधि का उपयोग करता है।


ArrayList सूची इंटरफ़ेस implements करता है।

यदि आप List में जवाडोक को List में देखते हैं तो आप देखेंगे कि यह equals() विधि का मूल्यांकन करता है कि यह मूल्यांकन करने के लिए कि क्या दो ऑब्जेक्ट समान हैं।


आम तौर पर जब भी आप प्रदर्शन को बढ़ावा देने के लिए equals() , तो भी आपको hashCode() ओवरराइड करना चाहिए। HashCode() तय करता है कि तुलना करने पर आपकी ऑब्जेक्ट को किस प्रकार 'बाल्टी' में सॉर्ट किया जाता है, इसलिए किसी भी दो ऑब्जेक्ट्स जो equal() को सत्य मानते हैं, उन्हें उसी hashCode value() को वापस करना चाहिए। मुझे hashCode() के डिफ़ॉल्ट व्यवहार को याद नहीं किया जा सकता है (यदि यह 0 लौटाता है तो आपका कोड काम करना चाहिए, लेकिन धीरे-धीरे, लेकिन यदि यह पता देता है तो आपका कोड असफल हो जाएगा)। मुझे याद है कि मेरा कोड विफल होने पर कई गुना याद है क्योंकि मैं hashCode() को ओवरराइड करना भूल गया था। :)


बस यह ध्यान रखना चाहता था कि value कार्यान्वयन गलत है जब value एक प्राचीन प्रकार नहीं है:

public class Thing
{
    public Object value;  

    public Thing (Object x)
    {
        this.value = x;
    }

    @Override
    public boolean equals(Object object)
    {
        boolean sameSame = false;

        if (object != null && object instanceof Thing)
        {
            sameSame = this.value == ((Thing) object).value;
        }

        return sameSame;
    }
}

उस मामले में मैं निम्नलिखित का प्रस्ताव करता हूं:

public class Thing {
    public Object value;  

    public Thing (Object x) {
        value = x;
    }

    @Override
    public boolean equals(Object object) {

        if (object != null && object instanceof Thing) {
            Thing thing = (Thing) object;
            if (value == null) {
                return (thing.value == null);
            }
            else {
                return value.equals(thing.value);
            }
        }

        return false;
    }
}

यह वस्तुओं पर बराबर विधि का उपयोग करता है। इसलिए जब तक चीज ओवरराइड बराबर नहीं होती है और तुलना में वस्तुओं में संग्रहीत चर का उपयोग करती है, तो यह contains() विधि पर सही नहीं होगी।


जावाडॉक से शॉर्टकट:

बूलियन में शामिल है (ऑब्जेक्ट ओ)

यदि इस सूची में निर्दिष्ट तत्व है तो सत्य वापस आता है। अधिक औपचारिक रूप से, सत्य लौटाता है अगर केवल और यदि इस सूची में कम से कम एक तत्व होता है और ऐसा होता है (o == null? E == null: o.equals (e))





evaluation