2015-04-09 3 views
22

जावा में निम्नलिखित दो प्रारंभिकताओं के बीच क्या अंतर है?जावा में नई स्ट्रिंग() और नई स्ट्रिंग ("") द्वारा स्ट्रिंग प्रारंभिकरण के बीच क्या अंतर है?

  1. String a = new String();
  2. String b = new String("");
+2

इसके लिए पहले से ही एक बहुत ही समान पोस्ट है। http://stackoverflow.com/questions/9555077/string-initialization-difference –

+0

[जावा में स्ट्रिंग खाली कन्स्ट्रक्टर] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/12430112/string-empty-constructor-in -जावा) – Joe

+1

@ जो हालांकि मुझे आश्चर्य हुआ है कि यह पहले से मौजूद नहीं है, मुझे नहीं लगता कि प्रश्न इस का एक डुप्लिकेट है - 'स्ट्रिंग ("")' '' 'से अलग है। –

उत्तर

19

ठीक है, वे लगभग हैं।

public static void main(String[] args) { 
    String s1 = new String(); 
    String s2 = new String(""); 
    System.out.println(s1.equals(s2)); // returns true. 
} 

छोटा सा अंतर (बल्कि तुच्छ):

  1. new String(); कम समय new String(""); से निष्पादित करने के लिए, क्योंकि प्रति निर्माता सामान का एक बहुत करता है लेता है।

  2. new String("") स्ट्रिंग स्थिरांक पूल में खाली स्ट्रिंग ("") जोड़ता है यदि यह पहले से मौजूद नहीं है। new String("abc") के उपयोग लगभग हमेशा बुरा है, क्योंकि आप स्ट्रिंग स्थिरांक पर 2 तार बनाने की जाएगी पूल और एक अन्य के समान मूल्य वाली ढेर पर:

इस के अलावा, वहाँ कोई अन्य मतभेद

नोट कर रहे हैं ।

+1

अन्य अंतर - 'नया स्ट्रिंग();' भी आसान है, और लिखने के लिए कम समय लगता है (मतलब लेखन), इसलिए यह बेहतर है। –

+3

@GrijeshChauhan क्यों न सिर्फ '' "? – johnchen902

+1

@ johnchen902 yes '=" "बेहतर है, मैं केवल दो प्रश्नों की तुलना कर रहा था। –

4

Java Docs यह खूबसूरती से

बताते हैं इन 2 अलग बुला

public String() 

initializes निर्माता हैं एक नव निर्मित स्ट्रिंग ऑब्जेक्ट ताकि यह रिक्त वर्ण अनुक्रम का प्रतिनिधित्व करता हो। ध्यान दें कि इस कन्स्ट्रक्टर का उपयोग अनावश्यक है क्योंकि स्ट्रिंग्स अपरिवर्तनीय हैं।

public String(String original) 

इतना है कि यह तर्क के रूप में पात्रों में से उसी क्रम का प्रतिनिधित्व करता है एक नव निर्मित स्ट्रिंग ऑब्जेक्ट आरंभीकृत; दूसरे शब्दों में, नव निर्मित स्ट्रिंग तर्क स्ट्रिंग की एक प्रति है। जब तक एक स्पष्ट मूल की प्रति आवश्यक नहीं है, तो इस कन्स्ट्रक्टर का उपयोग अनावश्यक है क्योंकि स्ट्रिंग्स अपरिवर्तनीय हैं।

2

पहले मामले में आप दूसरे मामले दो में केवल एक ही String वस्तु बनाने: "" और new String, "" अगर वस्तु नहीं पहले से ही स्ट्रिंग पूल में मौजूद हैं।

  1. एक नव निर्मित स्ट्रिंग ऑब्जेक्ट आरंभीकृत इतना है कि यह एक खाली चरित्र अनुक्रम का प्रतिनिधित्व करता है।

  2. एक नव निर्मित स्ट्रिंग ऑब्जेक्ट को आरंभ करता है ताकि यह वर्णों के समान क्रम के समान अनुक्रम का प्रतिनिधित्व करता हो; दूसरे शब्दों में, नव निर्मित स्ट्रिंग तर्क स्ट्रिंग की एक प्रति है।

+1

क्या इस बिंदु पर बनाया जा रहा है? या यह पहले से ही इंटर्न वाले तार पूल में मौजूद है? –

+0

@MichaelT प्रश्न के लिए धन्यवाद। यदि आपने पहले कोई अन्य स्ट्रिंग ऑब्जेक्ट नहीं बनाया है तो इसे बनाया जाएगा। यदि आप पहले '' "स्ट्रिंग ऑब्जेक्ट बनाते हैं, तो स्ट्रिंग पूल से मूल्य प्राप्त होगा। –

+0

मेरी प्रतिक्रिया [इस उत्तर] (http: // stackoverflow।कॉम/ए/16785 991/28 9 086) सुझाव देता है कि स्ट्रिंग इंटर्निंग कक्षा लोड समय (वर्ग के लिए निरंतर पूल के हिस्से के रूप में) पर की जाती है - जब विधि को बुलाया जाता है। इस प्रकार, जब विधि कहा जाता है तो '" "के लिए कोई नई स्ट्रिंग नहीं बनाई जाती है। बस एक मामूली सुधार (मुझे लगता है)। –

3

आंतरिक रूप से, विभिन्न निर्माताओं सक्रिय किया जाएगा।

हालांकि, जिसके परिणामस्वरूप String वस्तुओं अपनी सामग्री और बराबर द्वारा समान होगा (a.equals(b) वापस आ जाएगी true)

1

पहले डिफ़ॉल्ट निर्माता बुला रहा है और दूसरा आदेश में एक बनाने के लिए प्रति निर्माता बुला रहा है प्रत्येक मामले में नई स्ट्रिंग।

2

TheLostMind ज्यादातर सही है, लेकिन मैं जोड़ने के लिए है कि प्रति निर्माता वास्तव में इतना भी नहीं करता है करना चाहते हैं: निरंतर "" का उपयोग करने के लिए पहले निर्माता का उपयोग करेगा

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/lang/String.java#137

137 public String() {
138 this.value = newchar[0];
139 }

151 public String(String original) {
152 this.value = original.value;
153 this.hash = original.hash;
154 }

ऑब्जेक्ट रेफरेंस को वैसे भी बनाएं, इसलिए इससे कोई फर्क नहीं पड़ता कि आप किस चीज का उपयोग करते हैं।

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

+0

मुझे यह दिलचस्प लगता है कि एक लाख-वर्ण स्ट्रिंग 'foo' दिया गया है, कथन' बार = नई स्ट्रिंग (foo); 'बैकिंग स्टोर साझा करेगा, लेकिन विधि कॉल' foo.equals (bar) 'प्रत्येक वर्ण की तुलना करेगा उस बैकिंग स्टोर की खुद को नोटिस करने के बजाय, दोनों तार एक ही बैकिंग स्टोर साझा करते हैं। – supercat

+0

ठीक है - java7u40 से पहले, कॉपी कन्स्ट्रक्टर में बहुत कुछ चल रहा था। अब, उन्होंने डिज़ाइन बदल दिया है ताकि एक ही बैक-एंड सरणी का उपयोग किया जा सके। जेडीके 6 में हम कॉपी कन्स्ट्रक्टर में एक नया चार सरणी बनाते थे :) – TheLostMind

1

एक पूरी तरह से व्यावहारिक दृष्टिकोण से, शून्य उन निर्माणों के बीच अंतर है, क्योंकि उनमें से किसी भी का उपयोग करने का कोई कारण नहीं है। वे दोनों अपर्याप्त और अधिक जटिल हैं, और इस प्रकार समान रूप से व्यर्थ हैं।

रिक्त स्ट्रिंग के साथ एक चर को प्रारंभ करने के लिए, कार्य करें:

String s = ""; 

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

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