दिलचस्प पोस्ट
मैं एन्क्रिप्शन कुंजी को जावा में कैसे सुरक्षित रूप से संग्रहीत कर सकता हूं? OpenGraph या Schema.org? अनुवाद एनीमेशन जब टीडीपी के बजाय यूडीपी का उपयोग करना उचित है? .NET में LINQ और लम्बा अभिव्यक्ति की कार्यक्षमता और प्रदर्शन क्या है? जब डेटा जोड़ दिया जाता है तो कैसे div के अंत तक ऑटो-स्क्रॉल करें? Google ऐप स्क्रिप्ट टाइमआउट ~ 5 मिनट? ललाबा अभिव्यक्ति का प्रयोग उपक खंड स्थैतिक वर्ग सदस्यों पर अनसुलझे बाहरी प्रतीक LINQ में उच्चतम तिथि के साथ ही रिकॉर्ड का चयन कैसे करें क्या पायथन में एक "बराबर" ऑपरेटर नहीं है? वास्तविक गति के लिए बाध्यकारी काम नहीं करती है ASP.NET MVC – मूल्य प्रकारों के लिए कस्टम सत्यापन संदेश कैसे जांच करें कि डीएसटी (डेलाइट सेविंग टाइम) प्रभाव में है और यदि ऑफसेट है तो क्या है? जब कोई उपयोगकर्ता मानचित्र पर एक (व्यापार) स्थान पर क्लिक करता है तो एक क्लिक ईवेंट कैसे प्राप्त करें

ओओपी में पहचान और समानता में अंतर क्या है?

OOP (ऑबजेक्ट ओरिएंटेड प्रोग्रामिंग) में पहचान और समानता के बीच अंतर क्या है?

वेब के समाधान से एकत्रित समाधान "ओओपी में पहचान और समानता में अंतर क्या है?"

  • पहचान: एक चर उसी आवृत्ति को दूसरे चर के रूप में रखता है

  • समानता: दो अलग-अलग ऑब्जेक्ट्स को एक दूसरे शब्दों में इस्तेमाल किया जा सकता है। वे अक्सर एक ही आईडी है

उदाहरण के लिए:

Integer a = new Integer(1); Integer b = a; 

a b समान है

 Integer c = new Integer(1); Integer d = new Integer(1); 

c बराबर है लेकिन d समान नहीं है।

बेशक, दो समान चर हमेशा समान होते हैं।

जावा में समानता को equals विधि द्वारा परिभाषित किया गया equals । ध्यान रखें, यदि आप समान रूप से लागू करते हैं, तो आपको हैशोड भी लागू करना होगा

पहचान यह निर्धारित करती है कि दो ऑब्जेक्ट समान स्मृति पते साझा करते हैं या नहीं। समानता यह निर्धारित करती है कि दो ऑब्जेक्ट्स में समान स्थिति है।

यदि दो ऑब्जेक्ट समान हैं तो वे समान हैं लेकिन सिर्फ इसलिए कि दो ऑब्जेक्ट समान हैं, इसका मतलब यह नहीं है कि वे एक ही मेमोरी एड्रेस को साझा करते हैं।

स्ट्रिंग्स के लिए एक विशेष मामला है, लेकिन वह विषय बंद है और आपको किसी और को यह पूछने की ज़रूरत है कि वह वास्तव में कैसे काम करता है 😉

पहचान का अर्थ यह एक ही वस्तु उदाहरण है, जबकि समानता का अर्थ है कि आप जो वस्तुओं की तुलना करते हैं वह किसी ऑब्जेक्ट के अलग-अलग उदाहरण होते हैं, लेकिन समान डेटा शामिल होते हैं।

चित्रण (जावा में)

 Date a = new Date(123); Date b = new Date(123); System.out.println(a==b); //false System.out.println(a.equals(b)); //true 

इसलिए ए और बी विभिन्न उदाहरण (मेमोरी में अलग-अलग आवंटन) हैं लेकिन "डेटा" स्तर पर वे बराबर हैं।

"समान" और "समतुल्य" शब्दों के बारे में सोचें यदि दो चीजें समान हैं, तो उनकी एक ही पहचान है; वे एक ही चीज़ हैं यदि वे समतुल्य हैं, तो परिणाम को प्रभावित किए बिना दूसरे के लिए एक दूसरे के लिए प्रतिस्थापित किया जा सकता है; उनके समान व्यवहार और गुण हैं

उदाहरण के लिए,

स्टैक ओवरफ्लो में:

  • पहचान: मैं माइकल हूं, आप सेवरुजन हैं, इसलिए हम समान नहीं हैं।

  • समानता: यदि हमारे पास समान प्रतिष्ठा स्कोर है, तो हम कुछ मायनों में समान हैं।

जावा में और इसी तरह की भाषाएं, जो किसी वस्तु के एक संदर्भ के 'रिसाव' को अमूमन करती हैं, आप यह जांच सकते हैं कि दो संदर्भ उसी ऑब्जेक्ट को देखें। यदि वे एक ही वस्तु को संदर्भित करते हैं, तो संदर्भ समान होते हैं। जावा में, यह == ऑपरेटर है।

एक equals विधि भी है जो यह जांचने के लिए प्रयोग किया जाता है कि क्या दो ऑब्जेक्ट्स का एक ही मान है, उदाहरण के लिए जब एक HashSet (बराबर ऑब्जेक्ट्स का हैश कोड बराबर होना चाहिए) के रूप में उपयोग किया जाता है क्लाइंट कोड द्वारा उपयोग किए जाने पर समान वस्तुओं का समान 'मान' और शब्दार्थ होना चाहिए।

शुद्ध ऑब्जेक्ट ओरिएंटेड भाषाओं में एक पहचान की तुलना नहीं होती है, क्योंकि क्लाइंट कोड को आम तौर पर परवाह नहीं करना चाहिए कि दो ऑब्जेक्ट्स की समान मेमोरी एड्रेस है या नहीं। यदि वस्तुएं एक ही वास्तविक-विश्व इकाई का प्रतिनिधित्व करती हैं, तो यह पहचान के बजाय कुछ आईडी या कुंजी मान का उपयोग करके बेहतर ढंग से किया जाता है, जो फिर बराबर अनुबंध का हिस्सा बन जाता है। असली-विश्व की पहचान के लिए ऑब्जेक्ट के मेमोरी पते पर निर्भर नहीं कैशिंग और वितरित व्यवहार को सरल करता है, और दबाकर == स्ट्रिंग की तुलना में कुछ बग को निकाल देगा या जावा में प्राइमिटिव के मुक्केबाजी के कुछ इस्तेमाल करेगा।

पहचान: एक ही ऑब्जेक्ट के दो संदर्भ ( o1 == o2 )

समानता: विधि o1.equals( o2 ) true देता true इसका अनिवार्य अर्थ यह नहीं है कि दो ऑब्जेक्ट्स में (सभी) समान डेटा होते हैं

सिद्धांत में समान वस्तुओं के लिए false वापसी करने के लिए एक विधि equals() को ओवरराइड करना संभव है equals() लेकिन यह Object.equals() के विनिर्देश को तोड़ देगा। Object.equals() :

बराबर विधि गैर अशक्त वस्तु संदर्भों पर एक तुल्यता संबंध लागू करता है:

  • यह आत्मक्षेपिक है: किसी भी गैर-निरर्थक संदर्भ मान x, x.equals (x) के लिए सत्य को वापस करना चाहिए।
  • यह सममित है: किसी भी गैर-निरर्थक संदर्भ मानों के लिए x और y, x.equals (y) को सही होना चाहिए यदि और केवल अगर y.equals (x) रिटर्न सही हो।
  • यह संक्रमणीय है: किसी भी गैर-निरर्थक संदर्भ मान एक्स, वाई, और जेड के लिए, यदि x.equals (y) सही देता है और y.equals (z) रिटर्न सही होता है, तो x.equals (z) को सच वापस करना चाहिए।
  • यह संगत है: किसी भी गैर-निरर्थक संदर्भ मान x और y के लिए, x.equals (y) के कई आमंत्रण लगातार सत्य या लगातार लौट आएंगे, बशर्ते ऑब्जेक्ट के बराबर तुलना में उपयोग की जाने वाली कोई भी जानकारी संशोधित नहीं है।
  • किसी भी गैर-निरर्थक संदर्भ मान x, x.equals (null) के लिए झूठी वापसी करना चाहिए।

For primitive types ( int , boolean , char, long , float ... )
== और! = समानता परीक्षा है

and for Objects
== और! = पहचान परीक्षण है। [यह केवल संदर्भ की तुलना करता है]

equals विधि वस्तु के समानता परीक्षण के लिए उपयोग किया जाता है [विशिष्ट विशेषताओं की तुलना करने के लिए इसे ओवरराइड किया जा सकता है]

मुझे इस http://www.cs.cornell.edu/courses/cs211/2006sp/Lectures/L14-Comparison/L14cs211sp06.pdf पर एक उत्कृष्ट लेख मिला

http://ocw.mit.edu/NR/rdonlyres/Electrical-Engineering-and-Computer-Science/6-170Fall-2005/D659DC53-FB1D-403C-8E35-2CAECBED266E/0/lec12.pdf

उद्धरण
मुझे सूअरों की तरह कुत्ते हम पर निर्भर हैं। बिल्लियां हमारा तिरस्कार करती हैं। सूअर हमसे बराबरों की तरह व्यवहार करते हैं। : डी
Sir Winston Churchill

पहचान की अवधारणा काफी दार्शनिक है, यही कारण है कि आपको इसे सिर्फ संदर्भों में नहीं याद रखना चाहिए।

आप कह सकते हैं कि दो पहचान समान हैं अगर पहली बार में बदलाव दूसरी और इसके विपरीत परिलक्षित होता है। बेशक इसमें एक ही मेमोरी एड्रेस को साझा करना शामिल है, लेकिन सामान्य तौर पर जब पहचान वस्तु के गुणों से संबंधित होती है, समानता का उपयोग जब भी दो ऑब्जेक्ट समान होता है, जांचने के लिए किया जाता है, लेकिन इसमें पहचान शामिल नहीं है

उपाध्यक्ष काफी स्पष्ट हैं, यदि दो वस्तुओं की एक ही पहचान है तो वे समान हैं (समानता में विनिमेय होने के मामले में)

x == y केवल तब ही सत्य है जब चर x और y द्वारा संदर्भित वही वस्तु है

x.equals(y) के कार्यान्वयन पर निर्भर करता है, और आमतौर पर उपरोक्त कम सख्त है, क्योंकि यह ऑब्जेक्ट की सामग्री की तुलना करता है। (जावा में, यदि x.equals(y) , तो यह भी सत्य होना चाहिए कि x.hashCode() == y.hashCode(); )

उदाहरण:

 Integer w = new Integer(3); Integer x = new Integer(1); Integer y = x; Integer z = new Integer(1); // all of these evaluate to true y.equals(x) // it's the same object, of course the content is same x.equals(z) // different objects, same content (`1`) z.equals(y) !w.equals(x); // the content is different (`3` vs `1`) !w.equals(y); !w.equals(z); x == y // same object z != x // different objects y != z w != x 

मेरा वीडियो देखें जो पहचान और समानता के बीच अंतर को अच्छी तरह से दो कदम कोडिंग उदाहरणों सहित समझाता है: https://www.youtube.com/watch?v=OOpO46_k7Uo