प्रत्येक जावा ऑब्जेक्ट में दो बहुत महत्वपूर्ण विधियां होती हैं बराबर () और हैशकोड () और इन विधियों को उनके विशिष्ट सामान्य अनुबंध . के अनुसार ओवरराइड करने के लिए डिज़ाइन किया गया है . एक ऑब्जेक्ट वर्ग प्रत्येक वर्ग का मूल वर्ग है, इन दो विधियों का डिफ़ॉल्ट कार्यान्वयन प्रत्येक वर्ग में पहले से मौजूद है। हालांकि, हम आवश्यकता के आधार पर इन विधियों को ओवरराइड कर सकते हैं।
हैशकोड () विधि
public int hashCode()
यह विधि एक पूर्णांक . लौटाती है मान, जिसे किसी वस्तु के हैश कोड मान के रूप में संदर्भित किया जाता है। प्रत्येक वस्तु, निर्माण के समय एक अद्वितीय 32-बिट, हस्ताक्षरित int मान के साथ असाइन की गई है। यह मान उस वस्तु का हैश कोड मान है।
हैशकोड () विधि से जुड़ा सामान्य अनुबंध
- द हैशकोड () विधि को इस विधि के प्रत्येक कॉलिंग के लिए उसी ऑब्जेक्ट के लिए समान पूर्णांक मान वापस करना चाहिए जब तक कि ऑब्जेक्ट में संग्रहीत मान संशोधित न हो।
- यदि दो वस्तुएँ समान हैं (बराबर () के अनुसार) विधि) फिर हैशकोड () विधि को दोनों वस्तुओं के लिए समान पूर्णांक मान लौटाना चाहिए।
- लेकिन, यह आवश्यक नहीं है कि हैशकोड () विधि उन वस्तुओं के लिए विशिष्ट परिणाम लौटाएगी जो समान नहीं हैं (बराबर () के अनुसार) विधि)।
बराबर() विधि
public boolean equals(Object obj)
बराबर () ऑब्जेक्ट क्लास की विधि वस्तुओं की समानता की जांच करती है और तदनुसार यह रिटर्न सच या झूठा . डिफ़ॉल्ट कार्यान्वयन, जैसा कि ऑब्जेक्ट क्लास द्वारा प्रदान किया गया है, यदि दोनों संदर्भ एक ही ऑब्जेक्ट को संदर्भित करते हैं, तो वस्तुओं की समानता की जांच करता है। यह वस्तुओं के मूल्य या स्थिति की जाँच नहीं करता है। लेकिन हम वस्तुओं की स्थिति या मूल्य की तुलना करने के लिए स्वयं का कार्यान्वयन प्रदान करने के लिए इस पद्धति को ओवरराइड कर सकते हैं।
बराबर () पद्धति से संबद्ध सामान्य अनुबंध
किसी भी गैर-शून्य संदर्भ चर के लिए a, b और c
- a.equals(a) हमेशा सत्य लौटना चाहिए ।
- a.equals(b) वापस आना चाहिए सत्य अगर और केवल अगर b.equals(a) सच लौटता है।
- यदि a.equals(b) सत्य लौटाता है और b.equals(c) सत्य लौटाता है फिर a.equals(c) वापस आना चाहिए सत्य ।
- एकाधिक कॉलिंग a.equals(b) लगातार सत्य लौटना चाहिए या लगातार गलत लौटाएं यदि किसी वस्तु के लिए वस्तु का मूल्य संशोधित नहीं किया गया है।
- a.equals(null) वापस लौटना चाहिए झूठा ।
इसलिए हैशकोड () . को ओवरराइड करना आवश्यक है ऑब्जेक्ट क्लास की विधि अगर हम बराबर () . को ओवरराइड कर रहे हैं विधि।
उदाहरण
public class MainClass { public static void main(String[] args) { MainClass mainClass = new MainClass(); TestClass obj1 = new TestClass(1); TestClass obj2 = new TestClass(1); mainClass.test1(obj1, obj2); TestClass obj3 = new TestClass(1); TestClass obj4 = new TestClass(2); mainClass.test2(obj3, obj4); } public void test1(TestClass obj1, TestClass obj2) { if (obj1.equals(obj2)) { System.out.println("Object One and Object Two are equal"); } else { System.out.println("Object One and Object Two are not equal"); } } public void test2(TestClass obj3, TestClass obj4) { if (obj3.equals(obj4)) { System.out.println("Object Three and Object Four are equal"); } else { System.out.println("Object Three and Object Four are not equal"); } } } class TestClass { private int val; TestClass(int val) { this.val = val; } public int getValue() { return val; } @Override public boolean equals(Object o) { // null check if (o == null) { return false; } // this instance check if (this == o) { return true; } // instanceof Check and actual value check if ((o instanceof TestClass) && (((TestClass) o).getValue() == this.val)) { return true; } else { return false; } } @Override public int hashCode() { int result = 0; result = (int) (val / 11); return result; } }
आउटपुट
Object One and Object Two are equal Object Three and Object Four are not equal