2015-03-19 5 views
8

मुझे यह एक बहुत ही बुनियादी सवाल पता है लेकिन मैं अवधारणा के बारे में स्पष्ट होना चाहता हूं। मैं जानना चाहता हूं कि कैसे == ऑपरेटर आदिम और ऑब्जेक्ट प्रकार के मामले में काम करता है। उदाहरणआदिम और ऑब्जेक्ट प्रकार डेटा के साथ बराबर ऑपरेटर कैसे काम करता है

Integer a = 1; 
int b = 1; 
System.out.println(a == b) 

के लिए कैसे a, b के साथ तुलना में किया जाता है जबकि a वस्तु के रेफरी कि किसी ने मुझे इसकी clearify कर सकते हैं कि यह कैसे काम करता है आंतरिक रूप से मान 1 होता है शामिल?

+4

[इस प्रश्न] [http://stackoverflow.com/q/20877086) के उत्तरों पर नज़र डालें, जो निकट से संबंधित है। आप [ऑटो-अनबॉक्सिंग] (http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html) पर भी पढ़ना चाहेंगे, जिसका उपयोग आपके द्वारा उद्धृत कोड में किया जाएगा। –

+0

http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html – ha9u63ar

+0

संभावित डुप्लिकेट [जब आदिम और बॉक्स किए गए मान के लिए == का उपयोग करते समय, ऑटोबॉक्सिंग किया जाता है, या अनबॉक्सिंग किया जाता है] (http : //stackoverflow.com/questions/30454635/when-using-for-a-primitive-and-a-boxed-value-is-autoboxing-done-or-is-unbox) – davidwebster48

उत्तर

7

सामान्य रूप से जावा में समानता ऑपरेटर एक तथाकथित उथले तुलना करता है। दूसरे शब्दों में यह वैरिएबल वाले मानों की तुलना करता है। अब आदिम डेटा प्रकारों के चर में मूल्य होता है जबकि संदर्भ प्रकारों में ढेर क्षेत्र का संदर्भ होता है जो वास्तविक सामग्री को संग्रहीत करता है। इसका मतलब है कि आपके कोड स्निपेट int b में मूल्य 1 और Integer a होगा, ढेर पर वास्तविक इंटीजर ऑब्जेक्ट का मेमोरी पता होगा।

अब आपके द्वारा प्रदान किए गए विशेष उदाहरण में एक pecularity है। इंटीजर क्लास एक विशेष रैपर वर्ग जो प्राचीन पूर्णांक प्रकारों को लपेटता है। कंपाइलर स्वचालित रूप से ऐसे रैपर ऑब्जेक्ट्स और आदिम प्रकारों (जिसे मुक्केबाजी और अनबॉक्सिंग कहा जाता है) के बीच परिवर्तित कर सकते हैं।

चलिए आपको चरणबद्ध कदम से कोड चरण चलते हैं।

Integer a = 1; 

संकलक वास्तव में निम्न कोड इस लाइन के insted substitue:

Integer a = Integer.valueOf(1); 

स्थिर विधि valueOf एक आवरण वस्तु दृष्टान्त प्रदान किए हैं कि आदिम मूल्य लपेटता देता है। यह प्रक्रिया जब संकलक एक प्राचीन प्रकार से एक रैपर वर्ग बनाता है उसे मुक्केबाजी कहा जाता है।

इस तरह के एक आवरण वस्तु का उपयोग करते समय समानता ऑपरेटर

a == b 

संकलक वास्तव में निम्नलिखित के लिए यह परिवर्तन का उपयोग कर एक आदिम चर के साथ के साथ तुलना में है:

a.intValue() == b; 

जहां intValue रिटर्न आदिम मूल्य लिपटे रैपर ऑब्जेक्ट (जिसे अनबॉक्सिंग कहा जाता है) द्वारा यानी यह आदिम मूल्य को अनबॉक्स करता है और अभिव्यक्ति को दो प्राइमेटिव की तुलना करने के बराबर बनाता है। यही कारण है कि समानता ऑपरेटर true

4

आपके विशेष उदाहरण में बॉक्स किए गए प्रकार इंटीजर को एक प्राचीन प्रकार int और == पर अनबॉक्स किया जाएगा प्राइमेटिव की तुलना करेगा (यानी आपके मामले में सत्य)।

+0

इसका मतलब है कि पहले ऑटो अनबॉक्सिंग तब वास्तविक होती है मान ((autounboxing) obj == val) स्मृति में तुलना की गई है ref == val। अगर मेरी समझ गलत है तो मुझे सही करो। –

+0

सुनिश्चित नहीं है कि अगर मैं आपकी टिप्पणी समझ गया हूं लेकिन यहां अनबॉक्सिंग रूपांतरण के लिए एक कल्पना है: http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.8 –

+0

हां, एक प्राचीन प्रकार के साथ एक रैपर ऑब्जेक्ट की तुलना अनबॉक्सिंग में होती है ताकि आप दो आदिम मानों की तुलना कर सकें, मेरा उत्तर देखें – akhilless

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