संक्षिप्त उत्तर
मुख्य बिंदु यह है:
==
दो संदर्भ प्रकारों के बीच हमेशा संदर्भ तुलना होती है
- अधिक बार नहीं, उदाहरण के लिए
Integer
और String
, आप equals
इसके बजाय उपयोग करना चाहते हैं
==
एक संदर्भ प्रकार और एक संख्यात्मक आदिम प्रकार के बीच हमेशा संख्यात्मक तुलना होती है
- संदर्भ प्रकार को अनबॉक्सिंग रूपांतरण के अधीन किया जाएगा
- अनबॉक्सिंग
null
हमेशा फेंकता हैNullPointerException
- जबकि जावा के लिए कई विशेष उपचार हैं
String
, यह वास्तव में एक आदिम प्रकार नहीं है
उपरोक्त कथन किसी भी मान्य जावा कोड के लिए हैं। इस समझ के साथ, आपके द्वारा प्रस्तुत स्निपेट में कोई असंगतता नहीं है।
दीर्घ उत्तर
यहाँ प्रासंगिक JLS अनुभाग हैं:
यदि एक समतुल्य ऑपरेटर के संचालक दोनों संदर्भ प्रकार या अशक्त प्रकार के हैं, तो ऑपरेशन ऑब्जेक्ट समानता है।
यह निम्नलिखित बताते हैं:
Integer i = null;
String str = null;
if (i == null) {
}
if (str == null) {
}
if (str == "0") {
}
दोनों ऑपरेंड संदर्भ प्रकार हैं, और इसीलिए ==
संदर्भ समानता तुलना है।
यह भी निम्नलिखित बताते हैं:
System.out.println(new Integer(0) == new Integer(0));
System.out.println("X" == "x".toUpperCase());
के लिए ==
संख्यात्मक समानता होने के लिए, संकार्य कम से कम एक एक अंकीय प्रकार होना चाहिए :
यदि एक समानता ऑपरेटर के ऑपरेंड संख्यात्मक प्रकार के दोनों होते हैं , या एक संख्यात्मक प्रकार का होता है और दूसरा संख्यात्मक प्रकार के लिए परिवर्तनीय होता है, तो ऑपरेंड्स पर बाइनरी न्यूमेरिक प्रमोशन किया जाता है। यदि ऑपरेंड का प्रचारित प्रकार int
या है long
, तो एक पूर्णांक समानता परीक्षण किया जाता है; यदि पदोन्नत प्रकार float or
double` है, तो एक फ्लोटिंग-पॉइंट समानता परीक्षण किया जाता है।
ध्यान दें कि बाइनरी न्यूमेरिक प्रमोशन वैल्यू सेट रूपांतरण और अनबॉक्सिंग रूपांतरण करता है।
यह बताते हैं:
Integer i = null;
if (i == 0) {
}
यहाँ प्रभावी जावा 2 संस्करण से एक अंश है , आइटम 49: बॉक्सिंग आदिम के लिए प्राथमिकताओं को प्राथमिकता दें :
सारांश में, जब भी आपके पास विकल्प हो, तो बॉक्सिंग आदिम करने के लिए प्राथमिकताओं का उपयोग करें। आदिम प्रकार सरल और तेज हैं। यदि आप बॉक्सिंग आदिम का उपयोग करना चाहिए, सावधान! ऑटोबॉक्सिंग बॉक्सिंग प्राइमेटिक्स के उपयोग की क्रिया को कम करता है, लेकिन खतरे को कम नहीं करता है। जब आपका प्रोग्राम ==
ऑपरेटर के साथ दो बॉक्सिंग प्रिमिटिव्स की तुलना करता है, तो यह एक पहचान तुलना करता है, जो लगभग निश्चित रूप से आप क्या चाहते हैं। जब आपका प्रोग्राम बॉक्सिंग और अनबॉक्सिंग प्रिमाइसेस से मिश्रित-प्रकार की संगणना करता है, तो यह अनबॉक्सिंग करता है, और जब आपका प्रोग्राम अनबॉक्सिंग करता है, तो यह फेंक सकता है NullPointerException
। अंत में, जब आपका प्रोग्राम आदिम मूल्यों को बॉक्स करता है, तो इसका परिणाम महंगा और अनावश्यक ऑब्जेक्ट क्रिएशन हो सकता है।
ऐसी जगहें हैं जहां आपके पास बॉक्सिंग प्राइमेटिक्स का उपयोग करने के अलावा कोई विकल्प नहीं है, जैसे जेनेरिक, लेकिन अन्यथा आपको गंभीरता से विचार करना चाहिए कि क्या बॉक्सेड प्राइमेटिव्स का उपयोग करने का निर्णय उचित है।
संदर्भ
संबंधित सवाल
संबंधित सवाल