http://kohlerm.blogspot.co.uk/2009/01/is-javalangstringintern-really-evil.html
के अनुसार वस्तुओं की तुलना करने के लिए String.equals()उपयोग करता है कि जोर देता है"=="String
http://www.codeinstructions.com/2009/01/busting-javalangstringintern-myths.html
यह स्ट्रिंग्स की लंबाई और फिर सामग्री की तुलना करता है।
(वैसे, एक बिक्री सूची में उत्पाद कोड स्ट्रिंग सभी समान लंबाई के लिए उत्तरदायी हैं - BIC0417 एक साइकिल चालक की सुरक्षा हेलमेट है, TIG0003 एक जीवित वयस्क नर बाघ है - आपको उनमें से एक को ऑर्डर करने के लिए सभी प्रकार के लाइसेंस की आवश्यकता है। शायद आप एक ही समय में एक सुरक्षा हेलमेट को बेहतर ढंग से ऑर्डर कर सकते हैं।]
तो ऐसा लगता है जैसे आपको अपने स्ट्रिंग्स को उनके intern()संस्करण के साथ बदलने से लाभ मिलता है , लेकिन आपको equals()अपनी प्रोग्रामिंग में "==" का उपयोग करके सुरक्षा - और पठनीयता और मानक अनुपालन - -साथ का उपयोग करने की सुविधा मिलती है । और जो मैं कहने जा रहा हूं, उसमें से अधिकांश इस बात पर निर्भर करता है कि यह सच है, अगर यह सच है।
लेकिन String.equals()परीक्षण करता है कि आपने इसे उपयोग करने से पहले एक स्ट्रिंग और कुछ अन्य ऑब्जेक्ट नहीं पारित किया है "=="? मैं कहने के लिए योग्य नहीं हूं, लेकिन मैं अनुमान नहीं लगाऊंगा, क्योंकि अत्यधिक ऐसे अधिकांश equals()ऑपरेशन स्ट्रिंग टू स्ट्रिंग होंगे, ताकि परीक्षण लगभग हमेशा पास हो। वास्तव में, "==" को प्राथमिकता देने से String.equals()एक विश्वास पैदा होता है कि आप अक्सर स्ट्रिंग की तुलना उसी वास्तविक वस्तु से कर रहे हैं।
मुझे आशा है कि कोई भी आश्चर्यचकित नहीं होगा कि निम्नलिखित लाइनें "गलत" का परिणाम हैं:
Integer i = 1;
System.out.println("1".equals(i));
लेकिन अगर आप को बदलने iके लिए i.toString()दूसरी पंक्ति में, निश्चित रूप से यह है true।
वे स्थान जहाँ आप इंटर्निंग से लाभ की उम्मीद कर सकते हैं , Setऔर Mapजाहिर है। मुझे आशा है कि नजरबंद तार उनके हैशकोड को कैश किया गया है ... मुझे लगता है कि यह एक आवश्यकता होगी। और मुझे आशा है कि मैंने अभी एक विचार नहीं दिया है जो मुझे एक मिलियन डॉलर कमा सकता है। :-)
स्मृति के लिए, यह भी स्पष्ट है कि यदि स्ट्रिंग्स की मात्रा बड़ी है, या यदि आप चाहते हैं कि आपके प्रोग्राम कोड द्वारा उपयोग की जाने वाली मेमोरी बहुत छोटी हो, तो यह एक महत्वपूर्ण सीमा है। यदि आपकी -डिस्टिंक्ट-स्ट्रिंग्स की मात्रा बहुत बड़ी है, तो उन्हें प्रबंधित करने के लिए समर्पित डेटाबेस प्रोग्राम कोड और एक अलग डेटाबेस सर्वर का उपयोग करने पर विचार करने का समय हो सकता है। इसी तरह, यदि आप एक छोटे से प्रोग्राम (जिसमें 10000 उदाहरणों को एक साथ चलाने की आवश्यकता है) को बेहतर बना सकते हैं, तो यह अपने स्ट्रिंग्स को बिल्कुल भी स्टोर नहीं करता है।
एक नया स्ट्रिंग बनाने के लिए यह बेकार लगता है और फिर इसे सीधे अपने intern()विकल्प के लिए छोड़ दें , लेकिन डुप्लिकेट स्ट्रिंग रखने के अलावा, कोई स्पष्ट विकल्प नहीं है। तो वास्तव में निष्पादन लागत इंटर्न पूल में अपने स्ट्रिंग की खोज करना है और फिर कचरा कलेक्टर को मूल के निपटान के लिए अनुमति देता है। और अगर यह एक स्ट्रिंग शाब्दिक है तो यह वैसे भी पहले से ही इंटर्न-एड आता है।
मैं सोच रहा हूं कि intern()दुर्भावनापूर्ण प्रोग्राम कोड का दुरुपयोग किया जा सकता है या नहीं, यह पता लगाने के लिए कि क्या कुछ स्ट्रिंग और उनके ऑब्जेक्ट संदर्भ पहले से ही intern()पूल में मौजूद हैं , और इसलिए जावा सत्र में कहीं और मौजूद हैं, जब कि पता नहीं होना चाहिए। लेकिन यह तभी संभव होगा जब प्रोग्राम कोड का उपयोग पहले से ही भरोसेमंद तरीके से किया जा रहा हो, मुझे लगता है। फिर भी, यह तीसरे पक्ष के पुस्तकालयों के बारे में विचार करने के लिए है जिसे आप अपने एटीएम पिन नंबर को स्टोर करने और याद रखने के लिए अपने कार्यक्रम में शामिल करते हैं!