यदि स्ट्रिंग किसी अन्य की तरह ही एक वर्ग है, तो दोहरे उद्धरण चिह्नों का उपयोग करके इसे कैसे आरंभ किया जा सकता है?
java.lang.Stringजावा भाषा का विशेष उपचार करें।
यदि स्ट्रिंग किसी अन्य की तरह ही एक वर्ग है, तो दोहरे उद्धरण चिह्नों का उपयोग करके इसे कैसे आरंभ किया जा सकता है?
java.lang.Stringजावा भाषा का विशेष उपचार करें।
जवाबों:
जावा के डिजाइनरों ने हर चीज को एक वस्तु बनाने के बजाय एक वस्तु-उन्मुख भाषा में आदिम प्रकार को बनाए रखने का फैसला किया, ताकि भाषा के प्रदर्शन में सुधार हो सके। प्राइमिटिव्स कॉल स्टैक में संग्रहीत होते हैं, जिन्हें कम संग्रहण स्थान की आवश्यकता होती है और हेरफेर करने के लिए सस्ता होता है। दूसरी ओर, कार्यक्रम ढेर में वस्तुओं को संग्रहीत किया जाता है, जिसके लिए जटिल स्मृति प्रबंधन और अधिक भंडारण स्थान की आवश्यकता होती है।
प्रदर्शन के कारण, जावा के स्ट्रिंग को एक आदिम और एक वर्ग के बीच होने के लिए डिज़ाइन किया गया है।
उदाहरण के लिए
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, और समान सामग्री के लिए भंडारण का कोई बंटवारा नहीं होता है।
जावा स्ट्रिंग को एक विशेष वर्ग के रूप में मानता है, आप दोनों तरीकों से आरंभ कर सकते हैं
सीधे शाब्दिक असाइनमेंट
String a = "adsasdf";नए कीवर्ड का उपयोग करते हुए अन्य ऑब्जेक्ट के रूप में
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और वे दोनों एक ही वस्तु को संदर्भित कर रहे हैं, इसलिए वे दोनों तरीकों में समान हैं।
लेकिन दूसरे मामले में ए और बी अलग-अलग ऑब्जेक्ट्स को संदर्भित करते हैं जैसे हम किसी अन्य ऑब्जेक्ट को इनिशियलाइज़ करते हैं। इसलिए वे ==ऑपरेटर के साथ तुलना करते समय असमान होते हैं जबकि वे मूल्यों में समान होते हैं।
स्ट्रिंग को जेएलएस में विशेष उपचार मिलता है: यह दो गैर-आदिम प्रकारों में से एक है जिसके लिए शाब्दिक रूप से मौजूद है (दूसरा है Class) * ।
से JLS :
एक स्ट्रिंग शाब्दिक वर्ग `स्ट्रिंग [...] के उदाहरण के लिए एक संदर्भ है।
* अच्छी तरह से, वहाँ भी है "शून्य प्रकार" यह "शून्य शाब्दिक" के साथ null, लेकिन अधिकांश लोगों को उचित प्रकार के रूप में "नल प्रकार" का नहीं लगता।
nullभी संदर्भ प्रकार चर को सौंपा जा सकता है। यह एक दिलचस्प प्रकार नहीं है, अन्यथा।
दोहरे उद्धरण चिह्नों के अंदर पाठ शाब्दिक Stringवस्तु बनाता है ।
String myString = "Some text";
उपरोक्त कोड Stringदोहरे उद्धरण चिह्नों का उपयोग करके एक ऑब्जेक्ट बनाता है ।
प्रोग्रामिंग भाषा में स्ट्रिंग्स का उपयोग अक्सर किया जाता है। चूँकि जावा ऑब्जेक्ट ओरिएंटेड है एक स्ट्रिंग एक ऑब्जेक्ट है। बोझिल नई स्ट्रिंग से बचने के लिए ("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)स्ट्रिंग बनाने के लिए कंसट्रक्टर का उपयोग करना होगा, या आपको एक फाइल से स्ट्रिंग को पढ़ना होगा।
- स्ट्रिंग जावा में एक वर्ग है । आप इसके बारे में सही हैं, इसलिए हम हमेशा newकीवर्ड के साथ आरंभ कर सकते हैं ।
- लेकिन जब हम कुछ ऐसा करते हैं:
String s = "";
उपरोक्त कथन को संकलक द्वारा एक विशेष स्ट्रिंग ऑब्जेक्ट के रूप में चिह्नित किया जाता है और फिर कक्षा के लोडिंग के दौरान JVM (लोडिंग को आरंभीकरण से पहले किया जाता है), यह देखता है कि इसे स्ट्रिंग शाब्दिक के रूप में क्या जाना जाता है , जो एक स्ट्रिंग शाब्दिक पूल में संग्रहीत है ।
- तो एक स्ट्रिंग का उपयोग करके new()और ""विधि द्वारा बनाया जा सकता है , लेकिन उत्तरार्द्ध एक स्ट्रिंग शाब्दिक प्रदान करता है जो उस स्ट्रिंग ऑब्जेक्ट के संदर्भ में नहीं होने पर भी ढेर में रहता है, क्योंकि इसमें स्ट्रिंग शाब्दिक पूल से एक संदर्भ है।
जावा हमारे लिए एक दो कदम प्रक्रिया करता है।
String str = "hello";
के बराबर है
char data[] = {'h', 'e', 'l' , 'l', 'o'};
String str = new String(data);
जैसे [.NET] [1] को एक समान चीज मिली है।
String(Char[]) constructor
कर देता है
String(char[] value)
संदर्भ जोड़ना: -
"hello"एक स्ट्रिंग शाब्दिक है और संकलक द्वारा निरंतर पूल में डाल दिया जाएगा, JLS §3.10.5 और JVMS .15.1 देखें ।
Java.lang.Stringसिर्फ एक वर्ग नहीं है। यह मुख्य भाषा का अभिन्न अंग है। कंपाइलर में इसके लिए सिंटैक्टिक शुगर होती है। उदाहरण के लिए, के लिए ""एक संक्षिप्त नाम की तरह है new String("")। जब लिखित ""संकलक अंतरिक्ष को बचाने के लिए एक ही उदाहरण के समान तार का अनुकूलन करता है।"a" + 5 == "a5" ==> true
कंपाइलर में बहुत सारे सामानों के लिए सिंथैटिक शुगर होता है, जिसमें ऑब्जेक्ट वर्जन और उनके मूल प्रकारों के बीच बॉक्स / अनबॉक्स नहीं होना, कोई पेरेंट का मतलब ऑब्जेक्ट, डिफॉल्ट कंस्ट्रक्टर, ...
""के लिए एक संक्षिप्त नाम नहीं है new String("")। यदि आप उपयोग करते हैं "", तो पहली चीज जो जेवीएम के स्ट्रिंग पूल में मैचों को देखने के लिए की जाएगी, और यदि यह सच है, तो यह उस स्ट्रिंग को वापस कर देगा। उपयोग करके new String(""), आप हमेशा एक नया स्ट्रिंग बनाएंगे, भले ही स्ट्रिंग स्वयं पहले से ही स्ट्रिंग पूल में मौजूद हो (क्योंकि यह स्ट्रिंग पूल में संग्रहीत नहीं किया जाएगा)।
" "पहले से ही एक स्ट्रिंग है!