2016-03-17 7 views
7

मैं इस तरह कोड है:String.intern() विधि दो अलग-अलग परिणामों को क्यों लौटाता है?

public static void main(String[] args) { 
    String str1 = new StringBuilder("计算机").append("软件").toString(); 
    System.out.println(str1.intern()==str1); 

    String str2 = new StringBuilder("ja").append("va").toString(); 
    System.out.println(str2.intern()==str2); 

    String str3 = new StringBuilder("Str").append("ing").toString(); 
    System.out.println(str3.intern()==str3); 


} 

और मैं परिणाम है:

true 
false 
true 

मैं समझ सकता क्यों पंक्ति 1 और पंक्ति 3 सच है, लेकिन मैं पंक्ति 2 के बारे में इस मुद्दे को हूँ, क्यों इस गलत है?

मेरे जावा है: जावा संस्करण "1.8.0_73"

+7

क्योंकि '" जावा "' स्पष्ट रूप से निरंतर में पहले से ही है पूल, इसलिए 'str2.intern()' बस उस संदर्भ को वापस कर देता है, जो कि नए 'str2' संदर्भ से अलग है। – Tom

+0

@ टॉम क्यों "जावा" पहले से ही निरंतर पूल में है? और क्यों "स्ट्रिंग" नहीं है? – Timi

उत्तर

15

String.intern() शाब्दिक पूल स्ट्रिंग में एक स्ट्रिंग देता है। हालांकि यदि पूल में स्ट्रिंग पहले से मौजूद है, तो यह मौजूदा स्ट्रिंग को वापस कर देगी।

यदि आप एक नया स्ट्रिंग चुनते हैं, तो इसे आपके द्वारा बनाए गए स्ट्रिंग को वापस करना चाहिए, लेकिन यदि आप पूल में मौजूद स्ट्रिंग का उपयोग करते हैं तो पहले से ही आप मौजूदा स्ट्रिंग प्राप्त करेंगे।

यह मानना ​​उचित है कि इस मामले में "java" पूल में पहले से मौजूद है, इसलिए जब आप इंटर्न कहते हैं() यह एक अलग वस्तु देता है तो == गलत है।

नोट: string.intern().equals(string) हमेशा सत्य होना चाहिए।

+0

लेकिन यह सवाल का जवाब कैसे देता है? मेरा मतलब है, यह उपरोक्त व्यवहार की व्याख्या नहीं करता है। – user2004685

+0

@ user2004685 यह कैसे नहीं है? – Tom

+0

@ user2004685 तारों के लिए '==' संदर्भ की तुलना सामग्री की तुलना नहीं करता है। –

4

निरंतर String"java" पहले से ही जावा निरंतर पूल में मौजूद है, लेकिन आप

String str2 = new StringBuilder("ja").append("va").toString(); 
System.out.println(str2.intern() == "java"); 

को

String str2 = new StringBuilder("ja").append("va").toString(); 
System.out.println(str2.intern()==str2); 

बदलकर यह सुनिश्चित कर सकता है जो एक ही स्थिर और आउटपुट

true 
मिल जाएगा

वैकल्पिक रूप से, आप की तरह

String a = "计算机软件"; 
String b = "String"; 
String str1 = new StringBuilder("计算机").append("软件").toString(); 
System.out.println(str1.intern() == str1); 

String str3 = new StringBuilder("Str").append("ing").toString(); 
System.out.println(str3.intern() == str3); 

निरंतर पूल के लिए "计算机软件" और "String" जोड़ सकता है तो फिर तुम मिलेगा (अपनी टिप्पणियों के साथ संगत)

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