2013-02-01 19 views
8

संभव डुप्लिकेट:
Integer == int allowed in javaजावा में लांग मूल्य की तुलना

क्या निम्नलिखित दो बयानों के बीच का अंतर

Long l1 = 2L; 
if(l1 == 2) 
    System.out.println("EQUAL");       
if(l1.longValue() == 2) 
    System.out.println("EQUAL"); 

वे दोनों एक ही परिणाम दे रहे हैं "बराबर है "लेकिन मेरा संदेह है कि लांग वस्तु है। यह बराबर कैसे है?

+3

यह [ऑटो-अनबॉक्सिंग] (http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html) के कारण है। – assylias

+0

यह जावा –

+0

की ऑटो मुक्केबाजी और अनबॉक्सिंग सुविधा की वजह से आप स्पष्ट रूप से – PSR

उत्तर

10

जैसा कि पहले ही टिप्पणी, में बताया जब

कर
if(l1 == 2) 

Longl1 अपने आदिम प्रकार, long के लिए स्वचालित रूप अनबॉक्स्ड हो जाता है। तो तुलना long और int के बीच है।

दूसरे मामले में, l1.longValue(), long मान प्रदान करेगा, एक आदिम रूप LongLong वस्तु का प्रतिनिधित्व करती है, इसलिए तुलना long और int के बीच फिर से किया जाएगा। your comment का उत्तर दें, What is the main difference between primitive type and wrapper class?

autoboxing पर टिप्पणियों में दिए गए लिंक को इस विषय को काफी अच्छी तरह से शामिल करें।

+0

ठीक से उलझन में हूं। अब मैं समझ गया। धन्यवाद – PSR

-1

यह व्यवहार चौड़ा और मुक्केबाजी द्वारा समझाया गया है।

1:

पहले उदाहरण में,

if(l1 == 2) 

इस प्रकार है क्या होता है संकलक गौर करती है कि आप एक आदिम मूल्य (पूर्णांक) के साथ एक आवरण (लांग) तुलना कर रहे हैं, तो यह बक्से आदिम, जिसका परिणाम:

if (l1 == new Integer(2))

2 के बाद से एक पूर्णांक (यह अंत में 'एल' का अभाव है) है।

2: अब संकलक गौर करती है कि हम एक पूर्णांक के साथ एक लंबे समय से तुलना कर रहे हैं, इसलिए यह एक लंबे समय के लिए पूर्णांक चौड़ी, जिसका परिणाम:

if (l1 == new Long(new Integer(2))

3: अब हम दो चाहता तुलना कर रहे हैं।

अन्य मामले में आसान है, यहाँ परिणाम बस है:

अगर (2L == 2)

आदिम मूल्यों, जो अनुमति दी है, भले ही वे विभिन्न प्रकार हैं की तुलना।

+0

पहले उदाहरण के बारे में आपकी स्पष्टीकरण के बारे में निश्चित नहीं है। मुझे लगता है कि यह 'l1' का _unboxing_ है जो' हो रहा है '''''' इंटीजर' में _boxing_ नहीं है। यदि ऐसा ही था, तो एकमात्र चीज जो '==' ऑपरेटर 'सत्य' लौटने वाला ऑपरेटर समझा सकती है, वह कैशिंग होगी, जो कि 'नया इंटीजर (2)' वैसे भी एक वैध स्पष्टीकरण नहीं होगी। साथ ही, 'नया लांग (123456) == 123456'' सत्य 'लौटाता है, और ऐसा लगता है कि यह कैशिंग श्रेणी से बाहर है। –

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