रिक्त और रिक्त ("") जावा स्ट्रिंग के बीच अंतर


151

(खाली स्ट्रिंग) nullऔर क्या अंतर है ""?

मैंने कुछ सरल कोड लिखे हैं:

String a = "";
String b = null;

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

दोनों कथन लौटते हैं false। ऐसा लगता है, मैं नहीं पा रहा हूं कि उनके बीच वास्तविक अंतर क्या है।


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

जवाबों:


220

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

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

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

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

हालांकि यह अंतर यह है कि चूंकि "" एक वास्तविक स्ट्रिंग है, आप अभी भी इस तरह के तरीकों या कार्यों को लागू कर सकते हैं

a.length()

a.substring(0, 1)

और इसी तरह।

यदि स्ट्रिंग n के बराबर है, तो b, Java NullPointerExceptionयदि आप किसी को आमंत्रित करने की कोशिश करते हैं, तो कहेंगे:

b.length()


यदि आप जिस अंतर के बारे में सोच रहे हैं वह == बनाम बराबर है, तो यह है:

== संदर्भों की तुलना करता है, जैसे कि मैं गया था

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

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

हालांकि, a.equals(b)इस मामले में सच लौटेगा, क्योंकि equalsस्ट्रिंग्स के लिए सच वापस आ जाएगा अगर और केवल अगर तर्क स्ट्रिंग शून्य नहीं है और वर्णों के समान अनुक्रम का प्रतिनिधित्व करता है।

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

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

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


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

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

तो, अगर मैं एक अशक्त स्ट्रिंग है String a = nullऔर उसके बाद मैं संलग्न यह की तरह एक स्ट्रिंग a+= "example", जब मैं इसे प्रिंट, क्यों करता है प्रदर्शन nullexampleकरता है, तो रिक्त नहीं एक स्ट्रिंग है?
cpinamtz

@PinaGamer जावास्क्रिप्ट स्ट्रिंग में नॉन-स्ट्रिंग्स को जोड़ने की अनुमति देता है। "num: " + 20आपको तार देता है "num: 20"। क्या इसका मतलब यह है कि 20एक स्ट्रिंग है? (यह नहीं है, 20एक संख्या है)। के लिए एक ही मामला null: यह एक स्ट्रिंग नहीं है, लेकिन यदि आप इसे जोड़ने की कोशिश करते हैं तो इसे एक में परिवर्तित किया जा सकता है।
9

@Z L: जब स्ट्रिंग s = null + "a"; यह आउटपुट nulla देता है, लेकिन null.concat ("a") यह null पॉइंटर अपवाद देता है। मेरे पहले मामले में क्या कारण है null + "a"; काम कर रहा है।
वेद प्रकाश

249

आप इस तरह रिक्त और रिक्त स्ट्रिंग के बीच अंतर को भी समझ सकते हैं:

अशक्त और 0 / खाली स्ट्रिंग के बीच अंतर

आर। सातो द्वारा मूल छवि ( @raysato )


7
यह भी खूब रही! मैं किसी को शून्य बनाम रिक्त समझा रहा था और आपके उत्तर पर हुआ। अवधारणा ने तुरंत उनके लिए क्लिक किया।
मैट। एफसी

14

स्ट्रिंग एक ऑब्जेक्ट है और अशक्त हो सकता है

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

"" आ "की तरह तात्कालिक वस्तु स्ट्रिंग का एक वास्तविक मूल्य है"

यहाँ एक लिंक है जो उस बिंदु को स्पष्ट कर सकता है http://download.oracle.com/javase/tutorial/java/congets/obl.html


"अशक्त का मतलब है कि स्ट्रिंग ऑब्जेक्ट को त्वरित नहीं किया गया था" - धन्यवाद! इससे मुझे चीजों को समझने में बहुत मदद मिलती है। मैं एक बार MediaPlayer ऑब्जेक्ट पर एक स्टेटमेंट का उपयोग करने में सक्षम था, और यह नल का उपयोग करने के लिए काम करता था, यह जांचने के लिए कि यह चल रहा था या नहीं (यदि इसे निष्पादित करने के लिए एक विधि के साथ), लेकिन मुझे समझ नहीं आया कि यह क्यों काम किया, लेकिन अब मैं देख रहा हूं कि यह क्या कह रहा था, मैं इस बात की जांच कर रहा था कि क्या मीडियाप्ले को तत्काल उपयोग किया गया था या नहीं, शून्य का उपयोग करके ... जैसे if (mp==null){do something}
अज़र्सपॉट

12

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

यह प्रयास करने के लिए अधिक ज्ञानवर्धक हो सकता है:

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

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


9

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


9

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

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

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

यहाँ मेरा ऐसा ही जवाब है


1
दोनों aऔर bसंदर्भ हैं। aएक तात्कालिक वस्तु के साथ एक संदर्भ है। bएक तात्कालिक वस्तु के बिना एक संदर्भ है (इसलिए शब्द "अशक्त संदर्भ")।
JUST MY correct OPINION

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

@ धन्यवाद धन्यवाद :) मैंने इसका जवाब दिल से दिया क्योंकि यहाँ मेरा एक और जवाब है कि इस सवाल के समान है stackoverflow.com/questions/4459623/…

8

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

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


5

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


4

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

लेकिन जब हम इसे शून्य के साथ घोषित कर रहे हैं, तो यह केवल त्वरित jvm है, लेकिन इसके लिए कोई मेमोरी आवंटित नहीं की गई है। इसलिए अगर आप इस ऑब्जेक्ट को "" - रिक्त चर के साथ जांच कर एक्सेस करने का प्रयास कर रहे हैं , तो यह 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());
    }
}

}


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

String s = null;
s.length();

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

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


1

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

खाली स्ट्रिंग पर विकिपीडिया लेख से ।


1

String s=null;

स्ट्रिंग को नल के लिए आरंभीकृत नहीं किया गया है। अगर किसी भी स्ट्रिंग ऑपरेशन की कोशिश की जाती है, तो यह अशक्त सूचक अपवाद को फेंक सकता है

String t="null";

यह एक स्ट्रिंग शाब्दिक है जिसमें मान स्ट्रिंग "null" के समान है t = "xyz"। यह अशक्त सूचक को नहीं फेंकेगा।

String u="";

यह खाली स्ट्रिंग के रूप में है, यह शून्य पॉइंटर को नहीं फेंकेगा।


0

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


0

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

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

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


0

जब आप लिखते हैं

String a = "";

इसका मतलब है कि एक प्रकार 'स्ट्रिंग' का एक चर है जो स्ट्रिंग पूल में एक ऑब्जेक्ट संदर्भ को इंगित करता है जिसका मूल्य "" है। जैसा कि चर aएक वैध स्ट्रिंग ऑब्जेक्ट संदर्भ को पकड़ रहा है, स्ट्रिंग के सभी तरीकों को यहां लागू किया जा सकता है।

जबकि जब आप लिखते हैं

String b = null;

इसका मतलब है कि bटाइप स्ट्रिंग का एक चर है जो एक अज्ञात संदर्भ को इंगित करता है । और अज्ञात संदर्भ पर किसी भी ऑपरेशन का परिणाम होगा NullPointerException

अब, नीचे के भावों का मूल्यांकन करते हैं।

System.out.println(a == b); // false. because a and b both points to different object reference

System.out.println(a.equals(b)); // false, because the values at object reference pointed by a and b do not match.

System.out.println(b.equals(a)); // NullPointerException, because b is pointing to unknown reference and no operation is allowed

0

सरल शब्द में,

  • "" एक खाली स्ट्रिंग है

  • null एक खाली स्ट्रिंग चर है


0

अशक्त और खाली स्ट्रिंग के बीच अंतर। उदाहरण के लिए: आपके पास x नाम का एक चर है। यदि आप जेएस में लिखते हैं,

var x = "";

इसका मतलब है कि आपने एक मान दिया है जो खाली स्ट्रिंग है (लंबाई 0 है)। वास्तव में यह कुछ ऐसा है लेकिन जो कुछ भी महसूस नहीं होता है :) दूसरी तरफ,

var y = null;

इसका मतलब है कि आपने घोषणा के समय शून्य से y लिखकर स्पष्ट रूप से कहा गया y का मान नहीं दिया है। यदि आप y.length लिखते हैं; यह एक त्रुटि देगा जो इंगित करता है कि y को निर्दिष्ट कोई मान नहीं है और परिणामस्वरूप y की लंबाई नहीं पढ़ सकता है।


सवाल जावा
वेगा


0

"मैं इसे अपनी अरब-डॉलर की गलती कहता हूं। यह 1965 में अशक्त संदर्भ का आविष्कार था" - https://en.wikipedia.org/wiki/Tony_Hoare

वास्तविक दुनिया के संबंध में दोनों को समान माना जा सकता है। इसकी प्रोग्रामिंग भाषा का सिंटैक्स केवल दो के बीच अंतर पैदा करता है जैसा कि यहां दूसरों द्वारा समझाया गया है। यह बस ओवरहेड बनाता है जैसे कि जाँचते समय / तुलना करते हुए कि क्या स्ट्रिंग चर में कुछ है, आपको पहले यह जांचना होगा कि क्या यह शून्य नहीं है और फिर वास्तविक स्ट्रिंग की तुलना की जा रही है अर्थात दो तुलना। यह हर स्ट्रिंग तुलना के लिए प्रसंस्करण शक्ति की बर्बादी है।

Objects.equals () कॉलिंग .equals () से पहले अशक्त के लिए जाँच करता है।


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