यह एक अच्छा लेख है जो उपरोक्त उत्तरों पर पहले से वर्णित दो कारणों को रेखांकित करता है:
- सुरक्षा : सिस्टम बिना किसी चिंता के केवल पढ़ने योग्य जानकारी के संवेदनशील बिट्स को सौंप सकता है ताकि उन्हें बदल दिया जाएगा
- प्रदर्शन : अपरिवर्तनीय डेटा चीजों को धागा-सुरक्षित बनाने में बहुत उपयोगी है।
और यह शायद उस लेख में सबसे विस्तृत टिप्पणी है। इसका जावा और सुरक्षा मुद्दों में स्ट्रिंग पूल के साथ क्या करना है। इसके बारे में कैसे तय करें कि स्ट्रिंग पूल में क्या जाता है। मान लें कि दोनों तार समान हैं यदि उनके पात्रों का क्रम समान है, तो हमारे पास एक दौड़ की स्थिति है जो पहले वहां पहुंचता है और इसके साथ सुरक्षा के मुद्दे। यदि नहीं, तो स्ट्रिंग पूल में निरर्थक तार शामिल होंगे और इस तरह इसे पहले स्थान पर रखने का फायदा होगा। बस इसे अपने लिए पढ़ें, फिर करेंगे?
स्ट्रिंग का विस्तार समान और इंटर्न के साथ कहर होगा। जावाडॉक कहता है कि बराबरी:
इस स्ट्रिंग की तुलना निर्दिष्ट ऑब्जेक्ट से करता है। परिणाम सत्य है अगर और केवल अगर तर्क शून्य नहीं है और एक स्ट्रिंग ऑब्जेक्ट है जो इस ऑब्जेक्ट के समान अनुक्रम का प्रतिनिधित्व करता है।
यह मानते हुए java.lang.String
कि अंतिम नहीं था, एक SafeString
बराबर हो सकता है String
, और इसके विपरीत; क्योंकि वे वर्णों के समान अनुक्रम का प्रतिनिधित्व करेंगे।
यदि आप आवेदन किया, तो क्या होगा intern
एक करने के लिए SafeString
- होगा SafeString
JVM की स्ट्रिंग पूल में जाने? तब ClassLoader
और SafeString
उसके संदर्भ में रखी गई सभी वस्तुएँ JVM के जीवनकाल के लिए बंद कर दी जाएंगी। आपको इस बारे में एक दौड़ की स्थिति मिलेगी कि पात्रों में से पहला क्रम कौन सा हो सकता है - शायद आपकी SafeString
जीत होगी, शायद एक String
, या शायद SafeString
एक अलग क्लास लोडर (इस तरह एक अलग वर्ग) द्वारा भरी हुई।
यदि आप पूल में दौड़ जीतते हैं, तो यह एक सच्चा गायक होगा और लोग प्रतिबिंब के माध्यम से आपके पूरे वातावरण (सैंडबॉक्स) तक पहुंच सकते हैं secretKey.intern().getClass().getClassLoader()
।
या JVM इस छेद को सुनिश्चित कर सकता है कि पूल में केवल ठोस स्ट्रिंग ऑब्जेक्ट्स (और कोई उपवर्ग) जोड़े गए हैं।
यदि समान को इस तरह लागू किया गया था SafeString
! = String
तब SafeString.intern
! = String.intern
, और SafeString
पूल में जोड़ा जाएगा। पूल <Class, String>
इसके बजाय एक पूल बन जाएगा <String>
और आप सभी को पूल में प्रवेश करने की आवश्यकता होगी एक ताजा क्लास लोडर होगा।