2012-06-17 15 views
20

इसलिए मैंने सुना है कि यदि मैं = स्ट्रिंग के साथ 2 स्ट्रिंग की तुलना करता हूं तो मैं केवल वही ऑब्जेक्ट/इंस्टेंस का संदर्भ दूंगा यदि मैं दोनों एक ही ऑब्जेक्ट/इंस्टेंस का संदर्भ लेता हूं। वह तार है। बूलियन के बारे में क्या?क्या == बूलियन में पूर्ण समानता की जांच करता है? - जावा

+4

कैसे तार एक ही उदाहरण का उल्लेख कर सकते हैं और समान नहीं हो? – Pablo

+0

नहीं, मेरा मतलब यह है कि यदि वे समान हैं लेकिन * एक ही उदाहरण को संदर्भित नहीं करते हैं, == झूठी वापसी करता है। – Bluefire

+0

कृपया पोस्ट करने से पहले कुछ भी पढ़ें, और शुरूआत न करें मैंने कहीं कुछ सुना है। – stanwise

उत्तर

36

क्या == बूलियन में पूर्ण समानता की जांच करता है? - जावा

यह आप Boolean के बारे में बात कर रहे हैं पर निर्भर करता (वस्तु आवरण, ध्यान दें राजधानी B) या boolean रों (आदिम, लोअर केस b ध्यान दें)। यदि आप Boolean एस (ऑब्जेक्ट रैपर) के बारे में बात कर रहे हैं, जैसा कि सभी ऑब्जेक्ट्स के साथ ==पहचान के लिए चेक करता है, समतुल्य नहीं। यदि आप boolean एस (प्राइमेटिव्स) के बारे में बात कर रहे हैं, तो यह समकक्षता की जांच करता है।

तो:

Boolean a, b; 
a = new Boolean(false); 
b = new Boolean(false); 
System.out.println("a == b? " + (a == b)); // "a == b? false", because they're not the same instance 

लेकिन

boolean c, d; 
c = false; 
d = false; 
System.out.println("c == d? " + (c == d)); // "c == d? true", because they're primitives with the same value 

के बारे में तार:

मैंने सुना है कि अगर मैं == साथ 2 तार की तुलना तो मैं सिर्फ होगा स्ट्रिंग्स समान हैं यदि स्ट्रिंग समान हैं और वे दोनों एक ही ऑब्जेक्ट/इंस्टेंस को संदर्भित करते हैं ...

यह वास्तव में नहीं है एक "और": == होगा केवल जाँच है कि क्या दो String चर एक ही String उदाहरण को देखें। बेशक, एक String उदाहरण में केवल एक ही सामग्री हो सकती है, इसलिए यदि दोनों चर एक ही उदाहरण को इंगित करते हैं, तो स्वाभाविक रूप से सामग्री समान होती है ... :-) मुख्य बिंदु यह है कि ==के लिएString के लिए रिपोर्ट करेगा उदाहरण भी अगर उनके पास एक ही क्रम में एक ही अक्षर हैं। यही कारण है कि हम उन पर equals का उपयोग करते हैं, == नहीं। interning की वजह से स्ट्रिंग्स थोड़ा उलझन में आ सकती हैं, जो तारों के लिए विशिष्ट है (Boolean के लिए कोई समतुल्य नहीं है, हालांकि जब आप Boolean.valueOf(boolean) का उपयोग करते हैं, तो आपको एक कैश ऑब्जेक्ट मिल जाएगा)। यह भी ध्यान रखें कि जावा है जैसे कि यह आदिम boolean, int करता आदिम तार नहीं है, आदि

+0

तो यदि मैं 'नया बूलियन' के विपरीत, मेरा चर बनाने के लिए 'नया बूलियन' का उपयोग करता हूं, तो '==' 'बराबर()' के समान होगा? – Bluefire

+1

@ ब्लूफायर: आप 'नया बूलियन' (निचला मामला) का उपयोग नहीं करते हैं। आप 'सत्य' या 'झूठी' या तुलना ऑपरेशन के परिणाम का उपयोग करते हैं। मुझे लगता है कि आधुनिक जावा में 'बूलेन' के लिए बहुत कम उपयोग मामले हैं। –

+0

तो एक आदिम बुलियन घोषित करने के लिए, क्या मैं कुछ 'बूलियन myBoolean = true'' डालता हूं? – Bluefire

1

यह निर्भर करता है अगर आप की तरह मूल्य प्रकार के बारे में बात कर रहे हैं: int, boolean, long या संदर्भ प्रकार के बारे में: Integer, Boolean, Long । मूल्य प्रकारों की तुलना == से की जा सकती है, संदर्भ प्रकारों की तुलना equals से की जानी चाहिए।

1

यदि आपके पास ऑब्जेक्ट का उपयोग बराबर है, जब आप इस तरह की चीजों में नहीं चल सकते हैं। (autoboxing पुरातन के लिए वी एम कैश)

public static void main(String[] args){ 
     Boolean a = true; 
     Boolean b = true; 
     System.out.println(a == b); 
     a = new Boolean(true); 
     b = new Boolean(true); 
     System.out.println(a == b); 
    } 

उत्पादन सही और गलत है

+0

यह उत्तर में सुधार नहीं कर रहा है, कृपया केवल एक उत्तर जोड़ें यदि यह पहले से सबमिट किए गए उत्तरों में सुधार करता है –

+0

असल में मूल उत्तर में ऑटोबॉक्सिंग उदाहरण की कमी है। मैं निम्नलिखित कोड में आया: वैकल्पिक ए = एफ(); वैकल्पिक बी = जी(); अगर (a.isPresent() && b.isPresent() && aget()! = b.get()) {...} जो एक बग की तरह दिखता है। कारण यह एक बग नहीं है कि f() और g() वैकल्पिक विकल्प (सत्य) इत्यादि जैसी चीजें लौट रहे थे और ऑटो-मुक्केबाजी सुविधा ने इसे सही बना दिया। नोट, हालांकि, इंट्स ऑटो-मुक्केबाजी के लिए "कैश" केवल 127 तक या कुछ ऐसा मानता है, इसलिए "कैशिंग" पर भरोसा करना बेहतर है। –

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