एक बार मैंने स्मृति में प्रदर्शन को बेहतर बनाने के लिए कुछ की वजह से एक स्ट्रिंग के लाभ के बारे में अध्ययन किया।स्ट्रिंग का अपरिवर्तनीय होने का क्या फायदा है?
क्या कोई मुझे यह समझा सकता है? मैं इसे इंटरनेट पर नहीं ढूंढ सकता।
एक बार मैंने स्मृति में प्रदर्शन को बेहतर बनाने के लिए कुछ की वजह से एक स्ट्रिंग के लाभ के बारे में अध्ययन किया।स्ट्रिंग का अपरिवर्तनीय होने का क्या फायदा है?
क्या कोई मुझे यह समझा सकता है? मैं इसे इंटरनेट पर नहीं ढूंढ सकता।
अपरिवर्तनीय तार कॉपी करने के लिए सस्ते हैं, क्योंकि आपको सभी डेटा कॉपी करने की आवश्यकता नहीं है - बस डेटा में संदर्भ या सूचक की प्रतिलिपि बनाएँ।
कई धागे में काम करने के लिए किसी भी प्रकार की अपरिवर्तनीय कक्षाएं काम करना आसान है, केवल सिंक्रनाइज़ेशन की आवश्यकता विनाश के लिए है।
विकल्प पर विचार करें। जावा में कोई कॉन्स क्वालीफायर नहीं है। यदि स्ट्रिंग ऑब्जेक्ट्स म्यूटेबल थे, तो स्ट्रिंग के संदर्भ में आप जिस विधि को संदर्भित करते हैं, उसमें स्ट्रिंग को संशोधित करने का दुष्प्रभाव हो सकता है। अपरिवर्तनीय तार रक्षात्मक प्रतियों की आवश्यकता को खत्म करते हैं, और प्रोग्राम त्रुटि के जोखिम को कम करते हैं।
अचल स्थिति (तार या अन्य प्रकार के लिए) कई फायदे हैं कर सकते हैं:,
अपरिवर्तनीय तार भी स्ट्रिंग्स को बफर के रूप में उपयोग करने के प्रलोभन से बचने में मदद करते हैं। सी/सी ++ कार्यक्रमों में कई दोष स्ट्रिंग मानों को लिखने या संशोधित करने के लिए नग्न चरित्र सरणी का उपयोग करने के परिणामस्वरूप बफर ओवररन समस्याओं से संबंधित हैं। एक परिवर्तनीय प्रकार के रूप में तारों का इलाज बफर मैनिपुलेशन के लिए उपयुक्त प्रकारों का उपयोग करने के लिए प्रोत्साहित करता है (देखें StringBuilder
.NET या जावा में)।
लेकिन यदि आप [कॉपी-ऑन-लिखित] (http://en.wikipedia.org/wiki/Copy-on-write) प्रतिमान का उपयोग करते हैं, तो आपके पास अपरिवर्तनीय तार * और * निजी प्रतियां और जगह-जगह के फायदे हैं संशोधन, यदि आवश्यक हो, उदाहरण के लिए तेजी से पार्सिंग के लिए। 'स्ट्रिंगबिल्डर 'एक कुशल ढेर-प्रबंधन प्रणाली से जुड़े गाय पैटर्न के संबंध में अपरिवर्तनीय स्ट्रिंग कॉन्सटेनेशन को धीमा करने और कम लाभ के लिए एक कामकाज है। गाय आपके बफर को सुरक्षित होने की अनुमति दे सकता है * और * एक ही समय में तेज़। –
उन तर्कों में से कई तर्क निर्दिष्ट वस्तुओं की अपरिवर्तनीयता के साथ "कॉन्स्ट" पैरामीटर (जावा "फाइनल" के समान) भ्रमित करने लगते हैं। –
@LBushkin, हालांकि आप अपने बुलेट बिंदुओं में कुछ अच्छे तर्क देते हैं, फिर भी "अपरिवर्तनीय तार भी इससे बचने में मदद करते हैं ..." अनुच्छेद एक भ्रामक है। स्ट्रिंगबिल्डर सी में बफर ओवरराइडिंग की तुलना में बिल्कुल अलग समस्या हल करता है - यह स्ट्रिंग कॉन्सटेनेशन के लिए सिर्फ अनुकूलन है, क्योंकि अपरिवर्तनीय तारों को संयोजित करना धीमा है - आपको दो नई ऑब्जेक्ट्स बनाने और प्रत्येक कॉन्सटेनेशन चरण के लिए सभी पात्रों की प्रतिलिपि बनाने की आवश्यकता है। – Alexey
एक आम पूल पर बैठे विभिन्न तारों के बारे में सोचें। स्ट्रिंग चर तब पूल में स्थानों को इंगित करते हैं। यदि आप स्ट्रिंग वैरिएबल की प्रतिलिपि बनाते हैं, तो मूल और कॉपी समान वर्ण साझा करते हैं। सबस्ट्रिंग्स और concatenating निकालने के द्वारा साझा करने की ये दक्षता स्ट्रिंग संपादन की अक्षमता से अधिक है।
ए) स्ट्रिंगपूल सुविधा को स्ट्रिंग अपरिवर्तनीय बनाये बिना कल्पना करें, यह संभव नहीं है क्योंकि स्ट्रिंग पूल के मामले में एक स्ट्रिंग ऑब्जेक्ट/शाब्दिक उदा। "टेस्ट" ने कई संदर्भ चरों से संदर्भित किया है, इसलिए यदि उनमें से कोई भी मूल्य बदलता है तो अन्य स्वचालित रूप से प्रभावित हो जाएंगे यानी स्ट्रिंग ए = "टेस्ट" और स्ट्रिंग बी = "टेस्ट" अब स्ट्रिंग बी को "टेस्ट" कहा जाता है .toUpperCase() जो एक ही ऑब्जेक्ट को "टेस्ट" में बदलता है, इसलिए ए भी "टेस्ट" होगा जो वांछनीय नहीं है।
बी) जावा में क्यों स्ट्रिंग का अपरिवर्तनीय कारण है, स्ट्रिंग को अपने हैशकोड को कैश करने की अनुमति देना है, जावा में अपरिवर्तनीय स्ट्रिंग अपने हैश कोड को कैश करता है और हर बार जब हम स्ट्रिंग के हैशकोड विधि को कॉल करते हैं तो इसकी गणना नहीं करते हैं, जो इसे बहुत तेज बनाता है हैशपैप कुंजी
शायद, मेरा उत्तर पुराना है, लेकिन शायद किसी को यहां एक नई जानकारी मिलेगी।
क्यों जावा स्ट्रिंग अपरिवर्तनीय है और क्यों यह अच्छा है:
मूलरूप के रूप में उपयोग करने के लिए अनुकूल हैं है, अगर एक वस्तु या विधि एक और को जानकारी भेजने की इच्छा
यह एक परिवर्तनशील वस्तु जो जानकारी है, और जो प्राप्तकर्ता का वादा संशोधित करने के लिए कभी नहीं के लिए एक संदर्भ दे सकते हैं:, वहाँ कुछ तरीके यह यह कर सकते हैं कर रहे हैं।
यह किसी ऑब्जेक्ट का संदर्भ दे सकता है जिसमें डेटा है, लेकिन जिसकी सामग्री पर इसकी परवाह नहीं है।
यह जानकारी को एक म्यूटेबल ऑब्जेक्ट में संग्रहीत कर सकता है जिसका इच्छित डेटा प्राप्तकर्ता जानता है (आमतौर पर उस डेटा प्राप्तकर्ता द्वारा प्रदान किया जाता है)।
यह जानकारी युक्त एक अपरिवर्तनीय वस्तु का संदर्भ वापस कर सकता है।
इन तरीकों में से # 4 अब तक का सबसे आसान है। कई मामलों में, म्यूटेबल ऑब्जेक्ट्स को अपरिवर्तनीय लोगों के साथ काम करना आसान होता है, लेकिन "अविश्वसनीय" कोड के साथ साझा करने का कोई आसान तरीका नहीं है जो जानकारी को किसी अन्य चीज़ पर प्रतिलिपि किए बिना किसी म्यूटेबल ऑब्जेक्ट में मौजूद जानकारी के साथ साझा करने का कोई आसान तरीका नहीं है। इसके विपरीत, एक अपरिवर्तनीय ऑब्जेक्ट में रखी गई जानकारी जिसमें कोई संदर्भ धारण करता है उसे आसानी से उस संदर्भ की एक प्रति साझा करके साझा किया जा सकता है।
संभावित डुप्लिकेट [अपरिवर्तनीय द्वारा क्या मतलब है?] (Http://stackoverflow.com/questions/279507/what-is-meant-by-immutable)। जबकि उस प्रश्न का शीर्षक समान नहीं है, इसमें फायदे और नुकसान के बारे में एक सवाल शामिल है, जिसमें कम से कम एक उत्तर (इमेजिस्ट द्वारा) काफी अच्छी तरह से शामिल है। –