2011-01-26 22 views
104

के बीच अंतर null और "" (खाली स्ट्रिंग) के बीच क्या अंतर है?शून्य और खाली ("") जावा स्ट्रिंग

String a = ""; 
String b = null; 

System.out.println(a==b); // false 
System.out.println(a.equals(b)); // false 

दोनों बयानों लौटने false:

मैं कुछ सरल कोड लिखा है। ऐसा लगता है, मैं यह नहीं ढूंढ पा रहा हूं कि उनके बीच वास्तविक अंतर क्या है।

+5

'के साथ तुलना करें b.equals (क)' - लेकिन उपयोग नहीं करते हैं '==' स्ट्रिंग के रूप में अन्य तरीकों से "यह काम नहीं करेगा" की तुलना के लिए। 'शून्य' मान (जो एक खाली स्ट्रिंग '" "', एक मान्य स्ट्रिंग इंस्टेंस से अलग है) * कभी * उस पर कोई विधि लागू नहीं हो सकती है। समानता के बाईं ओर "ज्ञात गैर-शून्य" (आमतौर पर एक स्थिर मूल्य या शाब्दिक) रखना "योड सशर्त" या कुछ ऐसा है। –

उत्तर

175

"" एक वास्तविक स्ट्रिंग है, यद्यपि एक खाली एक।

शून्य, हालांकि, इसका मतलब है कि स्ट्रिंग चर कुछ भी नहीं है।

a==b झूठा रिटर्न देता है क्योंकि "" और शून्य स्मृति में एक ही स्थान पर कब्जा नहीं करते हैं - दूसरे शब्दों में, उनके चर एक ही ऑब्जेक्ट को इंगित नहीं करते हैं।

a.equals(b) झूठा रिटर्न देता है क्योंकि "" स्पष्ट रूप से शून्य के बराबर नहीं है।

अंतर नहीं है, हालांकि यह है कि "के बाद से" एक वास्तविक स्ट्रिंग है, तो आप अभी भी तरीके या कार्यों उस पर तरह

a.length()

a.substring(0, 1)

और इतने पर आह्वान कर सकते हैं।

स्ट्रिंग शून्य के बराबर होती है, तो ख की तरह, जावा एक NullPointerException फेंक अगर आप लागू करने की कोशिश की होगी, कहते हैं:

b.length()


तो अंतर के बारे में आप है == बनाम बराबर होती है सोच रहे हैं, यह इस है:

== संदर्भ तुलना, अगर मैं

String a = new String(""); 
String b = new String(""); 
System.out.println(a==b); 
चला गया

कि उत्पादन झूठी क्योंकि मैं दो अलग-अलग वस्तुओं आवंटित है, और विभिन्न वस्तुओं के लिए ए और बी बिंदु होगा।

हालांकि, इस मामले में a.equals(b), सच वापसी होगी, क्योंकि स्ट्रिंग्स के लिए equals सच if and only if the argument String is not null and represents the same sequence of characters.

चेतावनी दी हो वापस आ जाएगी, हालांकि, जावा स्ट्रिंग्स के लिए किसी विशेष परिस्थिति में है कि।

String a = "abc"; 
String b = "abc"; 
System.out.println(a==b); 

आप सोच सकता है कि उत्पादन false होगा, क्योंकि यह दो अलग अलग स्ट्रिंग्स का आवंटन करना चाहिए। वास्तव में, जावा शाब्दिक तार (जो कि हमारे उदाहरण में ए और बी की तरह प्रारंभ कर रहे हैं) intern होगा। तो सावधान रहें, क्योंकि यह == काम करता है पर कुछ झूठी सकारात्मक दे सकता है। जो सच है -

+0

क्या यह सी # पर भी लागू होता है? जैसा कि "" सरणी में {'\ 0'} है, एक शून्य –

+3

'intern' के बारे में लिंक समाप्त हो गया है। आप इसके बारे में पढ़ने के लिए किसी अन्य साइट का संदर्भ दे सकते हैं: https://weblogs.java.net/blog/enicholas/archive/2006/06/all_about_inter.html – Stallman

+0

तो, यदि मेरे पास शून्य न स्ट्रिंग 'स्ट्रिंग ए = नल' है और तो मैं ** इसे ** ए + = "उदाहरण" जैसे एक स्ट्रिंग जोड़ता हूं, "जब मैं इसे प्रिंट करता हूं, तो नललेक्स नमूना क्यों प्रदर्शित होता है यदि नल स्ट्रिंग नहीं है? – PinaGamer

7
यहाँ

a is an Object लेकिन b(null)नहीं एक वस्तु है यह एक अशक्त संदर्भ

System.out.println(a instanceof Object); // true 

System.out.println(b instanceof Object); // false 

here is मेरी समान जवाब

+1

दोनों 'ए' और' बी 'संदर्भ हैं। 'ए 'एक तत्काल वस्तु के साथ एक संदर्भ है। 'बी' एक तत्काल वस्तु के बिना एक संदर्भ है (इसलिए शब्द" शून्य संदर्भ ")। –

+0

मैं जवाबी अभिनय -1 ;-) लेकिन यह इस जवाब को स्पष्ट और "एक वस्तु" और 'null' मूल्य और वस्तुओं और चर के बीच अंतर के बीच अंतर पर चर्चा करने में मदद मिलेगी। –

+0

@pst तो क्यों -1? :) –

13

स्ट्रिंग एक वस्तु है और अशक्त हो सकता है

अशक्त मतलब यह है कि है स्ट्रिंग ऑब्जेक्ट को तत्काल नहीं किया गया

"aaa"

यह लिंक है जिसे उस बिंदु http://download.oracle.com/javase/tutorial/java/concepts/object.html

+0

"शून्य का मतलब है कि स्ट्रिंग ऑब्जेक्ट को तत्काल नहीं किया गया था" - धन्यवाद! जो मुझे चीजों को समझने में मदद करता है। मैं एक बार एक MediaPlayer वस्तु पर एक अगर बयान उपयोग करने में सक्षम था, और यह अगर यह चल रहा था या नहीं की जाँच करने के (अगर यह था निष्पादित करने के लिए एक विधि के साथ) अशक्त उपयोग करने के लिए, काम किया, लेकिन मैं समझ गया कभी नहीं क्यों यह काम किया, लेकिन अब मैं देख रहा हूं कि यह क्या कह रहा था, मैं जांच रहा था कि मीडियाप्लेयर को तत्काल या नहीं किया गया था, नल का उपयोग करके ... उदाहरण के लिए 'अगर (एमपी == शून्य) {कुछ करें} '। – Azurespot

8

वहाँ दोनों के बीच एक बहुत महत्वपूर्ण अंतर है स्पष्ट हो सकता है कि "की तरह instantiated ऑब्जेक्ट स्ट्रिंग का एक वास्तविक मूल्य है।" खाली स्ट्रिंग "" "स्ट्रिंग है जिसमें इसमें कोई वर्ण नहीं है।" यह एक वास्तविक स्ट्रिंग है जिसमें अच्छी तरह परिभाषित लंबाई है। सभी मानक स्ट्रिंग ऑपरेशंस खाली स्ट्रिंग पर अच्छी तरह परिभाषित हैं - आप इसे कम मामले में परिवर्तित कर सकते हैं, इसमें कुछ वर्णों की अनुक्रमणिका देख सकते हैं। नल स्ट्रिंग null "बिल्कुल कोई स्ट्रिंग नहीं है।" इसकी लंबाई नहीं है क्योंकि यह बिल्कुल एक स्ट्रिंग नहीं है। नल स्ट्रिंग पर किसी मानक स्ट्रिंग ऑपरेशन को लागू करने का प्रयास करने से रनटाइम पर NullPointerException का कारण बन जाएगा।

10

क्या अपने बयान आप कह रहे हैं सिर्फ इतना है कि "" अशक्त के रूप में ही नहीं है। "" एक खाली स्ट्रिंग है; शून्य का मतलब है कि कोई मूल्य असाइन नहीं किया गया है।

इसे और अधिक प्रयास करने के लिए शिक्षाप्रद हो सकता है:

System.out.println(a.length()); // 0 
System.out.println(b.length()); // error; b is not an object 

"" अभी भी, एक स्ट्रिंग है जिसका अर्थ है आप अपने तरीकों कॉल और सार्थक जानकारी प्राप्त कर सकते हैं। शून्य एक खाली चर है - वहां सचमुच कुछ भी नहीं है।

4

जावा में एक संदर्भ प्रकार null पर कोई मान नहीं है। "" सौंपा एक स्ट्रिंग एक मूल्य है: कोई रिक्त स्ट्रिंग है, जो उस में कोई अक्षर के साथ एक स्ट्रिंग कहने के लिए। जब एक चर null असाइन किया गया है इसका मतलब है कि किसी भी तरह, स्ट्रिंग या अन्यथा कोई अंतर्निहित वस्तु नहीं है।

6

शून्य का अर्थ है कि नाम किसी भी तत्काल वस्तु का संदर्भ नहीं दे रहा है। " का अर्थ है एक खाली स्ट्रिंग।

यहां कुछ ऑब्जेक्ट का संदर्भ दे रहा है जो खाली स्ट्रिंग होता है। बी किसी वस्तु को संदर्भित नहीं कर रहा है क्योंकि यह शून्य है।

1

रिक्त स्ट्रिंग एक ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग भाषा में उस में एक अशक्त संदर्भ कोई स्ट्रिंग प्रकार करने के लिए एक अशक्त संदर्भ एक स्ट्रिंग वस्तु को इंगित नहीं करता और कारण होगा एक त्रुटि थे से अलग है पर किसी भी ऑपरेशन को करने का प्रयास करने के लिए कोई भी। खाली स्ट्रिंग अभी भी एक स्ट्रिंग है जिस पर स्ट्रिंग ऑपरेशंस का प्रयास किया जा सकता है।

empty string पर विकिपीडिया लेख से।

2

" और शून्य दोनों अलग हैं। स्ट्रिंग वैरिएबल घोषणा के हिस्से के रूप में पहला मतलब स्ट्रिंग पूल में स्ट्रिंग स्थिर बनाया गया है और इसके लिए कुछ मेमोरी असाइन की गई है।

लेकिन जब हम इसे शून्य के साथ घोषित कर रहे हैं तो यह तुरंत जेवीएम को तुरंत चालू कर दिया गया है, लेकिन इसके लिए कोई स्मृति आवंटित नहीं की गई है। इसलिए यदि आप इस ऑब्जेक्ट को " - रिक्त चर के साथ जांचकर इस ऑब्जेक्ट तक पहुंचने का प्रयास कर रहे हैं, तो यह nullpointerexception को रोक नहीं सकता है। कृपया एक उपयोग-मामले के नीचे खोजें।

public class StringCheck { 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 

    String s1 = "siddhartha"; 
    String s2 = ""; 
    String s3 = null; 

    System.out.println("length s1 ="+s1.length()); 
    System.out.println("length s2 ="+s2.length()); 

    //this piece of code will still throw nullpointerexception . 
    if(s3 != ""){ 
     System.out.println("length s3 ="+s3.length()); 
    } 
} 

}

3
String s = ""; 
s.length(); 

String s = null; 
s.length(); 

ढेर में एक वस्तु को "" अंक रिक्त स्ट्रिंग पर एक संदर्भ - तो आप उस पर तरीकों कॉल कर सकते हैं।

लेकिन null पर इंगित एक संदर्भ में ढेर में इंगित करने के लिए कोई वस्तु नहीं है और इस प्रकार आपको NullPointerException मिल जाएगा।

0

एक स्ट्रिंग खाली हो सकती है या null मान हो सकता है। यदि एक स्ट्रिंग null है, तो यह स्मृति में कुछ भी संदर्भ नहीं दे रहा है। s.length()>0 आज़माएं। ऐसा इसलिए है क्योंकि यदि कोई स्ट्रिंग खाली है, तो यह अभी भी 0 की लंबाई देता है। इसलिए यदि आप इसके लिए कुछ भी नहीं डालते हैं, तो यह अभी भी लूपिंग जारी रहेगा क्योंकि यह स्ट्रिंग को null के रूप में पंजीकृत नहीं करता है। जबकि यदि आप लंबाई की जांच करते हैं, तो यह इसके लूप से बाहर निकल जाएगा।

66

तुम भी बातिल और रिक्त स्ट्रिंग के बीच का अंतर इस तरह से समझ सकते हैं:

Difference between null and 0/empty string

0

इस अवधारणा को बेहतर गणित से समझा जा सकता है। क्या आपने कभी कैलकुलेटर उदाहरण 7/0 का उपयोग करके 0 से संख्या (शून्य नहीं) को विभाजित करने का प्रयास किया है? आपको ऐसा परिणाम मिलेगा जो इस तरह दिखता है: undefined, not a number, null इत्यादि। इसका मतलब है कि ऑपरेशन असंभव है, कुछ कारणों से (चलो उन कारणों को किसी अन्य दिन चर्चा करने के लिए छोड़ दें)।

अब, इसे करें: 0/7। आपको आउटपुट मिलेगा, 0. इसका मतलब है कि ऑपरेशन संभव है और इसे निष्पादित किया जा सकता है, लेकिन आप जवाब सिर्फ 0 है क्योंकि विभाजन के बाद कुछ भी नहीं बचा है। एक वैध आउटपुट है और आउटपुट शून्य है।

पहले उदाहरण में, न केवल आउटपुट अमान्य था, ऑपरेशन निष्पादित करना संभव नहीं था। यह जावा में null स्ट्रिंग जैसा है। दूसरा उदाहरण स्ट्रिंग जैसा है।

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