2012-10-13 20 views
9

क्या कोई भी शरीर मुझे समझा सकता है कि आउटपुट में क्या हो रहा है। यदि == दो रेफरी की तुलना करने के लिए उपयोग किया जाता है। परिवर्तनीय यह बस इसके संदर्भ की जांच करता है यदि वे समान हैं तो यह शरीर में प्रवेश करता है, तो क्यों aa == बीबी बराबर है यदि स्थैतिक विधि मूल्य बनाना() और ee == ff बराबर नहीं है (जो ठीक है) नई वस्तु का उपयोग कर इसकी वस्तु?ऑपरेटर == रैपर क्लास ऑब्जेक्ट पर भिन्न व्यवहार

static void main(String args[]) 
{ 
    Integer aa = Integer.valueOf("12"); 
    Integer bb = Integer.valueOf("12"); 
    if(aa==bb)System.out.println("aa==bb"); 
    if(aa!=bb)System.out.println("aa!=bb"); 
    Integer ee = new Integer("12"); 
    Integer ff = new Integer("12"); 


    if(ee==ff)System.out.println("ee==ff"); 
    if(ee!=ff)System.out.println("ee!=ff"); 
} 

आउटपुट:

आ == bb

ee = एफएफ

+0

आपकी समस्या का वर्णन करने वाला एक दिलचस्प लेख: http://tech.puredanger.com/2007/02/01/valueof/ –

उत्तर

11

वस्तु समानता के लिए == तुलनित्र चेकों!

चूंकिमूल्य के साथ इंटीजर ऑब्जेक्ट्स का कैश बनाए रखता है -128 से 127 valueOf(String) कैश्ड ऑब्जेक्ट देता है, इस प्रकार == तुलना परिणाम सही होता है।

Integer a1 = new Integer("12"); 
Integer b1 = new Integer("12"); 
//a1 == b1 returns false because they point to two different Integer objects 

Integer aa = Integer.valueOf("12"); 
Integer bb = Integer.valueOf("12"); 
//aa == bb returns true because they point to same cached object 

वस्तु मूल्यों की comparance के लिए हमेशा .equals विधि का उपयोग करें, पूर्णांक की तरह पुरातन के लिए, लंबे आदि आप == तुलनित्र उपयोग कर सकते हैं।

+0

सही उत्तर। कैश चीज के बारे में नहीं पता था। अलग-अलग परिणाम प्राप्त करने के लिए 127 और 128 के साथ चेक किया गया। –

+2

आपके उत्तर में "// a == b सत्य है" झूठी नहीं है क्योंकि जब तक हम नई स्ट्रिंग() विधि का उपयोग करके स्ट्रिंग नहीं बनाते हैं, उसी स्ट्रिंग ऑब्जेक्ट के समान स्ट्रिंग ऑब्जेक्ट के साथ स्ट्रिंग्स। आप कृपया एक बार दौड़ सकते हैं और जांच सकते हैं। –

+0

@Ivar, तो बेहतर इंटीजर के लिए उदाहरण दें, आप लोगों को गलत जवाब क्यों दे रहे हैं? चूंकि इस उत्तर में उच्चतम वृद्धि हुई है, लोगों को लगता है कि यह सही है, लेकिन हकीकत में बयान (// a == b गलत है) गलत है। क्या आप चाहते हैं कि मैं एक स्क्रीनशॉट पेस्ट करें? देखें कि मैं संपादन का सुझाव नहीं दूंगा लेकिन उत्तर को बेहतर तरीके से बदल दूंगा। और मैं नहीं जानता कि कैसे लोग पूरी तरह से जवाब पढ़ने के बिना जवाब देते हैं और यह जांच किए बिना कि यह सही है या नहीं। और अगर मैं कोड बदलता हूं तो मुझे पूरा जवाब बदलना होगा। यह पूरा कोड हटाने की तरह है। –

3

क्योंकि Integer.valueOf-128 से 127

को पूर्णांकों का कैश रखता है यहाँ valueOf के स्रोत कोड आप स्पष्ट रूप से देख सकते हैं कि यह एक ही वस्तु लौटाता है यदि पूर्णांक मान को -128 के बीच 127

public static Integer valueOf(int i) { 
    if(i >= -128 && i <= IntegerCache.high) 
     return IntegerCache.cache[i + 128]; 
    else 
     return new Integer(i); 
} 
तो

है आपका == सत्य देता है। यदि मूल्य उससे अधिक है तो यह हमेशा आपको झूठा कर देगा।

Integer aa = Integer.valueOf("1200"); 
    Integer bb = Integer.valueOf("1200"); 
    aa == bb --> false 

तुम हमेशा equals विधि

ee.equals(ff); 

का उपयोग कर समानता की जाँच करनी चाहिए के साथ नीचे

if (ee.equals(ff)) 
     System.out.println("ee equals ff"); 

आउटपुट

ee equals ff 
1

ee और एफएफ के लिए किया जाएगा आप अगर एक और जोड़ देते हैं तो दो वस्तुओं Integer का ढेर पर बनाया गया है इसलिए उनमें से दोनों अलग-अलग ऑब्जेक्ट्स का संदर्भ दे रहे हैं ताकि वे == ऑपरेटर का उपयोग करते समय बराबर न हों।

1

new Integer("12") मूल्य 12 के साथ एक नई इंटीजर ऑब्जेक्ट बनाता है। इससे कोई फर्क नहीं पड़ता कि आप कितनी बार ऐसा करते हैं कि आप हर बार एक नया ऑब्जेक्ट बना रहे हैं। यही कारण है कि == दूसरे मामले में काम नहीं करता है।

जेवीएम उन मानों के लिए इंटेगर ऑब्जेक्ट्स का कैश रखता है जिन्हें अधिक बार उपयोग किया जाता है (-128 - 127)। दृश्य के पीछे Integer.valueOf("12") वही बात करता है (new Integer("12")), लेकिन ऐसा करने से पहले यह उस कैश में जांचता है यदि उस मान के लिए ऑब्जेक्ट पहले से ही कैश में मौजूद है, तो अगर ऐसा होता है तो यह वही होता है, अन्यथा यह एक नया बनाता है, जोड़ता है यह कैश के लिए और इसे वापस आती है। यही कारण है कि == पहले मामले में काम करता है।

इसके अलावा, वस्तुओं के लिए, == को समानता जांच के लिए कभी भी उपयोग नहीं किया जाना चाहिए, इसके बजाय उन्हें केवल पहचान जांच के लिए उपयोग किया जाना चाहिए (उदाहरण के लिए कि दो अलग-अलग चर एक ही वस्तु का जिक्र कर रहे हैं)। समानता जांच के लिए हमेशा equals विधि का उपयोग करें।

+0

दिलचस्प। मुझे कैशिंग चीज नहीं पता था ... धन्यवाद :) –

+0

आपका स्वागत है। :) –