2012-03-22 16 views
11

निम्नलिखित कोड वास्तव में मुझे भ्रमित कर रहा था क्योंकि यह दो अलग-अलग आउटपुट प्रदान करता था। कोड जेडीके 1.7 पर परीक्षण किया गया था।कैसे! = और == ऑपरेटर जावा में इंटीग्रर्स पर काम करते हैं?

public class NotEq { 

public static void main(String[] args) { 

    ver1(); 
    System.out.println(); 
    ver2(); 
} 

public static void ver1() { 
    Integer a = 128; 
    Integer b = 128; 

    if (a == b) { 
     System.out.println("Equal Object"); 
    } 

    if (a != b) { 
     System.out.println("Different objects"); 
    } 

    if (a.equals(b)) { 
     System.out.println("Meaningfully equal."); 
    } 
} 

public static void ver2() { 
    Integer i1 = 127; 
    Integer i2 = 127; 
    if (i1 == i2) { 
     System.out.println("Equal Object"); 
    } 

    if (i1 != i2){ 
     System.out.println("Different objects"); 
    } 
    if (i1.equals(i2)){ 
     System.out.println("Meaningfully equal"); 
    } 
} 

} 

आउटपुट:

[ver1 उत्पादन]
विभिन्न वस्तुओं
सार्थक बराबर।

[उत्पादन ver2]
समान वस्तु
सार्थक बराबर

क्यों == और! = परीक्षण ver1() और एक ही नंबर पूर्णांक से बहुत कम के लिए ver2() के लिए अलग-अलग परिणाम पैदा करता है। अधिकतम मूल्य? क्या यह निष्कर्ष निकाला जा सकता है कि == 127 से अधिक संख्याओं की जांच (कोड में दिखाए गए इंटीजर जैसे रैपर वर्गों के लिए) पूरी तरह बर्बाद है?

+3

ऐसा इसलिए है क्योंकि ऑटोबॉक्सिंग तंत्र कैश -128 - 127 में मानों के लिए उसी ऑब्जेक्ट को कैश करता है और पुन: उपयोग करता है। यह पिछले प्रश्न का डुप्लिकेट है। – aioobe

+0

@quixoto: मेरी संपादन प्रतिक्रिया देखें :) – BoltClock

+1

http://stackoverflow.com/questions/1700081/why-does-128-128-return-false-but-127-127-return-true-when-converting-to -integ –

उत्तर

10

इंटीग्रर्स -128 और 127 के बीच मूल्यों के लिए कैश किए गए हैं, इसलिए Integer i = 127 हमेशा एक ही संदर्भ लौटाएंगे। Integer j = 128 आवश्यक नहीं होगा। इसके बाद अंतर्निहित int की समानता के परीक्षण के लिए आपको equals का उपयोग करने की आवश्यकता होगी।

यह Java Language Specification का हिस्सा है:

यदि मान पी बॉक्सिंग किया जा रहा सच है, गलत है, एक बाइट, या श्रेणी \ u0000 में एक चार को \ u007f, या के बीच एक पूर्णांक या कम संख्या -128 और 127 (समावेशी), फिर आर 1 और आर 2 पी के किसी भी दो मुक्केबाजी रूपांतरण के परिणाम होने दें। यह हमेशा मामला है कि आर 1 == आर 2।

कम स्मृति सीमित कार्यान्वयन हो सकता है, उदाहरण के लिए, कैश सभी चार और कम मूल्यों, साथ ही पूर्णांक और लंबे समय:

लेकिन 2 Integer j = 128 के लिए कॉल एक ही संदर्भ (इसकी गारंटी नहीं) वापस कर सकती है -32 के लिए +32 के दायरे में मूल्य।

+0

हालांकि कन्स्ट्रक्टर कैशिंग का उपयोग नहीं करता है। आज़माएं: System.out.println (नया इंटीजर (2) == नया इंटीजर (2)) – fgb

+1

'नया इंटीजर (127)' कभी भी वही संदर्भ नहीं देगा। वास्तव में, यह हमेशा एक नई वस्तु बनाने की गारंटी देता है। लेकिन जब ऑटो-मुक्केबाजी का उपयोग 'इंटीजर i = 127' में किया जाता है, तो कैश का उपयोग किया जाता है। बीटीडब्ल्यू ऊपरी सीमा 127 तय नहीं है लेकिन न्यूनतम। इसे एक बड़े मूल्य पर कॉन्फ़िगर किया जा सकता है लेकिन कम नहीं। –

4

क्योंकि जावा में छोटे पूर्णांक इंटर्न किए जाते हैं, और आपने "छोटीपन" सीमा के विभिन्न पक्षों पर संख्याओं की कोशिश की।

+0

@downvoter, क्या आप अपने वोट पर विस्तृत जानकारी देना चाहते हैं? – dasblinkenlight

0

जावा कैश पूर्णांक -128 से 127 तक यही कारण है कि वस्तुएं समान हैं।

0

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

मैं इस पर निश्चित नहीं हूं, लेकिन ऑब्जेक्ट्स के साथ == परीक्षण करेगा यदि एक ऑब्जेक्ट एक ही ऑब्जेक्ट है या नहीं, जबकि .equals() परीक्षण करेगा कि उन दो ऑब्जेक्ट्स में मान में समानता है (या विधि कस्टम ऑब्जेक्ट्स के लिए बनाया/ओवरराइड किया जाना चाहिए)।

3

डिफ़ॉल्ट रूप से -128 और 127 तक एक इंटीजर ऑब्जेक्ट कैश मौजूद है। ऊपरी सीमा को कॉन्फ़िगर किया जा सकता है।ऊपरी कैश सीमा वी एम विकल्प द्वारा नियंत्रित किया जा सकता -XX:AutoBoxCacheMax=<size>

आप इस कैश का उपयोग कर रहे आप फार्म का उपयोग करें जब:

Integer i1 = 127; 

या

Integer i1 = Integer.valueOf(127); 

लेकिन आप का उपयोग करते हैं

Integer i1 = new Integer(127); 

तो आपको एक नई अनैच्छिक वस्तु प्राप्त करने की गारंटी है। बाद के मामले में दोनों संस्करण एक ही परिणाम मुद्रित करते हैं। कैश किए गए संस्करणों का उपयोग करके वे भिन्न हो सकते हैं।

+0

जानना अच्छा लगा। उत्पादन में ऐसा मत करो। – atamanroman

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