2010-06-27 15 views
10

जावा में ये 2 कथन समान हैं?null = "" एक स्ट्रिंग के लिए

String a = null; 
String b = ""; 

यह एक बेवकूफ सवाल का थोड़ा सा लगता है लेकिन वर्तमान में एक पूर्ण मानसिक ब्लॉक है।

+5

यह एक अच्छा सवाल है क्योंकि उत्तर भाषा से भाषा में भिन्न होता है। – Dolph

+3

आप आसानी से जांच सकते हैं: 'अगर (ए == बी) System.out.println ("वही"); अन्यथा System.out.println ("समान नहीं"); ' – MAK

+1

डॉल्फ: ओरेकल के अलावा, कौन सी भाषाएं शून्य हैं और खाली स्ट्रिंग समान है? – Gabe

उत्तर

29

खाली स्ट्रिंग और null अलग हैं। खाली स्ट्रिंग एक स्ट्रिंग है जिसमें कोई वर्ण नहीं है, null में स्ट्रिंग नहीं है।

आप खाली स्ट्रिंग पर विधियों को कॉल कर सकते हैं लेकिन यदि आप शून्य पर कोई विधि कॉल करने का प्रयास करते हैं तो आपको अपवाद मिलेगा।

public static void main(String[] args) 
{ 
    String a = null; 
    String b = ""; 
    System.out.println(b.length()); 
    System.out.println(a.length()); 
} 

आउटपुट:

 
0 
Exception in thread "main" java.lang.NullPointerException 
     at Program.main(Program.java:12) 
2

नहीं है, कोई रिक्त स्ट्रिंग रिक्त नहीं है।

2

वे निश्चित रूप से वही नहीं हैं। आपका स्ट्रिंग वैरिएबल स्मृति में किसी ऑब्जेक्ट के संदर्भ के रूप में कार्य करता है, और यदि यह शून्य पर सेट है, तो यह किसी भी चीज़ को इंगित नहीं कर रहा है। यदि यह खाली-स्ट्रिंग मान पर सेट है, तो यह उस पर इशारा कर रहा है।

अपने कोडिंग में, मैं आम तौर पर शून्य के बजाय स्ट्रिंग को "" सेट करता हूं जब तक कि मुझे शून्य की विशेष आवश्यकता न हो। अपाचे कॉमन्स जैसे कुछ पुस्तकालय हैं जिनमें स्ट्रिंगयूटिल जैसे सहायक वर्ग शामिल हैं जो शून्य, खाली स्ट्रिंग के लिए एक चेक को ध्वस्त कर देंगे, और यहां तक ​​कि केवल एक कॉल में व्हाइटस्पेस: StringUtils.isBlank(), StringUtils.isNotBlank(), आदि बहुत आसान है। या आप आसानी से ऐसा करने के लिए अपने स्वयं के सहायक तरीके लिख सकते हैं।

जब आप जावा में प्रगति करते हैं तो शुभकामनाएं!

+0

या बस स्ट्रिंग के स्वयं के लक्षण को कॉल करें(), स्ट्रिंगयूट्स के साथ गड़बड़ करने की कोई आवश्यकता नहीं हैब्लैंक()। –

+0

यह विधि केवल जावा 6 के बाद उपलब्ध है और स्ट्रिंगयूटिल विधियों के विपरीत, शून्य सुरक्षित नहीं है। – NeantHumain

0

यह उतना ही गूंगा नहीं है जितना लगता है। यह अनुभवी प्रोग्रामर भी परेशान करता है। कई वास्तविक दुनिया परियोजनाओं में लोग अक्सर if(s==null || s.isEmpty()) जैसे कुछ लिखते हैं, यानी null और ""अर्थात् के रूप में लोगों का इलाज करते हैं।

+0

jdk और C# में कई स्ट्रिंग जैसे हैं (str! = Null && "" .equals (str.trim())) यहां तक ​​कि एक स्ट्रिंग भी है ISNullOrEmpty() विधि। अभी भी गलत लगता है। – atamanroman

+0

तारों में स्ट्रिंग्स अपरिवर्तनीय हैं क्योंकि यह मेरे लिए अजीब लगता है कि एक ही मान के सभी स्ट्रिंग एक ही स्ट्रिंग नहीं हैं (इस प्रकार स्ट्रिंग के लिए == ठीक है)। हालांकि, यह महत्वपूर्ण है कि == शून्य * सत्य नहीं है क्योंकि अन्यथा हम गैर-प्रदत्त मानों और प्रदान किए गए-खाली मूल्यों के बीच अंतर कैसे करते हैं। –

0

null का अर्थ है कि यह कुछ भी नहीं है, जबकि खाली स्ट्रिंग शून्य लंबाई के साथ एक विशेष स्ट्रिंग है।

1

तीसरी संभावना है:

String c; 

सभी तीन, अलग हैं निश्चित रूप से।

+1

ए और सी वे नहीं हैं? –

+1

@Graphain: यदि वे उदाहरण के सदस्य हैं तो वे समान हैं, लेकिन यदि वे एक विधि निकाय में बयान हैं तो वे समान नहीं हैं। बाद के मामले में वैरिएबल सी को प्रारंभ करने से पहले इसे पढ़ने का प्रयास करने से संकलन त्रुटि मिल जाएगी। –

+0

मेरी टिप्पणी किसी भी तरह गायब हो गई। वे वही हैं, यह सिर्फ एक त्रुटि देगा (आपकी संकलन सेटिंग्स के आधार पर मुझे विश्वास है) क्योंकि आपने स्पष्ट रूप से संकलक को "मुझे यहां शून्य नहीं करना" बताया है, इसलिए ऐसा लगता है कि आप भूल गए हैं। हालांकि, वे बिल्कुल बराबर हैं, यानी सी == ए। –

0

स्ट्रिंग ए = शून्य;
स्ट्रिंग बी = "";

जावा में पहला कथन एक परिवर्तनीय हैंडल शुरू करता है। डेटा सहेजे जाने के लिए आवंटित कोई स्मृति नहीं है।

दूसरा कथन दो ऑब्जेक्ट्स को पहला ऑब्जेक्ट हैडल (बी) और दूसरी ऑब्जेक्ट "" दिखाता है (यदि हम जावा में स्ट्रिंग पूलिंग की उच्च अवधारणाओं को अनदेखा करते हैं जहां स्ट्रिंग म्यूटेबल है और जेवीएम स्ट्रिंग के पूल किए गए उदाहरण देता है)

इस प्रकार दो पंक्तियां समान नहीं हैं।

0

नहीं, वे अलग हैं। यदि आप किसी विधि में एक नल स्ट्रिंग का उपयोग करते हैं, तो अपवाद होता है लेकिन खाली स्ट्रिंग में नहीं होता है!

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