2012-08-30 24 views
5

संभव डुप्लिकेट:
Integer wrapper objects share the same instances only within the value 127?
How != and == operators work on Integers in Java?अप्रत्याशित परिणाम तुलना करते समय ints

मैं निम्नलिखित मामलों के साथ दो ints की तुलना करने की कोशिश की और मिला अप्रत्याशित परिणाम

  1. जब मैंने follo किया था विंग, @@@ मुद्रित किया गया था।

    class C { 
        static Integer a = 127; 
        static Integer b = 127; 
        public static void main(String args[]){ 
        if(a==b){ 
         System.out.println("@@@"); 
        } 
        } 
    } 
    
  2. जब मैंने निम्नलिखित किया, @@@ मुद्रित नहीं किया गया था।

    class C { 
        static Integer a = 145; 
        static Integer b = 145; 
        public static void main(String args[]){ 
        if(a==b){ 
         System.out.println("@@@"); 
        } 
        } 
    } 
    

किसी को भी मुझे बता सकते हैं क्या कारण हो सकता है।

+0

किसी को फ़ॉर्मेट सकता है ... [पूर्णांक आवरण वस्तुओं की – Rookie

+4

संभव डुप्लिकेट एक ही उदाहरणों साझा करने के लिए केवल भीतर it..I नहीं पा रहा हूँ मूल्य 127?] (http://stackoverflow.com/questions/5117132/integer-wrapper-objects-share-the-same-instances-only-within-the-value-127) और [नया इंटीजर बनाम valueOf] (http://stackoverflow.com/questions/2974561) और [जावा के ==] पर असंगत व्यवहार (http://stackoverflow.com/questions/1148805) और [इंटीजर रैपर ऑब्जेक्ट्स केवल 127 के भीतर समान उदाहरण साझा करते हैं?] (http://stackoverflow.com/questions/5117132) और ... –

+2

यदि आप रुचि रखते हैं तो अधिक जानकारी http://vanillajava.blogspot.co।uk/2012/01/आश्चर्यजनक-परिणाम-autoboxing.html –

उत्तर

8

आप वस्तुओं की पहचान की तुलना कर रहे हैं। 128 से कम मानों के लिए इंटीजर क्लास अपनी ऑब्जेक्ट्स को कैश करता है। यही कारण है कि यह पहले उदाहरण में बराबर है। दूसरा उदाहरण उच्च मानों के साथ है जो कैश नहीं हैं।

जैसा कि @niklon ने बताया कि कैशिंग के लिए -128 की निचली सीमा भी है।

ऊपरी सीमा को वीएम तर्क -Djava.lang.Integer.IntegerCache.high=4711 के साथ समायोजित किया जा सकता है। पीटर की दिलचस्प ब्लॉग पोस्ट में

अतिरिक्त पठन: http://vanillajava.blogspot.co.uk/2012/01/surprising-results-of-autoboxing.html

+0

क्या यह हर दूसरे रैपर वर्ग के साथ भी होता है? –

+1

वैसे, इंटीजर कैशिंग के लिए निचली बाउंड -128 है। – niklon

+1

@niklon, यह एक कार्यान्वयन विस्तार है। [जावाडोक] (http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#valueOf%28int%29) कहता है "यह विधि हमेशा श्रेणी -128 में मानों को कैश करेगी 127, समावेशी, ** और इस सीमा के बाहर अन्य मूल्यों को कैश कर सकते हैं। ** " –

5

आप int एस की तुलना नहीं कर रहे हैं, तो आप संदर्भ समानता के लिए वस्तुओं की तुलना कर रहे हैं। .equals का उपयोग करें, या Object के बजाय int का उपयोग करें।

+1

/फिर यह पहले मामले में "@@@" क्यों प्रिंट कर रहा है ..? – Rookie

+2

@ राघव, क्योंकि जावा के कई संस्करण [छोटे 'इंटेगर की यादें] याद रखें (http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#valueOf%28int%29) : "यह विधि हमेशा श्रेणी -128 से 127 तक मानों को कैश करेगी, समावेशी, और इस सीमा के बाहर अन्य मानों को कैश कर सकती है।" –

1

यहां आप Integer ऑब्जेक्ट्स का उपयोग कर रहे हैं int प्राइमेटिव्स के विपरीत। इसलिए, आपको == के विपरीत .equals(...) के साथ दो उदाहरणों की तुलना करनी चाहिए। यदि आपने इसके बजाय आदिम प्रकार का उपयोग किया है, तो आप == का उपयोग करेंगे।

यह ध्यान रखें कि महत्वपूर्ण है, जब वस्तुओं के साथ काम कर, == संदर्भ तुलना दो वस्तुओं, न कि वास्तविक मूल्यों की - तो यह समय पर उचित रूप में अजीब परिणाम वापस आ सकते हैं।

1

उपयोग if(a.equals(b)) और == का उपयोग नहीं करते जो ऑब्जेक्ट ऑब्जेक्ट वर्ग के उपवर्गों की तुलना करने के।

== ऑपरेटर पूर्णांक, लंबे, आदि जैसे आदिम प्रकार के लिए बस है

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