जावा में बूलियन बनाम बूलियन


195

वहाँ के आसपास विचार विमर्श कर रहे हैं Integerबनाम intजावा में। पूर्व का डिफ़ॉल्ट मान nullबाद में है, जबकि यह है 0। कैसे Booleanबनाम boolean?

मेरे आवेदन में एक चर 0/ 1मान हो सकता है । मैं उपयोग करना पसंद करूंगा boolean/ उपयोग Booleanनहीं करना पसंद करूंगा int। क्या मैं इसके बजाय Boolean/ का उपयोग कर सकता हूं boolean?


2
सिस्टम डिज़ाइन कारणों से मैं बूलियन चुनूंगा क्योंकि इसमें विकल्प "उपयोगकर्ता ने अभी तक तय नहीं किया है" जो न तो "सच", और न ही "गलत" के बराबर है। मैं बूलियन आदिम का उपयोग केवल उन मामलों में करूंगा जब मैं 100% सुनिश्चित करूंगा कि सही / गलत विकल्प पर्याप्त हैं। डेटाबेस में NULL विकल्प आम तौर पर समस्या के बिना उपलब्ध होता है (या बाद में मांग पर पूर्ण प्रतिबंध नहीं हटाकर)
CsBalazsHungary

2
सटीक की नकल क्या जावा में बूलियन और बूलियन के बीच का अंतर है? (क्योंकि GWT से कोई फर्क नहीं पड़ता)।
डैन डस्केल्सस्कु

जवाबों:


270

हाँ आप उपयोग कर सकते हैं Boolean/ booleanइसके बजाय।

पहला एक वस्तु है और दूसरा एक आदिम प्रकार है।

  • पहले एक पर, आपको अधिक तरीके मिलेंगे जो उपयोगी होंगे।

  • दूसरा एक मेमोरी खर्च पर विचार करना सस्ता है दूसरा आपको बहुत अधिक मेमोरी बचाएगा, इसलिए इसके लिए जाएं

अब अपना रास्ता चुनें।


70
आप इसे "जैसे कि दूसरा आपको बहुत अधिक मेमोरी बचाएगा, इसलिए इसके लिए जाएं" के रूप में वर्णित किया जा सकता है। बूलियन पर उपयोगी तरीकों को ज्यादातर इसका उदाहरण दिए बिना ही लागू किया जा सकता है।
डीजेकवरवर्थ

3
जब तक आप नए बूलियन (मूल्य) के बूलियन.वेल्यूऑफ (मूल्य) के बजाय उपयोग करते हैं, तब तक स्मृति को चिंता का विषय नहीं होना चाहिए।
ग्रेग केस

2
के लिए AsyncTask, आप Booleanइसके बजाय केवल उपयोग कर सकते हैं boolean
राप्टोर

98
यह ध्यान दिया जाना चाहिए कि एक बूलियन वास्तव में 3 राज्य है ... true, falseऔर nullजहां एक बूलियन तार्किक 2 राज्यों ( trueऔर false) है
सम्मान

14
बुलियन ट्रिलियन है :)
टोपेरा

50

Boolean बूलियन आदिम प्रकार लपेटता है। JDK 5 और ऊपर की ओर, Oracle (या Oracle से पहले Sun ने उन्हें खरीदा) ने ऑटोबॉक्सिंग / अनबॉक्सिंग की शुरुआत की , जो अनिवार्य रूप से आपको ऐसा करने की अनुमति देता है

boolean result = Boolean.TRUE;

या

Boolean result = true; 

जो अनिवार्य रूप से संकलक करता है,

Boolean result = Boolean.valueOf(true);

तो, आपके उत्तर के लिए, यह हाँ है।


4
नोट: आप हमेशा सुरक्षित रूप से a Booleanको असाइन नहीं कर सकते boolean। यदि आपका Booleanहै nullऔर आप इसे असाइन करने का प्रयास करते हैं boolean, तो यह NullPointerExceptionरनटाइम पर फेंक देगा ।
डंकन लुक

यदि Booleanएक वर्ग तो क्यों मूल्य हमेशा गलत होता है, भले ही मैंने दूसरे वर्ग से उसी बुलियन चर के मान को बदल दिया हो? इसके बाद क्या होगा Booleanअगर हम विभिन्न उदाहरण वर्गों से संदर्भ / तर्क के रूप में पारित नहीं कर सकते हैं?
user924

एक उत्तर मिला, हम इसका उपयोग AtomicBooleanऔर अंतर कक्षाओं से संदर्भ ले सकते हैं
user924

35

मैं प्रदान किए गए उत्तरों को थोड़ा विस्तार दे रहा हूं (क्योंकि अब तक वे अपने "अपने" / कृत्रिम शब्दावली पर ध्यान केंद्रित करते हैं, विशेष रूप से प्रोग्रामिंग भाषाओं को बनाने के दृश्य के पीछे की बड़ी तस्वीर का ध्यान रखने के बजाय किसी विशेष भाषा की प्रोग्रामिंग पर ध्यान केंद्रित करते हैं, अर्थात जब चीजें होती हैं टाइप-सेफ्टी बनाम मेमोरी लिस्ट में फर्क पड़ता है):

int बूलियन नहीं है

विचार करें

    boolean bar = true;      
    System.out.printf("Bar is %b\n", bar);
    System.out.printf("Bar is %d\n", (bar)?1:0);
    int baz = 1;       
    System.out.printf("Baz is %d\n", baz);
    System.out.printf("Baz is %b\n", baz);

आउटपुट के साथ

    Bar is true
    Bar is 1
    Baz is 1
    Baz is true

तीसरी पंक्ति में जावा कोड (bar)?1:0यह दर्शाता है कि बार ( बूलियन ) को कथित तौर पर एक इंट में नहीं बदला जा सकता है । मैं इसे जेवीएम के पीछे कार्यान्वयन के विवरणों को स्पष्ट नहीं करने के लिए ला रहा हूं, लेकिन यह इंगित करने के लिए कि निम्न स्तर के विचारों (स्मृति आकार के रूप में) के लिए किसी को प्रकार की सुरक्षा से अधिक मूल्यों को पसंद करना होगा। खासकर अगर उस प्रकार की सुरक्षा वास्तव में / पूरी तरह से बूलियन प्रकारों के रूप में उपयोग नहीं की जाती है, जहां चेक के रूप में किया जाता है

यदि मान {{0,1} में है, तो बुलियन प्रकार के लिए डाले, अन्यथा एक अपवाद फेंक दें।

सभी को केवल यह बताने के लिए कि {0,1} <{-2 ^ 31, .., 2 ^ 31 -1}। एक overkill की तरह लगता है, है ना? टाइप सुरक्षा वास्तव में उपयोगकर्ता परिभाषित प्रकारों में महत्वपूर्ण है, आदिमों की अंतर्निहित कास्टिंग में नहीं (हालांकि अंतिम पहले में शामिल हैं)।

बाइट प्रकार या बिट्स नहीं हैं

ध्यान दें कि {0,1} की सीमा से आपका चर अभी भी कम से कम एक बाइट या शब्द (रजिस्टर के आकार पर निर्भर करता है) पर कब्जा कर लेगा, जब तक कि विशेष रूप से ध्यान नहीं दिया जाता (उदाहरण के लिए स्मृति में अच्छी तरह से पैक - 8 "बूलियन" 1 बाइट में बिट्स - आगे और पीछे)।

अतिरिक्त मूल्य पैकिंग (जैसे बिट शिफ्ट या अंकगणित का उपयोग करके) पर टाइप सेफ्टी (जैसे किसी विशेष प्रकार के बॉक्स में वैल्यू लगाना / लपेटना) को प्राथमिकता देकर, कोई भी अधिक मेमोरी हासिल करने के लिए प्रभावी रूप से कम कोड लिखना चुनता है। (दूसरी ओर कोई हमेशा एक कस्टम उपयोगकर्ता प्रकार को परिभाषित कर सकता है जो बूलियन की तुलना में सभी रूपांतरण की सुविधा देगा)।

कीवर्ड बनाम प्रकार

अंत में, आपका प्रश्न कीवर्ड बनाम प्रकार की तुलना करने के बारे में है । मेरा मानना है कि यह महत्वपूर्ण है समझाने के लिए क्यों या कैसे वास्तव में आप का उपयोग / पसंद करते हैं कीवर्ड जोड़ें ( "चिह्नित" के रूप में द्वारा प्रदर्शन मिल जाएगा आदिम प्रकार से अधिक) (सामान्य समग्र उपयोगकर्ता के definable एक और खोजशब्द का उपयोग कर वर्गों वर्ग दूसरे शब्दों में) या

boolean foo = true;

बनाम

Boolean foo = true;

पहला "चीज़" (प्रकार) बढ़ाया नहीं जा सकता है (उपवर्ग) और बिना कारण के नहीं। आदिम और रैपिंग कक्षाओं के प्रभावी रूप से जावा शब्दावली को केवल इनलाइन मान में अनुवाद किया जा सकता है (एक LITERAL या एक स्थिरांक जो संकलक से सीधे जुड़ जाता है, जब भी प्रतिस्थापन का अनुमान लगाना संभव हो या नहीं - फिर भी मूल्य को लपेटने में कमबैक)।

अनुकूलन तुच्छता के कारण प्राप्त होता है:

"कम रनिंग कास्टिंग ऑपरेशन => अधिक गति।"

इसीलिए जब वास्तविक प्रकार का निष्कर्ष निकाला जाता है, तो यह (अभी भी) सभी प्रकार की सूचनाओं के साथ रैपिंग क्लास के तत्कालकरण में समाप्त हो सकता है यदि आवश्यक हो (या ऐसे में परिवर्तित / कास्टिंग)।

तो, के बीच का अंतर बूलियन और बूलियन में वास्तव में संकलन और रनटाइम (थोड़ा दूर जा रहा है, लेकिन लगभग रूप में instanceof बनाम getClass () )।

अंत में, ऑटोबॉक्सिंग आदिमों की तुलना में धीमा है

इस तथ्य पर ध्यान दें कि जावा ऑटोबॉक्सिंग कर सकता है बस एक "सिंटैक्टिक शुगर" है। यह कुछ भी गति नहीं देता है, बस आपको कम कोड लिखने की अनुमति देता है। बस। टाइप सूचना कंटेनर में कास्टिंग और रैपिंग अभी भी किया जाता है। प्रदर्शन कारणों से अंकगणित का चयन करें जो हमेशा प्रकार की सुरक्षा को लागू करने के लिए प्रकार की जानकारी के साथ वर्ग उदाहरण बनाने के अतिरिक्त हाउसकीपिंग को छोड़ देगा। प्रकार की सुरक्षा का अभाव वह मूल्य है जो आप प्रदर्शन हासिल करने के लिए अदा करते हैं। बूलियन-मूल्यवान अभिव्यक्तियों के साथ कोड के लिए सुरक्षा (जब आप कम लिखते हैं और इसलिए अंतर्निहित कोड) महत्वपूर्ण होते हैं, उदाहरण के लिए if-if-अन्यथा प्रवाह नियंत्रण।


16

आप बूलियन स्थिरांक का उपयोग कर सकते हैं - Boolean.TRUEऔर Boolean.FALSEइसके बजाय 0और 1। आप अपने वेरिएबल को टाइप कर सकते हैं booleanयदि आदिम वह है जो आप बाद में हैं। इस तरह आपको नई Booleanवस्तुएँ नहीं बनानी होंगी ।


3

मूल रूप से बूलियन एक आदिम डेटा प्रकार का प्रतिनिधित्व करते हैं जहां बुलियन एक संदर्भ डेटा प्रकार का प्रतिनिधित्व करते हैं। यह कहानी तब शुरू होती है जब जावा विशुद्ध रूप से ऑब्जेक्ट ओरिएंटेड बनना चाहता है, इसने रैपर क्लास कॉन्सेप्ट प्रदान किया है जो कि आदिम डेटा प्रकार के उपयोग के लिए आता है।

boolean b1;
Boolean b2;

b1और b2समान नहीं हैं।


3

एक अवलोकन: (हालांकि यह दुष्प्रभाव के बारे में सोचा जा सकता है)

बूलियन एक आदिम जा रहा है या तो हाँ या नहीं कह सकते हैं।

बूलियन एक वस्तु है (यह या तो हां या नहीं या 'पता नहीं' अर्थात शून्य का उल्लेख कर सकती है)


1

आप बुलियन / बुलियन का उपयोग कर सकते हैं। सरलता ही रास्ता है। यदि आपको विशिष्ट एपीआई (कलेक्शन, स्ट्रीम, इत्यादि) की आवश्यकता नहीं है और आप इस बात का पूर्वाभास नहीं कर रहे हैं कि आपको उनकी आवश्यकता होगी - इसका (बूलियन) आदिम संस्करण का उपयोग करें।

  1. प्राथमिकताओं के साथ आप गारंटी देते हैं कि आप अशक्त मूल्यों को पारित नहीं करेंगे।
    तुम इस तरह जाल में नहीं पड़ोगे। नीचे दिया गया कोड NullPointerException ( Booleans, सशर्त ऑपरेटर और ऑटोबॉक्सिंग ) से फेंकता है :

    public static void main(String[] args) throws Exception { Boolean b = true ? returnsNull() : false; // NPE on this line. System.out.println(b); } public static Boolean returnsNull() { return null; }

  2. जब आपको किसी वस्तु की आवश्यकता हो तो बूलियन का उपयोग करें, जैसे:

    • मल की धारा,
    • ऐच्छिक
    • बुलियन का संग्रह
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.