2012-05-25 18 views
8
String h = "hi"; 

यहाँ हम स्ट्रिंग शाब्दिक हाय करने के लिए स्ट्रिंग ज संदर्भित कर रहे हैं। जेवीएम में स्ट्रिंग अक्षर को स्टोर करने के लिए एक स्ट्रिंग शाब्दिक पूल है ताकि हम तारों का पुन: उपयोग कर सकें क्योंकि वे अपरिवर्तनीय हैं ...जावा में स्ट्रिंग्स की पुन: प्रयोज्यता?

जब हम कहते हैं reusable, इसका सटीक अर्थ क्या है? क्या हम address के बारे में बात कर रहे हैं? कि यह एक ही पते से समय निकाला जाता है?

+0

मुझे लगता है कि जवाब है हां। –

उत्तर

6

हाँ, बनाने के लिए चीजें आसान आप के रूप में यह सोच सकते हैं

स्ट्रिंग शाब्दिक पूल क्या है और यह कैसे काम करता के बारे में अधिक जानकारी के लिए यहाँ देखो एक ही पते से चुनना, लेकिन अधिक सटीक चर होने के लिए संदर्भ - पहचानकर्ता जो JVM ऑब्जेक्ट के उचित स्मृति पते पर मैप करने के लिए उपयोग कर सकता है (क्योंकि वस्तुओं को स्मृति में स्थानांतरित किया जा सकता है)।

आप इस तरह कोड से यह परीक्षण कर सकते हैं:

String w1 = "word"; 
String w2 = "word"; 
String b = new String("word"); // explicitly creating String by calling `new` operator 
           // won't put it in string pool 
System.out.println(w1 == w2); // true -> variables hold same reference 
System.out.println(w1 == b); // false -> variable hold different references 
b = b.intern(); // check if pool contains this string, if not put this string in pool, 
       // then return reference of such string from pool and store it in b variable 
System.out.println(w1 == b); // true -> now w1 and b hold same reference 
+0

बी = b.intern(); // स्ट्रिंग के पूल में स्ट्रिंग डालें, इसे पूल से वापस करें, फिर इसे बी रिफ्रेंस में स्टोर करें .... इसे पूल में रखें ठीक है समझा नहीं गया है :( – Nil

+0

मुझे 'b.intern()' से somewhare मान स्टोर करने की आवश्यकता है क्योंकि स्ट्रिंग अपरिवर्तनीय है (बदला नहीं जा सकता है) इसलिए मैं 'b = b.intern()' करता हूं, इसलिए मैंने लिखा है कि "इसे बी रिफ्रेंस में स्टोर करें" – Pshemo

+0

मैं बस कुछ सामान पढ़ रहा था .. जब आप कहते हैं कि स्ट्रिंग को एक बार बदला नहीं जा सकता यह बनाया गया है, इसका क्या अर्थ है? [माफ करना 4 शौकिया प्रश्न] – Nil

8

String h = "hi"; 
String i = "hi"; 
String j = new String("hi"); 

के मामले में JDK के संस्करण संकलक क्या interning कहा जाता है क्या करना है और बाइट डाटा कि "hi" का प्रतिनिधित्व करता है का एक उदाहरण बना सकते हैं और दोनों के बीच यह पुन: उपयोग कर सकते हैं पर निर्भर करता है परिवर्तनीय संदर्भों के लिए। हालिया विनिर्देशों में सभी String literals स्थायी पीढ़ी में स्ट्रिंग पूल में शामिल हैं।

पिछले विवरण में new कीवर्ड का उपयोग करके एक नया ऑब्जेक्ट एक अलग ऑब्जेक्ट के समान सटीक बाइट्स का निर्माण करेगा। जब तक .intern() उन पर कहा जाता है

स्ट्रिंग वस्तुओं क्रम पर बनाया स्ट्रिंग पूल में नहीं हैं।

private String h = "hi"; 

सभी इन वस्तुओं वास्तव में स्मृति में एक ही स्ट्रिंग उदाहरण दर्शाएंगे: This is usually not needed and can cause problems, rarely has any significant benefits.

h == i; // true 
h == j; // false 
j.intern(); 
h == j; // true 
+0

स्ट्रिंग एच = "हाय"; और स्ट्रिंग i = नया स्ट्रिंग ("हाय"); .... इस मामले में कुछ अलग होता है? – Nil

+0

ताकि एच और मैं की सामग्री "हाय" एक पते पर संग्रहीत की जा सके और ऑब्जेक्ट जे की सामग्री "हाय" किसी अन्य पते पर संग्रहीत हो, क्या मैं सही हूं? – Nil

4

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

3

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

यह किया जा सकता है क्योंकि String रों जावा में अपरिवर्तनीय हैं।

कुछ इस तरह कर रही है के लिए कारण एक नया String वस्तु बनाने की लागत से बचना है। http://www.xyzws.com/Javafaq/what-is-string-literal-pool/3

इसके अलावा, इस सवाल पर देखने: Shouldn't I do `String s = new String("a new string");` in Java, even with automatic string interning?

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