2012-09-05 10 views
15

संभव डुप्लिकेट:
intern() behaving differently in Java 6 and Java 7स्ट्रिंग प्रशिक्षु पहेली

इस blog पर मैंने पाया दिलचस्प स्ट्रिंग पहेली:

--- उद्धरण ---

String te = "te", st = "st"; 
//"test".length(); 
String username = te + st; 
username.intern(); 
System.out.println("String object the same is: " 
    + (username == "test")); 

जावा 7 अद्यतन 7.

String object the same is: true

लेकिन टिप्पणी हटाएं "परीक्षण" .length के तहत प्रिंट(); रेखा, या जावा 6 के साथ चलाने के लिए और यह प्रिंट

String object the same is: false

--- EOQ ---

ईमानदार होने के नाते मुझे समझ नहीं आता क्यों आउटपुट अलग हैं। क्या आप कृपया मुझे बता सकते हैं कि इस तरह के व्यवहार का कारण क्या है?

+2

अच्छी तरह से यह दोनों मामलों में 'झूठा' है –

+0

हाँ @ जिगर सही है, जब मैंने आपके कोड की कोशिश की, आउटपुट हमेशा झूठा है –

+2

गलत या जावा संस्करण के साथ अलग नहीं है। –

उत्तर

14

आप प्रशिक्षु स्ट्रिंग उपयोगकर्ता नाम पर वापस आवंटित करने के लिए की जरूरत है:

String username = te + st; 
username = username.intern(); 

जो मामले में दोनों कोड होगा उत्पादन true। क्योंकि ते और सेंट अंतिम के रूप में चिह्नित कर रहे हैं, साथ ही

final String te = "te", st = "st"; 
"test".length(); 
String username = (te + st); 
System.out.println("String object the same is: " + (username == "test")); 

प्रिंट सच:

यहाँ एक और दिलचस्प उदाहरण है। तो उपयोगकर्ता नाम एक संकलित समय स्थिर हो जाता है और स्वचालित रूप से interned है।

संपादित

के रूप में कई लोगों को अपने कोड जावा 6, तब भी जब "test".length लाइन पर टिप्पणी की है के साथ गलत प्रिंट बताया।

JDK 7 में, प्रशिक्षु तार नहीं रह गया है जावा ढेर के स्थायी पीढ़ी में आवंटित किए जाते हैं, लेकिन इसके बजाय जावा ढेर के मुख्य भाग में आवंटित किए जाते हैं (के रूप में जाना:

इस वजह से one of the changes introduced in Java 7 है युवा और पुरानी पीढ़ी), आवेदन द्वारा बनाई गई अन्य वस्तुओं के साथ।

एक परिणाम यह है कि the code you posted has different outputs in Java 6 and 7 (बग रिपोर्ट के नीचे उदाहरण देखें)।

5

कृपया Does String.intern() change reference of Original String

के जवाब की जांच यह स्ट्रिंग जो बदल गया है नहीं है, लेकिन जिस वस्तु "परीक्षण" जो बदल गया है के लिए प्रयोग किया जाता है।

तो आपके मामले में अगर "test" पहले परिभाषित किया गया है जिसका मतलब है कि अगर आप पहले "test".length(); करना तो "test" स्ट्रिंग पूल तो पहला परिणाम में है false है।

अब if you comment this line तो बुला username.intern(); "परीक्षण" के बाद स्ट्रिंग पूल में जुड़ जाता है अब अगले "test" जो आप तुलना के लिए उपयोग कर रहे हैं एक ही वस्तु जो username.intern(); विधि द्वारा रखा गया था आवंटित हो जाता है। इसलिए यह true

तो

Commented //"test".length(); -> True 
Un Commented "test".length(); --> False 
संबंधित मुद्दे