2013-02-22 17 views
9

जावा स्ट्रिंग्स अपरिवर्तनीय हैं, और एक ही मान के साथ कई स्ट्रिंग्स को तुरंत चालू करना एक ही ऑब्जेक्ट पॉइंटर देता है। (क्या इसके लिए कोई शब्द है? "पूलिंग" फिट लगता है, लेकिन यह पहले से ही कम तत्कालता करके समय बचाने के लिए कैशिंग कर रहा है।)क्या जावा अपरिवर्तनीय वस्तुओं को अनुकूलित करता है?

क्या जावा यह भी करता है (बिना किसी शब्द के) उपयोगकर्ता परिभाषित) कक्षाएं जो अपरिवर्तनीय हैं? क्या जावा यह भी पता लगा सकता है कि एक वर्ग अपरिवर्तनीय है, या यह स्ट्रिंग क्लास के लिए कुछ अद्वितीय है?

+0

+1 दिलचस्प सवाल। मेरा मानना ​​है कि जावा केवल अंतिम सदस्यों वाले वर्गों को पहचान सकता है और उन्हें अपरिवर्तनीय मान सकता है, लेकिन मेरे पास इसके बारे में कोई सटीक जानकारी नहीं है। मैं इस सवाल पर नजर रखूंगा। धन्यवाद – gd1

+2

यह नहीं है, और विचार करें कि क्या होगा यदि आपने प्रतिबिंब के साथ अपरिवर्तनीय वस्तु को बदल दिया है .. – harold

+0

मुझे लगता है, मैं इसके बारे में थोड़ा आश्चर्यचकित हूं। धन्यवाद – gd1

उत्तर

7

Wrt। स्ट्रिंग्स, जो शब्द आप खोज रहे हैं वह interning है।

जावा आपकी खुद की अपरिवर्तनीय वस्तुओं के लिए ऐसा नहीं करेगा। हालांकि, इसमें बॉक्स किए गए प्राइमेटिव के कैश संस्करण हैं। अधिक जानकारी के लिए इस आलेख को wrapper class caching पर देखें।

0

स्ट्रिंग इंटरनेशनल केवल स्ट्रिंग क्लास के लिए अद्वितीय है। मुझे लगता है कि JVM उपयोगकर्ता परिभाषित कक्षाओं के लिए इन नियमों को लागू नहीं करता है।

1

शब्द जो आप देख रहे हैं वह हैरिंग। जावा संकलन के दौरान "स्वचालित रूप से" तारों को अनुकूलित करता है और डेवलपर को रनटाइम पर ऐसा करने की संभावना देता है। (जेवीएम संस्करण पर निर्भर करते समय अनुकूलित किए गए विवरणों के बारे में विवरण।)

जहां तक ​​यह अपरिवर्तनीय वस्तुओं के लिए जाता है। मुझे नहीं लगता कि जावा किसी भी प्रकार की तंत्र का समर्थन करता है जो एक ही इंस्टेंस को हल करेगा। स्ट्रिंग प्रकार इस नियम का निष्पादन नहीं है।

कारण यह है कि, उदाहरण के लिए आपको ऑपरेटर new का उपयोग करना होगा। यदि आप स्ट्रिंग उदाहरण बनाने के लिए new का उपयोग करते हैं, तो आपको हमेशा दो अलग-अलग ऑब्जेक्ट मिलेंगे।

इंटरिंग केवल स्ट्रिंग प्रकार के लिए उपलब्ध है। लेकिन अवधारणा नि: शुल्क है, आप अपनी अपरिवर्तनीय कक्षा में ऐसी विधि जोड़ सकते हैं और एक शिकायत विधि लिख सकते हैं जो वही काम करेगी।

2

जैसा कि अन्य ने कहा है कि स्ट्रिंग्स के साथ इस प्रक्रिया को इंटर्निंग के रूप में जाना जाता है।

इसका उल्लेख है कि एक ही शाब्दिक मूल्यों का उद्देश्य एक ही होने के साथ तार के व्यवहार या जावा 7 में सच नहीं हो सकता हो सकता है 7 के बाद से मूल्य:

JDK 7 में, प्रशिक्षु तार नहीं रह रहे हैं जावा ढेर की स्थायी पीढ़ी में आवंटित, लेकिन इसके बजाय जावा ढेर (युवा और पुरानी पीढ़ियों के रूप में जाना जाता है) के मुख्य भाग में आवेदन के द्वारा बनाई गई अन्य वस्तुओं के साथ आवंटित किया जाता है। इस परिवर्तन के परिणामस्वरूप मुख्य जावा ढेर में अधिक डेटा और स्थायी पीढ़ी में कम डेटा होगा, और इस प्रकार ढेर आकारों को समायोजित करने की आवश्यकता हो सकती है। अधिकांश अनुप्रयोगों में इस परिवर्तन के कारण हीप उपयोग में केवल अपेक्षाकृत छोटे अंतर दिखाई देंगे, लेकिन बड़े अनुप्रयोग जो कई कक्षाएं लोड करते हैं या String.intern() विधि का भारी उपयोग करते हैं, वे अधिक महत्वपूर्ण अंतर देखेंगे।

इस पर पूर्ण विवरण के लिए Java SE 7 RFE पर एक नज़र डालें।

अपनी खुद की अपरिवर्तनीय वस्तुओं के संबंध में जावा उनके साथ कुछ भी विशेष नहीं करता है - यह नहीं जानता कि वे अपरिवर्तनीय हैं। यह इनलाइन तरीकों से अन्यथा की तुलना में थोड़ा अधिक हो सकता है यदि यह पता लगा सकता है कि यह इसके सार्थक/संभव है, लेकिन जहां तक ​​कंपाइलर और जेवीएम का संबंध है, वे एक और वस्तु हैं।

+2

वाह, डाउनवॉटेड? मैं एक डाउनवोट ले सकता हूं, लेकिन यह जानना अच्छा होगा कि क्यों –

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

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