2013-06-12 3 views
6
public class Account { 

    String account; 
    double balance; 

    Account(String account, double balance) { 
     this.account = account; 
     this.balance = balance; 
    } 
} 

public class AccountTest { 

    public static void main(String[] args) { 
     Account a1 = new Account("Sandy", 1000); 
     Account a2 = new Account("Sandy", 1000); 
     System.out.println(a1.equals(a2)); 
    } 
} 

जब मैं इसे "गलत" दिखाता हूं लेकिन ऑब्जेक्ट्स में वैरिएबल में समान डेटा होता है, तो समान डेटा वाले दो ऑब्जेक्ट समान नहीं होते हैं। क्यों? समझाएं।बराबर() विधि

+0

लेकिन नकारात्मक वोट क्यों? – vineet

उत्तर

2

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

@Override 
public boolean equals(Object obj) { 
    if (obj == null) { 
     return false; 
    } 
    if (getClass() != obj.getClass()) { 
     return false; 
    } 
    final Account other = (Account) obj; 
    if ((this.account== null) ? (other.account!= null) : !this.account.equals(other.account)) { 
     return false; 
    } 
    if (this.balance!= other.balance) { 
     return false; 
    } 
    return true; 
} 

BUT WHY I HAVE TO OVVERIDE EQUALS()

0

जब से तुम .equals() ओवरराइड नहीं करें (और यदि आप करते हैं, आप भी .hashCode() ओवरराइड करना होगा), आप का उपयोग Object के .equals() कार्यान्वयन; और यह कार्यान्वयन सत्य लौटाता है अगर केवल और यदि ऑब्जेक्ट संदर्भ समान हैं (यानी, o1 == o2)।

4

क्योंकि डिफ़ॉल्ट ऑब्जेक्ट द्वारा equals(Object obj) पर आधारित समानता जांचता है।

The Class ऑब्जेक्ट के लिए विधि वस्तुओं पर सबसे भेदभाव संभव तुल्यता संबंध लागू करता है के बराबर होती है; अर्थात, किसी भी गैर-शून्य संदर्भ मान x और y के लिए, यह विधि सही होती है अगर केवल और यदि एक्स और वाई एक ही ऑब्जेक्ट को संदर्भित करते हैं (x == y मान सही है)।

आप अपनी कक्षा में equals() विधि के साथ समानता जाँच करना चाहते हैं के बराबर आप बराबरी ओवरराइड करने के लिए() Object वर्ग की विधि है।
how-to-override-equals-method-in-java, निम्नलिखित की तरह:

@Override 
public boolean equals(Object obj) { 
    // your implementation 
} 

और तुम Object वर्ग के always override hashCode() whenever overriding equals विधि चाहिए।

#Effective जावा यहोशू बलोच

से, आप हर वर्ग कि बराबरी ओवरराइड करता है में hashCode() ओवरराइड चाहिए()। ऐसा करने में विफलता के परिणामस्वरूप ऑब्जेक्ट.hashCode() के सामान्य अनुबंध का उल्लंघन होगा, जो आपकी कक्षा को हैश मैप, हैशसेट और हैशटेबल समेत सभी हैश-आधारित संग्रहों के संयोजन के साथ ठीक तरह से काम करने से रोक देगा।

+0

प्रभावी जावा लेम्मा 8, जैसा कि मुझे याद आया। – johnchen902

+0

cource के मैं * नहीं * यहोशू ब्लोच हूँ! अगर मैंने कुछ गलत कहा तो मुझे अपने बुरे अंग्रेजी के लिए खेद है। – johnchen902

+0

क्षमा करें @ johnchen902 मुझे गलत समझा गया :) –

0

आप Object.equals() विधि ओवरराइड करने के लिए की जरूरत है।

+0

डिफ़ॉल्ट रूप से, यह 'this == obj' जांचता है। – johnchen902

+0

हाँ आप सही हैं .. – vineet

0

यह दिखाएगा यदि a1.balance==a2.balance। ध्यान दें कि equals() वस्तुओं की तुलना करता है और उनके वास्तविक मूल्य नहीं। किसी ऑब्जेक्ट की तुलना करने में सक्षम होने के लिए आपको equals() विधि को ओवरराइट करना होगा।

अधिक जानकारी के लिए यहाँ देखें Comparing two objects using an equals method, Java

2

आप को ओवरराइड करता है करने के लिए equals

@Override 
public boolean equals(Object obj) { 
    if (!(obj instanceof Account)) 
     return false; 
    Account that = (Account) obj; 
    return (account == null ? that.account == null : account 
      .equals(that.account)) && balance == that.balance; 
} 

मैं लगभग hashCode ओवरराइड करने के लिए भूल गया की जरूरत है जब equals

@Override 
public int hashCode() { 
    int hash = 17; 
    hash = 37 * hash + (account == null ? 0 : account.hashCode()); 
    long l = Double.doubleToLongBits(balance); 
    hash = 37 * hash + (int) (l^(l >>> 32)); 
    return hash; 
} 
1

अधिभावी आप equals ओवरराइड नहीं किया। Object से विरासत में प्राप्त equals कार्यान्वयन, true लौटाता है और केवल तभी जब दो चर एक ही ऑब्जेक्ट को इंगित करते हैं।

फ़ील्ड समानता (और hashCode, यदि आप इसमें हैं) की जांच के लिए equals ओवरराइड करें।

1

Object.equals() विधि अगर दो बातें तुलना की जा रही देखने के लिए परीक्षण कर रहा है सचमुच एक ही वस्तु है। जबकि ए 1 और ए 2 में एक ही जानकारी है, वे स्मृति में विभिन्न वस्तुएं हैं।

यदि आप अपनी वस्तुओं के अंदर की जानकारी की समानता का परीक्षण करना चाहते हैं तो आप कक्षा को Comparable इंटरफ़ेस लागू कर सकते हैं और compareTo विधि को ओवरराइड कर सकते हैं।

0

वस्तु वर्ग अर्थात डिफ़ॉल्ट कार्यान्वयन में कार्यान्वयन के संदर्भ जाँच करता है। तो यदि संदर्भ समान हैं तो यह सत्य लौटाता है और यह झूठा रिटर्न देता है।

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