हर जावा ऑब्जेक्ट में दो बहुत महत्वपूर्ण मेथड्स equals() और hashCode() होते हैं और इन मेथड्स को उनके विशिष्ट जनरल कॉन्ट्रैक्ट के अनुसार ओवरराइड करने के लिए डिज़ाइन किया गया है। एक Object क्लास हर क्लास की पैरेंट क्लास होती है, इन दो मेथड्स का डिफ़ॉल्ट इम्प्लीमेंटेशन हर क्लास में पहले से मौजूद होता है। हालांकि, हम आवश्यकता के आधार पर इन मेथड्स को ओवरराइड कर सकते हैं।
hashCode() मेथड
public int hashCode()
यह मेथड एक इंटीजर मान रिटर्न करता है, जिसे ऑब्जेक्ट का हैश कोड मान कहा जाता है। हर ऑब्जेक्ट, निर्माण के समय एक यूनिक 32-बिट, साइन्ड int मान के साथ असाइन किया जाता है। यह मान उस ऑब्जेक्ट का हैश कोड मान होता है।
hashCode() मेथड से जुड़ा जनरल कॉन्ट्रैक्ट
- hashCode() मेथड को प्रत्येक कॉल के लिए उसी ऑब्जेक्ट के लिए समान इंटीजर मान रिटर्न करना चाहिए जब तक कि ऑब्जेक्ट में स्टोर किया गया मान संशोधित न हो।
- यदि दो ऑब्जेक्ट बराबर हैं (equals() मेथड के अनुसार) तो hashCode() मेथड को दोनों ऑब्जेक्ट्स के लिए समान इंटीजर मान रिटर्न करना चाहिए।
- लेकिन, यह आवश्यक नहीं है कि hashCode() मेथड उन ऑब्जेक्ट्स के लिए अलग परिणाम रिटर्न करे जो बराबर नहीं हैं (equals() मेथड के अनुसार)।
equals() मेथड
public boolean equals(Object obj)
equals() मेथड Object क्लास का ऑब्जेक्ट्स की समानता की जांच करता है और तदनुसार true या false रिटर्न करता है। Object क्लास द्वारा प्रदान किया गया डिफ़ॉल्ट इम्प्लीमेंटेशन इस आधार पर ऑब्जेक्ट्स की समानता की जांच करता है कि क्या दोनों रेफरेंस उसी ऑब्जेक्ट को रेफर करते हैं। यह ऑब्जेक्ट्स के मान या स्थिति की जांच नहीं करता। लेकिन हम इस मेथड को ऑब्जेक्ट्स की स्थिति या मान की तुलना करने के लिए अपना इम्प्लीमेंटेशन प्रदान करने के लिए ओवरराइड कर सकते हैं।
equals() मेथड से जुड़ा जनरल कॉन्ट्रैक्ट
किसी भी नॉन-नल रेफरेंस वेरिएबल्स a, b और c के लिए
- a.equals(a) हमेशा true रिटर्न करना चाहिए।
- a.equals(b) true रिटर्न करना चाहिए यदि और केवल यदि b.equals(a) true रिटर्न करता है।
- यदि a.equals(b) true रिटर्न करता है और b.equals(c) true रिटर्न करता है तो a.equals(c) को true रिटर्न करना चाहिए।
- a.equals(b) के मल्टीपल कॉलिंग को लगातार true या लगातार false रिटर्न करना चाहिए यदि किसी भी ऑब्जेक्ट का मान संशोधित नहीं किया गया है।
- a.equals(null) को false रिटर्न करना चाहिए।
इसलिए यदि हम equals() मेथड को ओवरराइड कर रहे हैं तो Object क्लास के hashCode() मेथड को ओवरराइड करना आवश्यक है।
उदाहरण
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 चेक
if (o == null) {
return false;
}
// this इंस्टेंस चेक
if (this == o) {
return true;
}
// instanceof चेक और वास्तविक मान चेक
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