2009-11-07 17 views
27

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

+0

मैंने कर्नेल पैनिक या प्रोग्रामिंग भाषा के रूप में "ओप्स" पढ़ा है जिसे मैंने कभी नहीं सुना है। –

+0

मैंने पढ़ा कि एक मिनट के लिए लूप और आश्चर्य के रूप में जब मैं ऐसी स्थिति में मारा जहां पहचान बनाम समानता mattered। – Esko

+0

मैंने ऊपर दिए गए लोगों के लाभ के लिए संक्षिप्त नाम समझाए जाने के लिए प्रश्न टेक्स्ट संपादित किया है। –

उत्तर

46
  • पहचान: एक चर ही एक और चर के रूप में उदाहरण रखती है।

  • समानता: दो अलग वस्तुओं interchangeably उपयोग किया जा सकता है। वे अक्सर एक ही आईडी है।

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

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

ab के समान है।

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

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

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

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

+0

असल में, जावा 1.5+ में इंटीजर पूलिंग के कारण, आपके उदाहरण में, एक == बी, तो वे समान हैं! इसे 1.5 या उच्चतर जेवीएम पर आज़माएं! – MetroidFan2002

+8

यह गलत मेट्रॉइड है। जैसा कि मेरे द्वारा एक अलग उत्तर में उल्लेख किया गया है, संकलन "नए" ऑपरेटर के साथ ऑब्जेक्ट आवंटित करते समय एक चाल नहीं कर सकता है। केवल अगर आप उन्हें Integer.valueof (1) के साथ बनाते हैं तो वस्तुओं को पूल किया जाएगा। –

5

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

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

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

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

13

पहचान निर्धारित करती है कि दो वस्तुएं एक ही स्मृति पते साझा करती हैं या नहीं। समानता निर्धारित करती है कि क्या दो वस्तु में एक ही स्थिति है।

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

वहाँ स्ट्रिंग्स के लिए एक विशेष मामला है लेकिन इस विषय पर बंद है और आप के बारे में किसी और से पूछने के लिए कैसे है कि वास्तव में काम करता है ;-)

+0

जावा में स्ट्रिंग्स के लिए कोई विशेष मामला है? मैंने सोचा था कि सिर्फ .NET – finnw

+2

तारों में कभी-कभी प्रशिक्षित होते हैं, उदाहरण के लिए जब वे संकलन-समय स्थिरांक होते हैं। –

1

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

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

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

0

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

x.equals(y)x.equals() के कार्यान्वयन पर निर्भर करता है, और आमतौर पर उपरोक्त है, क्योंकि यह वस्तु की सामग्री की तुलना करता है।

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 
0

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

and for Objects
== और है:

उदाहरण (जावा में, यदि x.equals(y), यह भी सच है कि x.hashCode() == y.hashCode(); होना चाहिए)! = पहचान परीक्षण है। [यह तुलना केवल संदर्भ]

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

1

पहचान: एक ही वस्तु (o1 == o2) को दो संदर्भ।

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

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

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

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

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

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

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

2

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

3

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

Stackoverflow में:

  • पहचान: मैं माइकल हूँ, आप sevugarajan हैं, इसलिए हम ही नहीं हैं।

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

संबंधित मुद्दे