2011-08-07 12 views
23

बराबर है यदि मैं कक्षा के लिए java.lang.Comparable लागू करता हूं, तो क्या मुझे अभी भी equals() विधि ओवरराइड करना है? या Comparableequals के लिए भी काम करेगा?java.lang.Comparable और

यदि उत्तर कोई है, तो क्या होगा यदि कुछ विसंगति उत्पन्न होती है? आइए मान लें कि जिस तरह से मैं equals() विधि के बराबर दो ऑब्जेक्ट्स को बराबर करता हूं, वैसे ही Comparable के compareTo() के बराबर उसी वर्ग की दो ऑब्जेक्ट्स को अलग करता है।

इसके अलावा, अगर मैं Comparable लागू करता हूं, तो मुझे equals() ओवरराइड करना होगा?

उत्तर

26

यह अनुशंसा की जाती है जबकि है (और बहुत समझदार) होने a.compareTo(b) == 0 मतलब है कि उस a.equals(b) (और वीजा विपरीत), यह है नहीं की आवश्यकता है। Comparable ऑब्जेक्ट्स की श्रृंखला पर ऑर्डर करने के दौरान उपयोग किया जाने वाला है, जबकि equals() सीधे समानता के लिए परीक्षण करता है।

This link में compareTo को लागू करने पर कुछ अच्छी जानकारी है।

+0

+1 यहां प्रासंगिक प्रभावी जावा के अध्यायों (आइटम 11 देखें) करने के लिए एक लिंक भी है शामिल http://java.sun.com/developer/Books/effectivejava/Chapter3.pdf – MByD

+0

@MByD लिंक के लिए धन्यवाद। यह (आश्चर्यजनक रूप से) कहता है कि यह मुझसे बेहतर है! – dlev

+0

@MbyD लिंक के लिए धन्यवाद। क्या कॉल करना ठीक है।तुलना करें (बी) या तुलना करें() सीधे? – aps

7

java.lang.Comparable की जावाडोक से:

यह सलाह दी जाती है (हालांकि इसकी आवश्यकता नहीं) है कि प्राकृतिक orderings बराबरी के अनुरूप होना।

0

की तरह से मैं बराबर बराबर() के रूप में दो वस्तुओं शब्द बोलने विधि तरह से मैं के रूप में एक ही कक्षा की दो वस्तुओं शब्द से अलग है दो:

बस BigDecimal एपीआई को देखो तुलनात्मक के tocompare() के बराबर?

आप ऐसा करते हैं, और आप सेट हल एक में उन वस्तुओं डालें, तो सेट दुर्व्यवहार होगा। From the docs on SortedSet:

ध्यान दें कि आदेश एक क्रमबद्ध सेट (एक स्पष्ट तुलनित्र प्रदान की जाती है या नहीं) द्वारा बनाए रखा बराबरी के अनुरूप होना चाहिए अगर अनुसार क्रमबद्ध सेट सही ढंग से सेट इंटरफ़ेस को लागू करने के लिए है।

उदाहरण के लिए, एक TreeSet सकता है (ग़लती से) दो वस्तुओं जहां

a.compareTo(b) != 0 

भले ही

a.equals(b) == true 
+1

सभी 'ट्रीसेट' ऑपरेशंस 'तुलना करने के लिए' का उपयोग करके किए जाते हैं - इसलिए ऑब्जेक्ट्स कि तुलना रिटर्न '! = 0' को अलग माना जाता है, और ऑब्जेक्ट्स कि तुलना' == 0' समान होती है (और इस प्रकार केवल पहले को जोड़ा जाता है सेट वास्तव में बनाए रखा है)। जैसा कि जावाडोक कहते हैं: 'एक क्रमबद्ध सेट का व्यवहार अच्छी तरह से परिभाषित किया गया है भले ही उसका आदेश बराबर के साथ असंगत हो; यह सिर्फ सेट इंटरफ़ेस के सामान्य अनुबंध का पालन करने में विफल रहता है –