2008-12-04 9 views
7

क्या आप जानते हैं कि:क्यों सार संग्रह समान() लागू नहीं करता है?

Map<Object,Object> m1 = new HashMap<Object, Object>(); 
Map<Object,Object> m2 = new HashMap<Object, Object>(); 
System.out.println("m1.equals(m2) = "+m1.equals(m2)); 
System.out.println("m1.keySet().equals(m2.keySet()) = " 
      +m1.keySet().equals(m2.keySet())); 
System.out.println("m1.entrySet().equals(m2.entrySet()) = " 
      +m1.entrySet().equals(m2.entrySet())); 
System.out.println("m1.values().equals(m2.values()) = " 
      +m1.values().equals(m2.values())); 

उत्पादन होगा:

m1.equals(m2) = true 
m1.keySet().equals(m2.keySet()) = true 
m1.entrySet().equals(m2.entrySet()) = true 
m1.values().equals(m2.values()) = false 

इस तथ्य यह है कि AbstractCollection (जिसमें से HashMap$Values inherits) #equals() ओवरराइड करता है नहीं करता है के कारण होता है।

क्या आपको पता है कि ऐसा क्यों है?

उत्तर

6

Collection#equals() के अनुबंध के अनुसार, वहाँ कोई सामान्य प्रयोजन के बराबर होती है() Collection रों के लिए तरीके है, और इस तरह AbstractCollection एक प्रदान नहीं कर सकते।

ध्यान दें कि HashMap$Values न तो एक सेट है और न ही एक सूची है, इस प्रकार व्याकुलता और एक अर्थ में कारण यह equals() का समर्थन नहीं करता है।

+0

मुझे आपका जवाब पसंद है, आपने मेरे जैसा कुछ कहा है लेकिन बेहतर तरीके से। मान सेट या सूची नहीं है, लेकिन आप इसे बैग की तरह सोच सकते हैं। बैग semantics के साथ बराबर() लागू क्यों नहीं? –

+0

@Motlin: मैं मानता हूं कि हमारे उत्तर समान हैं, दुर्भाग्य से हमने एक दूसरे के सेकंड के भीतर जवाब दिया।जहां तक ​​बैग अर्थशास्त्र, एक कम्यूटिवेटिव शामिल है() चेक दुर्भाग्य से List.equals() और Set.equals() के अनुबंधों को तोड़ देगा (क्योंकि वे अब खुद को कम्यूटिव नहीं करेंगे)। –

0

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

उदाहरण के लिए, TreeSet, LinkedList, बैग पर विचार करें, आदि

Btw, कोड आप पोस्ट के संबंध में, क्या जो कुछ मूल्यों से दिया जाता है के वास्तविक प्रकार है? यह एक ठोस कार्यान्वयन के साथ एक उप-वर्ग होना चाहिए .. यदि आप इस कोड को चलाते समय अपना नक्शा खाली होता है, तो यह संभव है कि आप उस चीज़ के साथ समाप्त हो जाएंगे जो दो रिक्त सेट बराबर नहीं मानता है।

+0

प्रश्न में उल्लेख किया गया है कि मान() द्वारा दिए गए प्रकार हैशैप $ मान –

+0

सही है, लेकिन यह क्या है? क्या यह एक कस्टम डेटा संरचना या मौजूदा डेटा संरचना है? मुझे लगता है कि यह किसी प्रकार का इटरेटर है? – Uri

4

सार सारणी और सार तत्व दोनों सार संग्रह का विस्तार करते हैं, और इंटरफेस List और Set द्वारा निर्दिष्ट उनके बराबर() विधियों के लिए उनके अलग-अलग व्यवहार हैं। Collection के लिए इंटरफ़ेस का कहना है:

जबकि संग्रह इंटरफ़ेस Object.equals के लिए सामान्य अनुबंध करने के लिए कोई शर्तों कहते हैं, प्रोग्रामर जो संग्रह इंटरफ़ेस को लागू "सीधे" (दूसरे शब्दों में, एक बनाने कक्षा जो संग्रह है लेकिन सेट या सूची नहीं है) पर ध्यान देना चाहिए यदि वे ऑब्जेक्ट.equals को ओवरराइड करना चुनते हैं।

तो सार संग्रह को निश्चित रूप से बराबर ओवरराइड नहीं करना चाहिए()। उस ने कहा, मुझे वास्तव में पता नहीं है कि हैशैप $ मूल्य क्यों बराबर() खुद को लागू नहीं करेगा।

+0

ग्रेट उत्तर। शायद मैं एक और सवाल पूछूंगा कि क्यों हैश मैप $ वैल्यू बराबर लागू नहीं करता है() (संभवतः क्योंकि किसी को इसकी आवश्यकता नहीं है)। मुझे लगता है कि मैं ग्रेग केस के जवाब को मान्य कर दूंगा क्योंकि आप अपने शब्द को पसंद करते हैं। – Michel

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