"" का उपयोग करके एक स्ट्रिंग को कैसे आरंभ किया जा सकता है?


154

यदि स्ट्रिंग किसी अन्य की तरह ही एक वर्ग है, तो दोहरे उद्धरण चिह्नों का उपयोग करके इसे कैसे आरंभ किया जा सकता है?


25
स्ट्रिंग एक वीआईपी क्लास है। " "पहले से ही एक स्ट्रिंग है!
जॉनचेन 902

2
कोई विशेष अर्थ नहीं। मैं अभी बहुत महत्वपूर्ण था। अर्थात्, java.lang.Stringजावा भाषा का विशेष उपचार करें।
जॉनचेन 902

16
कौन कहता है कि स्ट्रिंग "किसी अन्य की तरह एक वर्ग" है? यह किसी अन्य के विपरीत एक बहुत ही विशेष वर्ग है। चूंकि आपका दमन झूठा है, इसलिए सवाल वास्तव में जवाबदेह नहीं है।
एरिक लिपर्ट

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

जवाबों:


293

जावा स्ट्रिंग विशेष है

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

प्रदर्शन के कारण, जावा के स्ट्रिंग को एक आदिम और एक वर्ग के बीच होने के लिए डिज़ाइन किया गया है।

उदाहरण के लिए

String s1 = "Hello";              // String literal
String s2 = "Hello";              // String literal
String s3 = s1;                   // same reference
String s4 = new String("Hello");  // String object
String s5 = new String("Hello");  // String object

यहां छवि विवरण दर्ज करें

नोट: स्ट्रिंग शाब्दिक एक आम पूल में संग्रहीत हैं। यह भंडारण के संरक्षण के लिए समान सामग्री के साथ तार के लिए भंडारण को साझा करने की सुविधा प्रदान करता है। Stringनए ऑपरेटर के माध्यम से आवंटित की गई वस्तुओं को संग्रहीत किया जाता है heap, और समान सामग्री के लिए भंडारण का कोई बंटवारा नहीं होता है।


72
ध्यान दें कि "आम पूल" आमतौर पर ढेर का हिस्सा है।
जोआचिम सॉर

3
@JoachimSauer हां..इसके बावजूद थोड़ा सा लाभ :) नोट में है कि याद रखने के लिए धन्यवाद।
सुरेश अत्ता

2
तो क्या स्ट्रिंग s1 = "हैलो" लिखना अधिक तेज है; स्ट्रिंग स्ट्रिंग s2 = नया स्ट्रिंग ("हैलो") ;?
user2097804

28
मैं इसे आपके उदाहरण s1 == s2 == s3 लेकिन s4! = S5
Alfredo Osorio

8
@AndrewJanke हाल के हॉटस्पॉट jvm (7) पर, स्ट्रिंग पूल परमिट जीन में नहीं है और जावा 8 से कोई भी परमिट जीन नहीं है ...
assylias

50

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

  1. सीधे शाब्दिक असाइनमेंट

    String a = "adsasdf";
  2. नए कीवर्ड का उपयोग करते हुए अन्य ऑब्जेक्ट के रूप में

    String a = new String("adsasdf");

जब आप ==साइन की तुलना करना चाहते हैं तो आपको विशेष ध्यान रखने की आवश्यकता है :

String a = "asdf";
String b = "asdf";
System.out.println(a == b);  // True
System.out.println(a.equals(b)); // True

String a = new String("asdf");
String b = new String("asdf");
System.out.println(a == b);  // False
System.out.println(a.equals(b)); // True

ऐसा इसलिए है क्योंकि पहले मामले में वस्तुओं और बी को कुछ कहा जाता है literal poolऔर वे दोनों एक ही वस्तु को संदर्भित कर रहे हैं, इसलिए वे दोनों तरीकों में समान हैं।

लेकिन दूसरे मामले में ए और बी अलग-अलग ऑब्जेक्ट्स को संदर्भित करते हैं जैसे हम किसी अन्य ऑब्जेक्ट को इनिशियलाइज़ करते हैं। इसलिए वे ==ऑपरेटर के साथ तुलना करते समय असमान होते हैं जबकि वे मूल्यों में समान होते हैं।


18

स्ट्रिंग को जेएलएस में विशेष उपचार मिलता है: यह दो गैर-आदिम प्रकारों में से एक है जिसके लिए शाब्दिक रूप से मौजूद है (दूसरा है Class) *

से JLS :

एक स्ट्रिंग शाब्दिक वर्ग `स्ट्रिंग [...] के उदाहरण के लिए एक संदर्भ है।

* अच्छी तरह से, वहाँ भी है "शून्य प्रकार" यह "शून्य शाब्दिक" के साथ null, लेकिन अधिकांश लोगों को उचित प्रकार के रूप में "नल प्रकार" का नहीं लगता।


1
मुझे यह भी पता नहीं था कि जावा में "नल प्रकार" एक उचित प्रकार है। इसकी बहुत उपयोगी जानकारी, आपको फ़ॉन्ट आकार बढ़ाना चाहिए।
बृजेश चौहान

1
@GrijeshChauhan: ठीक है, "शून्य प्रकार" किसी nullभी संदर्भ प्रकार चर को सौंपा जा सकता है। यह एक दिलचस्प प्रकार नहीं है, अन्यथा।
जोकिम सॉयर

15

यह जावा भाषा की एक विशेषता है। स्रोत कोड में स्ट्रिंग शाब्दिक को विशेष उपचार दिया जाता है।

भाषा कल्पना, यहाँ , बस का कहना है कि एक स्ट्रिंग शाब्दिक की है Stringप्रकार


5

दोहरे उद्धरण चिह्नों के अंदर पाठ शाब्दिक Stringवस्तु बनाता है ।

String myString = "Some text";

उपरोक्त कोड Stringदोहरे उद्धरण चिह्नों का उपयोग करके एक ऑब्जेक्ट बनाता है ।


4

प्रोग्रामिंग भाषा में स्ट्रिंग्स का उपयोग अक्सर किया जाता है। चूँकि जावा ऑब्जेक्ट ओरिएंटेड है एक स्ट्रिंग एक ऑब्जेक्ट है। बोझिल नई स्ट्रिंग से बचने के लिए ("someString"); हर बार आपको एक स्ट्रिंग ऑब्जेक्ट की आवश्यकता होती है java आपको स्ट्रिंग शाब्दिक का उपयोग करके एक स्ट्रिंग ऑब्जेक्ट बनाने की अनुमति देता है।

लेकिन आपको स्ट्रिंग समानता को ध्यान में रखना चाहिए। यहाँ एक छोटा JUnit परीक्षण है जो मेरा मतलब दिखाता है।

    @Test
    public void stringTest() {
       // a string literal and a string object created 
       // with the same literal are equal
       assertEquals("string", new String("string"));

       // two string literals are the same string object
       assertSame("string", "string"); 

       // a string literal is not the same object instance 
       // as a string object created with the same string literal
       assertFalse("string" == new String("string"));

       // java's String.intern() method gives you the same
       // string object reference for all strings that are equal.
       assertSame("string", new String("string").intern());
    }

यदि आप केवल एक स्ट्रिंग के साथ आरंभ कर सकते हैं new String(String src), तो आप कंस्ट्रक्टर को एक स्ट्रिंग शाब्दिक भी नहीं दे पाएंगे। आपको एक स्ट्रिंग इनिशियलाइज़ करना होगा char [], और फिर String(char [] src)स्ट्रिंग बनाने के लिए कंसट्रक्टर का उपयोग करना होगा, या आपको एक फाइल से स्ट्रिंग को पढ़ना होगा।
AJMansfield

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

2

सिर्फ उल्लेख करने के लिए। एक स्ट्रिंग शाब्दिक वर्ग की एक आवृत्ति का एक संदर्भ है स्ट्रिंग आप इस तरह कोड लिख सकते हैं:

 "Abc" .getBytes ();

 "एक: ख: ग" .split ( ":");

 "愛" .codePointAt (0);

2

- स्ट्रिंग जावा में एक वर्ग है । आप इसके बारे में सही हैं, इसलिए हम हमेशा newकीवर्ड के साथ आरंभ कर सकते हैं ।

- लेकिन जब हम कुछ ऐसा करते हैं:

String s = "";

उपरोक्त कथन को संकलक द्वारा एक विशेष स्ट्रिंग ऑब्जेक्ट के रूप में चिह्नित किया जाता है और फिर कक्षा के लोडिंग के दौरान JVM (लोडिंग को आरंभीकरण से पहले किया जाता है), यह देखता है कि इसे स्ट्रिंग शाब्दिक के रूप में क्या जाना जाता है , जो एक स्ट्रिंग शाब्दिक पूल में संग्रहीत है ।

- तो एक स्ट्रिंग का उपयोग करके new()और ""विधि द्वारा बनाया जा सकता है , लेकिन उत्तरार्द्ध एक स्ट्रिंग शाब्दिक प्रदान करता है जो उस स्ट्रिंग ऑब्जेक्ट के संदर्भ में नहीं होने पर भी ढेर में रहता है, क्योंकि इसमें स्ट्रिंग शाब्दिक पूल से एक संदर्भ है।


2

जावा हमारे लिए एक दो कदम प्रक्रिया करता है।

String str = "hello";

के बराबर है

char data[] = {'h', 'e', 'l' , 'l', 'o'};
String str = new String(data);

जैसे [.NET] [1] को एक समान चीज मिली है।

String(Char[]) constructor

कर देता है

String(char[] value)

संदर्भ जोड़ना: -


2
आपके द्वारा वर्णित प्रक्रिया वह नहीं है जो जावा वास्तव में करता है: जैसा कि अन्य पहले ही बता चुके हैं, "hello"एक स्ट्रिंग शाब्दिक है और संकलक द्वारा निरंतर पूल में डाल दिया जाएगा, JLS §3.10.5 और JVMS .15.1 देखें
सीगी

1

Java.lang.Stringसिर्फ एक वर्ग नहीं है। यह मुख्य भाषा का अभिन्न अंग है। कंपाइलर में इसके लिए सिंटैक्टिक शुगर होती है। उदाहरण के लिए, के लिए ""एक संक्षिप्त नाम की तरह है new String("")। जब लिखित ""संकलक अंतरिक्ष को बचाने के लिए एक ही उदाहरण के समान तार का अनुकूलन करता है।"a" + 5 == "a5" ==> true

कंपाइलर में बहुत सारे सामानों के लिए सिंथैटिक शुगर होता है, जिसमें ऑब्जेक्ट वर्जन और उनके मूल प्रकारों के बीच बॉक्स / अनबॉक्स नहीं होना, कोई पेरेंट का मतलब ऑब्जेक्ट, डिफॉल्ट कंस्ट्रक्टर, ...


5
""के लिए एक संक्षिप्त नाम नहीं है new String("")। यदि आप उपयोग करते हैं "", तो पहली चीज जो जेवीएम के स्ट्रिंग पूल में मैचों को देखने के लिए की जाएगी, और यदि यह सच है, तो यह उस स्ट्रिंग को वापस कर देगा। उपयोग करके new String(""), आप हमेशा एक नया स्ट्रिंग बनाएंगे, भले ही स्ट्रिंग स्वयं पहले से ही स्ट्रिंग पूल में मौजूद हो (क्योंकि यह स्ट्रिंग पूल में संग्रहीत नहीं किया जाएगा)।
g00glen00b

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