यह एक AI अनुवादित पोस्ट है।
भाषा चुनें
durumis AI द्वारा संक्षेपित पाठ
- equals() एक ऑब्जेक्ट के कंटेंट की तुलना करने के लिए उपयोग किया जाने वाला तरीका है कि क्या वे समान हैं, और hashCode() एक ऑब्जेक्ट का अद्वितीय पूर्णांक मान देता है, और दोनों ऑब्जेक्ट की तुलना करने के लिए उपयोग किया जाता है।
- हैश डेटा संरचनाओं में, hashCode() का उपयोग कुंजी निर्धारित करने के लिए किया जाता है, इसलिए, equals() और hashCode() को एक साथ ओवरराइड किया जाना चाहिए ताकि समान हैश कोड सुनिश्चित किया जा सके।
- equals() और hashCode() को एक साथ उपयोग करने से हैश डेटा संरचनाओं में समान ऑब्जेक्ट को कुशलतापूर्वक प्रबंधित करना संभव हो जाता है।
equals()
equals() वस्तु की सामग्री की तुलना करता है कि क्या वे समान हैं। इसे अक्सर समानता तुलना कहा जाता है, और यदि आप equals() को ओवरराइड नहीं करते हैं, तो यह आंतरिक रूप से == के समान है, इसलिए यह समानता तुलना है। इसलिए, यदि आप वस्तुओं की समानता की तुलना सही ढंग से करना चाहते हैं, तो आपको हमेशा equals() का उपयोग करना चाहिए।
public boolean equals(Object obj) {
return (this == obj);
hashCode()
hashCode() जाँच करता है कि क्या दो वस्तुएँ समान हैं। यह == जैसा ही समानता तुलना कार्य करता है, लेकिन hashCode() विधि रनटाइम के दौरान एक वस्तु के अद्वितीय पूर्णांक मान को वापस करती है। आम तौर पर, यह हीप में संग्रहीत वस्तु के मेमोरी पते को वापस करता है।
इस पद्धति में native कीवर्ड संलग्न है, जिसका अर्थ है कि यह उन भाषाओं के लिए उपयोग किया जाता है जो Java से अलग भाषाओं में विकसित की जाती हैं और Java में उपयोग की जाती हैं।
हैश क्या है?
हैशिंग एक चर-आकार के इनपुट मान से एक निश्चित आकार के आउटपुट मान को बनाने की प्रक्रिया है, जो एक हैश फ़ंक्शन का उपयोग करता है। हैशिंग के माध्यम से प्राप्त मान को हैश कोड कहा जाता है।
equals() और hashCode()
चूँकि एक ही वस्तु का एक ही मेमोरी पता होना चाहिए, यह स्पष्ट है कि एक ही वस्तु का एक ही हैश कोड होना चाहिए। इसलिए, equals() के अलावा, hashCode() को भी ओवरराइड करना उचित है ताकि कोड को समान हैश कोड प्रदान किया जा सके।
हैश डेटा संरचना
public class Main {
public static void main(String[] args) throws IOException {
Set people = new HashSet<>();
people.add(new Person("제이온", 23));
people.add(new Person("제이온", 23));
System.out.println(people.size()); // 2
}
}
class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name);
}
ऊपर की तरह, आइए समान वस्तुओं के 2 टुकड़ों को HashSet डेटा संरचना में डालते हैं। यदि हम सेट का आकार आउटपुट करते हैं, तो यह 2 होगा। ऐसा क्यों है?
यह है क्योंकि हैश-आधारित डेटा संरचना कुंजी का निर्धारण करने के लिए hashCode() का उपयोग करती है। दूसरे शब्दों में, वस्तुओं की समानता की तुलना करने से पहले, यह जाँच करता है कि क्या दो वस्तुओं के हैश कोड समान हैं, और फिर निर्धारित करता है कि क्या दो वस्तुएँ समान हैं। इस मामले में, यदि hashCode() को ओवरराइड नहीं किया जाता है, तो यह Object के hashCode() का उपयोग करता है, इसलिए यह प्रत्येक वस्तु के लिए मेमोरी पते को वापस करता है। इसलिए, हैश डेटा संरचना का उपयोग करते समय, equals() के अलावा hashCode() को भी ओवरराइड करना अच्छा होता है।
public static void main(String[] args) throws IOException {
Set people = new HashSet<>();
people.add(new Person("제이온", 23));
people.add(new Person("제이온", 23));
System.out.println(people.size()); // 1
}
}
class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
स्रोत
अपेक्षित साक्षात्कार प्रश्न और उत्तर
equals() और hashCode() का एक साथ उपयोग क्यों किया जाता है?
हैश-आधारित डेटा संरचना कुंजी का निर्धारण करने के लिए hashCode() का उपयोग करती है। दूसरे शब्दों में, वस्तुओं की समानता की तुलना करने से पहले, यह जाँच करता है कि क्या दो वस्तुओं के हैश कोड समान हैं, और फिर निर्धारित करता है कि क्या दो वस्तुएँ समान हैं। इस मामले में, यदि hashCode() को ओवरराइड नहीं किया जाता है, तो यह Object के hashCode() का उपयोग करता है, इसलिए यह प्रत्येक वस्तु के लिए मेमोरी पते को वापस करता है। इसलिए, हैश डेटा संरचना का उपयोग करते समय, equals() के अलावा hashCode() को भी ओवरराइड करना अच्छा होता है।