JLS (15.28 लगातार भाव) केवल युक्त अभिव्यक्ति के अनुसार:रनटाइम स्ट्रिंग संयोजन मूल्यांकन
i)Literals of primitive type and literals of type String (§3.10.1, §3.10.2, §3.10.3,
§3.10.4, §3.10.5)
or
ii)Simple names (§6.5.6.1) that refer to constant variables (§4.12.4).
or
iii)...
एक निरंतर अभिव्यक्ति है।
अब String s1="a"+"b";
एक निरंतर अभिव्यक्ति है और संकलन समय पर "ab"
पर मूल्यांकन किया जाएगा।
तो s1="ab";
[1] क्या मैं सही हूँ कह रही है कि अब वहाँ स्ट्रिंग पूल में तीन वस्तुओं ऊपर बयान के अनुसार के रूप में कर रहे हैं में: -, "एक", "बी" "ab" ???
अब,
final String s="a";
final String s1="b";
String s2=s+s1; // is also constant expression and get evaluated at compile time.
ऊपर कोड संकलन के बाद s2="a"+"b";
को transaled कर दिया जाएगा।
तो s2="ab";
स्वचालित रूप से स्ट्रिंग पूल में संग्रहीत किया जाएगा।
लेकिन,
// note there is no final now.
String s="a";
String s1="b";
String s2="a"+"b"; // constant expression.
String s3=s+s1; // is NOT a constant expression and get evaluated at RUN TIME.
String s3=s+s1;
के लिए
, कोड के लिए अनुवाद किया जाएगा:
s3=new StringBuilder(String.valueOf(s)).append(s1).toString();
और एक नया स्ट्रिंग वस्तु का निर्माण करेगा।
इसलिए, s2==s3
झूठी होने के लिए बाहर आ जाएगा;
क्या इसका मतलब है स्ट्रिंगबिल्डर का उपयोग कर रनटाइम पर मूल्यांकन स्ट्रिंग कॉन्सटेनेशन का परिणाम स्ट्रिंग पूल में संग्रहीत नहीं होता है बल्कि इसके बजाय हीप (पूल के बाहर) में जाता है?
ध्यान दें कि संकलन चरण के दौरान स्ट्रिंग पूल स्ट्रिंग पूल के समान नहीं है जब आपका प्रोग्राम चलाया जाता है। –
@ Thorbjørn Ravn Andersen: अच्छा बिंदु। क्या आप मुझे कोई लिंक या स्रोत दे सकते हैं जहां मैं आपके बिंदु का विवरण देख सकता हूं। –