2013-08-02 7 views
6

//Student.javaअधिभावी यह

class Student{ 
private int roll; 
private String name; 

    public Student(int roll,String name){ 
    this.roll=roll; 
    this.name=name; 
    } 

    public int hashCode(){ 
    return roll+name.length(); 
    } 

    public boolean equals(Object obj){ 
    Student s=(Student)obj; 
    return (this.roll==s.roll && this.name.equals(s.name)); 
    } 

} 

//IssueID.java

class IssueID{ 

    public static void issueID(Student s1,Student s2){ 

    if(s1.equals(s2)) 
    System.out.println("New ID issued"); 

    else 
    System.out.println("New ID NOT issued"); 

    } 

} 

//Institute.java

import java.lang.Object; 
class Institute{ 
    public static void main(String[] args){ 
    Student s1=new Student(38,"shiva"); 
    Student s2=new Student(45,"aditya"); 

    IssueID.issueID(s1,s2); 


    System.out.println(s1.hashCode()); 
    System.out.println(s2.hashCode()); 
    } 

} 

के बाद मूल hashCode() विधि का उपयोग कैसे करें जैसा कि उपर्युक्त कोड में है, मैंने hashCode() विधि को ओवरराइड कर दिया है। यह मूर्खतापूर्ण लग सकता है, लेकिन क्या मैं एक ही समय में एक ही छात्र वस्तुओं (एस 1 और एस 2) का उपयोग कर java.lang.Object.hashCode() विधि तक पहुंच सकता हूं?

+1

'super.hashCode()' का उपयोग करना चाहते हैं, लेकिन वह किसी काम का नहीं होगा IMHO। –

उत्तर

17

हाँ, System.identityHashCode साथ:

) के रूप में डिफ़ॉल्ट विधि hashCode (द्वारा लौटा दिया जाएगा दिया वस्तु के लिए एक ही हैश कोड देता है, या नहीं, यह देखते हुए ऑब्जेक्ट के वर्ग को ओवरराइड करता है hashCode()।

0

आप का उपयोग System.identityHashCode या super.hashCode() इसके अलावा, आप नाम की लंबाई की राशि और रोल एक ही हैश कोड होगा बराबर होने के साथ किसी भी छात्रों के रूप में एक बेहतर हैश कोड लिखना चाहिए कर सकते हैं। पसंद (9, "बॉब") और (7, "स्टीव")। इससे भावी कीड़े के लिए कई संभावित समस्याएं खुल जाएंगी। अपने आप को सिर दर्द सहेजें और कुछ इस तरह लिखना:

public int hashCode() { 
     int hash = 31 * roll; 
     hash = 31 * hash + name.hashCode(); 
     return hash; 
} 

इसके अलावा, ध्यान रखें कि आपका बराबरी विधि JLS में बराबर विधि को पूरा नहीं करता है।

this.equals(null) झूठी वापसी करनी चाहिए, आपका क्लासकास्ट अपवाद फेंक देगा।

इससे भविष्य में कीड़े भी हो सकते हैं।

+0

हाँ! हैशकोड विधि सिर्फ परीक्षण के लिए है। वैसे भी आपके सुझाव के लिए धन्यवाद! –

+1

[हैशकोडबिल्डर] (http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/builder/HashCodeBuilder.html) आपका मित्र है! – chrylis

0

कुछ इस तरह लिखने:

class Student { 
    public int originalHashCode() { 
     return super.hashCode(); 
    } 
} 

तो s.originalHashCode() फोन जब आप मूल एक ~

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