2017-06-08 8 views
49

मुझे पता है कि '==' [-128,127] की सीमा के बाहर मानों के साथ काम नहीं करता है क्योंकि इस सीमा के भीतर इंटीजर ऑब्जेक्ट्स का कैश बनाए रखा गया है और यदि मान सीमा के भीतर है तो वही संदर्भ वापस कर दिया जाता है। लेकिन '>', '<', '> =', '< =' क्यों सीमा के बाहर भी सही उत्तर देते हैं?'<', '>' रैपर वर्गों के साथ काम क्यों करता है जबकि '==' नहीं होता है?

Integer a=150; 
Integer b=150; 
System.out.println(a==b); //returns false 

Integer a=150; 
Integer b=150; 
System.out.println(a>=b); // returns true 

ऐसा क्यों हो रहा है?

उत्तर

82

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

इसका मतलब यह है

System.out.println(a>=b); 

System.out.println(a.intValue()>=b.intValue()); 

हालांकि के बराबर है, == और != ऑपरेटरों, दोनों आदिम प्रकार और संदर्भ प्रकार के लिए मौजूद हैं तो उन्हें प्रयोग आदिम आवरण प्रकार के दो वस्तुओं की तुलना करने के लिए उनके द्वारा लपेटे गए आदिम मूल्यों के बजाय संदर्भों की तुलना करता है।

रूप होल्गर टिप्पणी की, == और != के साथ वस्तु के संदर्भ जावा भाषा ऑटो मुक्केबाजी और ऑटो unboxing से पहले में ही अस्तित्व में की तुलना शुरू किए गए थे, लेकिन तुलना के साथ <, >, <= और >= किसी भी संदर्भ प्रकार से पहले के लिए समर्थित नहीं किया गया था ऑटो-अनबॉक्सिंग पेश की गई थी।

इसका मतलब यह है कि जावा के शुरुआती दिनों में, अपने कोड स्निपेट के a>=b (a के बाद से और b आदिम सांख्यिक प्रकार नहीं कर रहे हैं) संकलन पारित नहीं होता। दूसरी ओर आपके a==b स्निपेट अभी भी संकलन पास करेगा और false लौटाएगा।

संख्यात्मक प्राइमेटिव्स के रैपर होने वाले संदर्भ प्रकारों के लिए == और != के व्यवहार को बदलने से मौजूदा कोड का व्यवहार बदल जाएगा, इस प्रकार पिछली संगतता को तोड़ दिया जाएगा, जो शायद ऐसा नहीं हुआ है।

+0

धन्यवाद। मुझे लगता है कि यह '> =' और '<=' ऑपरेटरों के साथ भी मामला है? –

+0

@ गौरंगसिंहल हां – Eran

+6

ऑटो-अनबॉक्सिंग के परिचय से पहले जावा में मौजूद संदर्भों की तुलना करने के लिए '==' और'! = 'का उपयोग करने की संभावना यह ध्यान देने योग्य हो सकती है, इसलिए उन्हें अनबॉक्स किए गए मानों की तुलना करने के लिए परिभाषित करना असंभव था, क्योंकि यह संगतता तोड़ देगा। उस विरासत के बिना, संदर्भ तुलना के लिए एक अलग ऑपरेटर को परिभाषित करना संभव होगा और सबसे साफ समाधान होगा। दुर्भाग्य से, वह जहाज चला गया है ... – Holger

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