जावा में बराबर () कैसे लिखें
इस लेख के अंत तक, जावा प्रोग्रामिंग भाषा में सर्वश्रेष्ठ बराबर () विधि लिखने में सक्षम होने के लिए सभी आवश्यक जानकारी को कवर किया जा रहा है। समानता के विवरण को गणितीय परिभाषा के संदर्भ में और जावा प्रोग्रामिंग भाषा के तरीके से निपटाया जा रहा है ताकि मौलिक जानकारी को कवर किया जा सके जो कि बराबर () पद्धति के सर्वोत्तम अभ्यास का उपयोग करने के लिए आवश्यक है ।
समानता की गणितीय परिभाषा
विकिपीडिया के अनुसार , गणितीय समानता की परिभाषा है
गणित में, समानता दो मात्राओं या अधिक सामान्य रूप से दो गणितीय अभिव्यक्तियों के बीच एक संबंध है, जो यह दावा करती है कि मात्राओं का समान मान है, या यह कि अभिव्यक्तियाँ एक ही गणितीय वस्तु का प्रतिनिधित्व करती हैं। A और B के बीच की समानता को A = B लिखा जाता है , और A का उच्चारण B के बराबर होता है ।
जावा में समानता की परिभाषा
जावा प्रोग्रामिंग लैंग्वेज में, समानता का अर्थ केवल समान मान होना है। यह कभी-कभी शाब्दिक रूप से समान मूल्य का होता है और कभी-कभी वस्तु के गुणों के संदर्भ में समान संरचना का होता है।
जब दो आदिम प्रकार के मूल्यों की समानता की जांच करने की आवश्यकता होती है, तो नीचे दिए गए उदाहरण के अनुसार बराबर चिह्न का सीधे उपयोग किया जाता है;
int a = 5;
int b = 6;
int c = 5;
// Prints "false" since a and b do not have the same value.
System.out.println(a == b);
// Prints "true" since a and c have the same value.
System.out.println(a == c);
दूसरी ओर, कभी-कभी दो वस्तुओं की समानता की जाँच करना आवश्यक होता है। वस्तुओं के संदर्भ में, दो अलग-अलग दृष्टिकोण हैं जो दो वस्तुओं की समानता की जाँच की प्रक्रिया के विभिन्न चरणों में उपयोग किए जाते हैं। आइए विवरण में आते हैं।
संदर्भात्मक समानता
जावा प्रोग्रामिंग लैंग्वेज में, वस्तुओं के वास्तविक मूल्यों को मेमोरी में कहीं स्टोर किया जाता है और उन्हें ऑब्जेक्ट रेफरेंस द्वारा इंगित किया जाता है जो कि मेमोरी में कहीं स्टोर किए जाते हैं। आइए निम्नलिखित कोड स्निपेट देखें;
// Create an object with "new" operator.
// Point to object with object reference "a".
Object a = new Object();
// Create another object reference.
// Point to the same object as the reference "a" is pointing.
Object b = a;
// Output is true.
System.out.println(a == b);
// Create another object with "new" operator.
// Point to object with object reference "b".
b = new Object();
// Output is false.
System.out.println(a == b);
ऐसे परिदृश्य में, "ए" और "बी" वास्तव में दो संदर्भ हैं जो एक ही वस्तु की ओर इशारा करते हैं, इसलिए यह सीधे तौर पर कहा जा सकता है कि "ए" "बी" के बराबर है क्योंकि संदर्भात्मक समानता प्राप्त की जाती है।
हालाँकि, विपरीत परिदृश्य हर समय मान्य नहीं होता है। दो अलग-अलग संदर्भ अलग-अलग स्मृति स्थानों को इंगित कर सकते हैं, लेकिन जिन वस्तुओं का संदर्भ इंगित करता है वे अभी भी बराबर हो सकते हैं।
सामान्य जीवन में कभी-कभी मात्राओं की तुलना की जाती है। जैसे अगर आपके पास दो सेब हैं और आपके दोस्त के पास दो सेब हैं तो आपके और आपके दोस्त के पास सेबों की संख्या बराबर है।
दूसरी ओर, कभी-कभी चीजों की तुलना उसके गुणों या संरचना के संदर्भ में भी की जा सकती है। आइए इस परिदृश्य के विवरण में आते हैं।
संरचनात्मक समानता
संरचनात्मक समानता वह प्रकार है जिसमें वस्तुओं की तुलना उनके गुणों की अवस्थाओं के अनुसार की जाती है। इस प्रकार की समानता की जाँच करने के लिए केवल “==” ऑपरेटर के बजाय एक अधिक परिष्कृत उपकरण की आवश्यकता है। यह बराबर () विधि है। यह ऑब्जेक्ट क्लास से आता है जो जावा प्रोग्रामिंग लैंग्वेज में क्लास पदानुक्रम के उच्चतम बिंदु पर है। आइए आगामी जावा कोड स्निपेट की जांच करें;
public class Car {
// Assume that we have corresponding constructor, accessors, mutators, etc.
private String brand;
private String model;
private Integer modelYear;
private Integer mileage;
}
Car car1 = new Car("Audi","R8", 2023);
Car car2 = new Car("Audi","R8", 2023);
Car car3 = new Car("Audi","R8", 2021);
System.out.println(car1.equals(car2));
System.out.println(car2.equals(car3));
public boolean equals(Object obj) {
return (this == obj);
}
public class Car {
private String brand;
private String model;
private Integer modelYear;
private Integer mileage;
// Assume that we have corresponding constructor, accessors, mutators, etc.
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Car car = (Car) o;
return brand.equals(car.brand) && model.equals(car.model) && modelYear.equals(car.modelYear);
}
}
दूसरी पंक्ति में हम वस्तुओं की पहचान की जाँच करना शुरू करते हैं। यदि वस्तु संदर्भ o शून्य है या दोनों वस्तु संदर्भ उन वस्तुओं की ओर इशारा करते हैं जो विभिन्न वर्गों से संबंधित हैं, तो यह सीधे तौर पर कहा जा सकता है कि इन दो वस्तुओं की समान पहचान नहीं है और समान नहीं हैं। यदि ऐसा नहीं होता है तो हम अंततः वस्तुओं की वास्तविक संरचनाओं की जांच करने में सक्षम होते हैं।
विधि की तीसरी पंक्ति पर, हम संबंधित वर्ग प्रकार के संदर्भ ओ को कास्ट करते हैं क्योंकि विधि ऑब्जेक्ट क्लास से ओवरराइड की गई है और अब हम जानते हैं कि यह कार क्लास से संबंधित है।
अंत में, विधि की अंतिम पंक्ति पर, दो वस्तुओं की संरचना की जाँच की जाती है और यह वास्तविक रेखा है कि पहचान परिभाषित की जाती है। सीधे शब्दों में, यदि ब्रांड मॉडल और मॉडल वर्ष समान हैं तो ये दोनों वस्तुएँ समान हैं। दूसरे शब्दों में, यह संरचनात्मक समानता है।
हमने प्राथमिक विद्यालय में गणितीय समानता के गुण सीखे हैं। इनमें से कुछ गुणों को बराबर () विधि के लिए भी मान्य होना चाहिए । इसका अर्थ है कि इन गुणों को बराबर () विधि के अवयवों में जोड़ा जाना है । आइए इन गुणों को गणितीय समानता के संदर्भ में और जावा में समानता के संदर्भ में देखें;
प्रतिवर्त संपत्ति
स्वतुल्य गुणधर्म की गणितीय परिभाषा में, सभी वास्तविक संख्याओं के लिए x ;
एक्स = एक्स
एक संख्या खुद के बराबर होती है।
जावा समानता के संदर्भ में, एक वस्तु को स्वयं के बराबर होना चाहिए;
Car car1 = new Car("Audi","R8",2013);
System.out.println(car1.equals(car1));
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Car car = (Car) o;
return mileage < car.mileage && brand.equals(car.brand) && model.equals(car.model) && modelYear.equals(car.modelYear);
}
सममित संपत्ति
सममित गुण की गणितीय परिभाषा के संदर्भ में, सभी वास्तविक संख्याओं x और y के लिए ;
अगर एक्स = वाई , तो वाई = एक्स
समानता का क्रम मायने नहीं रखता।
जावा समानता के संदर्भ में, यदि ऑब्जेक्ट ए ऑब्जेक्ट बी के बराबर है, तो ऑब्जेक्ट बी को ऑब्जेक्ट ए के बराबर होना चाहिए;
Car car1 = new Car("Audi","R8",2013);
Car car2 = new Car("Audi","R8",2013);
System.out.println(car1.equals(car2));
System.out.println(car2.equals(car1));
public class Car {
private String brand;
private String model;
private Integer modelYear;
private Integer mileage;
@Override
public boolean equals(Object o) {
if (o == this) return true;
if (!(o instanceof Car)) return false;
Car car = (Car) o;
return brand.equals(car.brand) && model.equals(car.model) && modelYear.equals(car.modelYear);
}
}
public class SportCar extends Car {
private String engineType;
@Override
public boolean equals(Object o) {
if (o == this) return true;
if (!(o instanceof SportCar)) return false;
SportCar sportCar = (SportCar) o;
return engineType.equals(sportCar.engineType);
}
}
Car car1 = new Car("Audi", "R8", 2012, 1000);
SportCar car2 = new SportCar("Audi", "R8", 2012, 1000, "4.0");
System.out.println(car1.equals(car2));
System.out.println(car2.equals(car1));
सकर्मक संपत्ति
सकर्मक गुण की गणितीय परिभाषा में, सभी वास्तविक संख्याओं के लिए x , y , और z ;
यदि x = y और y = z , तो x = z
एक ही संख्या के बराबर दो संख्याएँ एक दूसरे के बराबर होती हैं।
जावा समानता के संदर्भ में, यदि ऑब्जेक्ट ए ऑब्जेक्ट बी के बराबर है और ऑब्जेक्ट बी ऑब्जेक्ट सी के बराबर है, तो ऑब्जेक्ट ए को ऑब्जेक्ट सी के बराबर होना चाहिए;
SportCar car1 = new SportCar("Audi", "R8", 2012, 1000, new Turbo("100RPM"));
Car car2 = new Car("Audi", "R8", 2012, 1000);
SportCar car3 = new SportCar("Audi", "R8", 2012, 1000, new Turbo("101RPM"));
System.out.println(car1.equals(car2));
System.out.println(car2.equals(car3));
System.out.println(car1.equals(car3));
public class SportCar extends Car {
private Turbo turbo;
@Override
public boolean equals(Object o) {
if (!(o instanceof Car)) return false;
if (!(o instanceof SportCar)) return o.equals(this);
return super.equals(o) && ((SportCar) o).turbo == turbo;
}
}
public class Turbo {
private String power;
public Turbo(String power) {
this.power = power;
}
}
SportCar car1 = new SportCar("Audi", "R8", 2012, 1000, new Turbo("100RPM"));
Car car2 = new Car("Audi", "R8", 2012, 1000);
SportCar car3 = new SportCar("Audi", "R8", 2012, 1000, new Turbo("101RPM"));
System.out.println(car1.equals(car2));
System.out.println(car2.equals(car3));
System.out.println(car1.equals(car3));
लगातार संपत्ति
यह एक अलग संपत्ति है क्योंकि गणितीय रूप से कोई सटीक समतुल्य नहीं है। इसके लिए हमें बराबर() विधि के लगातार निष्पादन के लिए समान परिणाम प्राप्त करने की आवश्यकता है।
आइए नीचे दिए गए कोड स्निपेट को देखें;
Car car1 = new Car("Audi", "R8", 2012, 1000);
Car car2 = new Car("Audi", "R8", 2012, 1000);
for (int i = 0; i < 100000; i++) {
System.out.println(car1.equals(car2));
}
@Override
public boolean equals(Object o) {
if (o == this) return true;
if (!(o instanceof Car)) return false;
Car car = (Car) o;
Random random = new Random();
return brand.equals(car.brand) && model.equals(car.model) && (random.nextInt(10) + 2013) == car.modelYear;
}
नोट: यह उदाहरण वास्तव में मुझे संतुष्ट नहीं करता है। व्यापक शोध के बाद, मैं इसे एक बेहतर से बदल दूंगा। यह बराबर () विधि के जावा प्रलेखन में स्पष्ट रूप से कहा गया है कि " x.equals(y)लगातार वापसी trueया लगातार वापसी के कई आह्वान false"। इस कथन के उल्लंघन का एक ठोस उदाहरण होना चाहिए।
शून्य पैरामीटर संपत्ति
इस प्रकार मैं इस संपत्ति को कॉल करना चुनता हूं।
कृपया नीचे दिए गए कोड स्निपेट को देखें;
Car car1 = new Car("Audi", "R8", 2012, 1000);
Car car2 = null;
System.out.println(car1.equals(car2));
अब यह स्पष्ट है कि समानता की सही गणना प्रदान करने के लिए एक समान () विधि कार्यान्वयन में कौन से गुण होने चाहिए। साथ ही, हमने संभावित उल्लंघन परिदृश्य देखे हैं, इसलिए अब हम कोड गुणवत्ता और व्यावसायिक तर्क के लिए उनसे बच सकते हैं।
आज कई आईडीई सर्वोत्तम संभव समान () विधि कार्यान्वयन उत्पन्न करने के लिए पीढ़ी तंत्र प्रदान करते हैं। बराबरी () पद्धति को लागू करने के बजाय ज्यादातर समय उनके साथ रहना एक अच्छा विचार है। आइए Intellij IDEA से एक उदाहरण देखें ;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Car car = (Car) o;
return brand.equals(car.brand) && model.equals(car.model) && modelYear.equals(car.modelYear) && mileage.equals(car.mileage);
}
पहली पंक्ति में, संदर्भात्मक समानता की जाँच की जाती है, क्योंकि दो वस्तु संदर्भ एक ही वस्तु की ओर इशारा कर सकते हैं।
दूसरी पंक्ति पर, अशक्त पैरामीटर संपत्ति का सत्यापन सुनिश्चित किया जाता है और यह भी वही होता है यदि स्थिति एक गार्ड के रूप में कार्य करती है यदि खंड, सकर्मक संपत्ति और सममित संपत्ति के उल्लंघन को रोकने के लिए संदर्भ द्वारा इंगित की गई वस्तुओं के वर्ग प्रकार को नियंत्रित करके .
तीसरी लाइन पर, ऑब्जेक्ट रेफरेंस को संबंधित क्लास टाइप में डाला जाता है, जो कार ऑब्जेक्ट के गुणों तक पहुंचने के लिए हमारे उदाहरण में कार है।
अंत में, चौथी पंक्ति पर संरचनात्मक समानता के संदर्भ में समानता की जाँच की जाती है।
इक्वल्स () मेथड जनरेशन के लिए अन्य टेम्प्लेट हैं । आप भी जाकर चेक कर सकते हैं।
यदि आप कार्यान्वयन को स्वयं लिखना चाहते हैं, तो कृपया ध्यान रखें कि कार्यान्वयन को सभी समान () विधि संपत्ति के लिए वैधता सुनिश्चित करनी चाहिए।
जैसा कि हम लेख के अंत में आते हैं, अभी भी एक बहुत ही महत्वपूर्ण अंतर है जिसे कवर करने की आवश्यकता है। अपनी आईडीई खोलें और बराबर () विधि उत्पन्न करने का प्रयास करें। आप देखेंगे कि हैशकोड () विधि के बिना केवल बराबर ( ) विधि उत्पन्न करने का कोई विकल्प नहीं है। जावा प्रोग्रामिंग लैंग्वेज में कुछ संग्रह प्रकारों के कारण, यह एक बहुत अच्छा अभ्यास है कि इन दोनों विधियों को एक दूसरे से अलग न किया जाए। आधिकारिक जावा प्रलेखन में यह भी कहा गया है कि आमतौर पर हैशकोड () विधि को ओवरराइड करना आवश्यक होता है जब भी बराबर () विधि को ओवरराइड किया जाता है। मैं अपने अन्य लेख में हैशिंग और हैशकोड () विधि के बारे में संबंधित जानकारी देना चाहूंगा ।
साथ ही, कभी-कभी हमें जेपीए की इकाई कक्षाओं जैसे कुछ असाधारण मामलों के लिए बराबर() विधि गुणों से चिपकने की आवश्यकता नहीं हो सकती है । यह अपने स्वयं के लेख का भी हकदार है।
निष्कर्ष के तौर पर
इस लेख में सही बराबर () पद्धति को लागू करने के लिए सभी महत्वपूर्ण बिंदुओं को शामिल किया गया है। मैं आपको समान () विधि गुणों के सत्यापन का परीक्षण करने के लिए संबंधित इकाई परीक्षण लिखने की भी सलाह देता हूं । वेब पर स्थापित किए जा सकने वाले अन्य संसाधनों को देखना न भूलें।
पहली जगह में, यह एक बहुत ही आसान और आदिम विषय लगता है क्योंकि यह वस्तु उन्मुख डिजाइन के मूल सिद्धांतों से है। हालाँकि, जैसा कि विवरण से देखा जा सकता है कि इन बुनियादी अवधारणाओं को छोड़ना और पूरी तरह से समझना बहुत महत्वपूर्ण है।

![क्या एक लिंक्ड सूची है, वैसे भी? [भाग 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































