2010-08-04 16 views
17

एक बार मैंने स्मृति में प्रदर्शन को बेहतर बनाने के लिए कुछ की वजह से एक स्ट्रिंग के लाभ के बारे में अध्ययन किया।स्ट्रिंग का अपरिवर्तनीय होने का क्या फायदा है?

क्या कोई मुझे यह समझा सकता है? मैं इसे इंटरनेट पर नहीं ढूंढ सकता।

+1

संभावित डुप्लिकेट [अपरिवर्तनीय द्वारा क्या मतलब है?] (Http://stackoverflow.com/questions/279507/what-is-meant-by-immutable)। जबकि उस प्रश्न का शीर्षक समान नहीं है, इसमें फायदे और नुकसान के बारे में एक सवाल शामिल है, जिसमें कम से कम एक उत्तर (इमेजिस्ट द्वारा) काफी अच्छी तरह से शामिल है। –

उत्तर

5

अपरिवर्तनीय तार कॉपी करने के लिए सस्ते हैं, क्योंकि आपको सभी डेटा कॉपी करने की आवश्यकता नहीं है - बस डेटा में संदर्भ या सूचक की प्रतिलिपि बनाएँ।

कई धागे में काम करने के लिए किसी भी प्रकार की अपरिवर्तनीय कक्षाएं काम करना आसान है, केवल सिंक्रनाइज़ेशन की आवश्यकता विनाश के लिए है।

9

विकल्प पर विचार करें। जावा में कोई कॉन्स क्वालीफायर नहीं है। यदि स्ट्रिंग ऑब्जेक्ट्स म्यूटेबल थे, तो स्ट्रिंग के संदर्भ में आप जिस विधि को संदर्भित करते हैं, उसमें स्ट्रिंग को संशोधित करने का दुष्प्रभाव हो सकता है। अपरिवर्तनीय तार रक्षात्मक प्रतियों की आवश्यकता को खत्म करते हैं, और प्रोग्राम त्रुटि के जोखिम को कम करते हैं।

34

अचल स्थिति (तार या अन्य प्रकार के लिए) कई फायदे हैं कर सकते हैं:,

  • यह यह आसान कोड के बारे में तर्क करने में आता है जब से तुम चर और तर्क के बारे में मान्यताओं कर सकते हैं कि आप अन्यथा नहीं कर सकते बनाना।
  • यह मल्टीथ्रेड प्रोग्रामिंग को सरल बनाता है क्योंकि परिवर्तन समवर्ती रूप से करने के लिए हमेशा सुरक्षित रहता है।
  • यह समान मानों को एक साथ संयुक्त करने और एकाधिक स्थानों से संदर्भित करने की अनुमति देकर स्मृति उपयोग में कमी की अनुमति देता है। जावा और सी # दोनों कोड में एम्बेडेड शाब्दिक तारों की स्मृति लागत को कम करने के लिए स्ट्रिंग इंटर्निंग करते हैं।
  • यह कुछ एल्गोरिदम के डिजाइन और कार्यान्वयन को सरल बनाता है (जैसे बैकट्रैकिंग या वैल्यू-स्पेस विभाजन को नियोजित करने वाले) क्योंकि पहले गणना की गई स्थिति को बाद में पुन: उपयोग किया जा सकता है।
  • अपरिवर्तनीयता कई कार्यात्मक प्रोग्रामिंग भाषाओं में एक आधारभूत सिद्धांत है - यह उत्परिवर्तन के अनुक्रम की बजाय कोड को एक प्रतिनिधित्व से दूसरे में परिवर्तन की श्रृंखला के रूप में देखने की अनुमति देता है।

अपरिवर्तनीय तार भी स्ट्रिंग्स को बफर के रूप में उपयोग करने के प्रलोभन से बचने में मदद करते हैं। सी/सी ++ कार्यक्रमों में कई दोष स्ट्रिंग मानों को लिखने या संशोधित करने के लिए नग्न चरित्र सरणी का उपयोग करने के परिणामस्वरूप बफर ओवररन समस्याओं से संबंधित हैं। एक परिवर्तनीय प्रकार के रूप में तारों का इलाज बफर मैनिपुलेशन के लिए उपयुक्त प्रकारों का उपयोग करने के लिए प्रोत्साहित करता है (देखें StringBuilder .NET या जावा में)।

+1

लेकिन यदि आप [कॉपी-ऑन-लिखित] (http://en.wikipedia.org/wiki/Copy-on-write) प्रतिमान का उपयोग करते हैं, तो आपके पास अपरिवर्तनीय तार * और * निजी प्रतियां और जगह-जगह के फायदे हैं संशोधन, यदि आवश्यक हो, उदाहरण के लिए तेजी से पार्सिंग के लिए। 'स्ट्रिंगबिल्डर 'एक कुशल ढेर-प्रबंधन प्रणाली से जुड़े गाय पैटर्न के संबंध में अपरिवर्तनीय स्ट्रिंग कॉन्सटेनेशन को धीमा करने और कम लाभ के लिए एक कामकाज है। गाय आपके बफर को सुरक्षित होने की अनुमति दे सकता है * और * एक ही समय में तेज़। –

+0

उन तर्कों में से कई तर्क निर्दिष्ट वस्तुओं की अपरिवर्तनीयता के साथ "कॉन्स्ट" पैरामीटर (जावा "फाइनल" के समान) भ्रमित करने लगते हैं। –

+0

@LBushkin, हालांकि आप अपने बुलेट बिंदुओं में कुछ अच्छे तर्क देते हैं, फिर भी "अपरिवर्तनीय तार भी इससे बचने में मदद करते हैं ..." अनुच्छेद एक भ्रामक है। स्ट्रिंगबिल्डर सी में बफर ओवरराइडिंग की तुलना में बिल्कुल अलग समस्या हल करता है - यह स्ट्रिंग कॉन्सटेनेशन के लिए सिर्फ अनुकूलन है, क्योंकि अपरिवर्तनीय तारों को संयोजित करना धीमा है - आपको दो नई ऑब्जेक्ट्स बनाने और प्रत्येक कॉन्सटेनेशन चरण के लिए सभी पात्रों की प्रतिलिपि बनाने की आवश्यकता है। – Alexey

0

एक आम पूल पर बैठे विभिन्न तारों के बारे में सोचें। स्ट्रिंग चर तब पूल में स्थानों को इंगित करते हैं। यदि आप स्ट्रिंग वैरिएबल की प्रतिलिपि बनाते हैं, तो मूल और कॉपी समान वर्ण साझा करते हैं। सबस्ट्रिंग्स और concatenating निकालने के द्वारा साझा करने की ये दक्षता स्ट्रिंग संपादन की अक्षमता से अधिक है।

0

ए) स्ट्रिंगपूल सुविधा को स्ट्रिंग अपरिवर्तनीय बनाये बिना कल्पना करें, यह संभव नहीं है क्योंकि स्ट्रिंग पूल के मामले में एक स्ट्रिंग ऑब्जेक्ट/शाब्दिक उदा। "टेस्ट" ने कई संदर्भ चरों से संदर्भित किया है, इसलिए यदि उनमें से कोई भी मूल्य बदलता है तो अन्य स्वचालित रूप से प्रभावित हो जाएंगे यानी स्ट्रिंग ए = "टेस्ट" और स्ट्रिंग बी = "टेस्ट" अब स्ट्रिंग बी को "टेस्ट" कहा जाता है .toUpperCase() जो एक ही ऑब्जेक्ट को "टेस्ट" में बदलता है, इसलिए ए भी "टेस्ट" होगा जो वांछनीय नहीं है।
बी) जावा में क्यों स्ट्रिंग का अपरिवर्तनीय कारण है, स्ट्रिंग को अपने हैशकोड को कैश करने की अनुमति देना है, जावा में अपरिवर्तनीय स्ट्रिंग अपने हैश कोड को कैश करता है और हर बार जब हम स्ट्रिंग के हैशकोड विधि को कॉल करते हैं तो इसकी गणना नहीं करते हैं, जो इसे बहुत तेज बनाता है हैशपैप कुंजी

0

शायद, मेरा उत्तर पुराना है, लेकिन शायद किसी को यहां एक नई जानकारी मिलेगी।

क्यों जावा स्ट्रिंग अपरिवर्तनीय है और क्यों यह अच्छा है:

  • आप धागे के बीच एक स्ट्रिंग साझा कर सकते हैं और यह सुनिश्चित करने के कोई भी स्ट्रिंग बदल जाएगा हो सकता है और भ्रमित एक और धागा
  • भी नहीं पड़ेगी एक ताला की जरूरत है। कई धागे संघर्ष के बिना अपरिवर्तनीय तार के साथ काम कर सकते हैं
  • अगर आप सिर्फ एक स्ट्रिंग प्राप्त किया, आप सुनिश्चित करें कि कोई एक के बाद कि
  • अपने मूल्य बदल जाएगा आप कई स्ट्रिंग डुप्लिकेट हो सकता है हो सकता है - वे एक उदाहरण की ओर इशारा किया जाएगा, सिर्फ एक प्रतिलिपि के लिए। यह कंप्यूटर मेमोरी (रैम)
  • सहेजता है, आप प्रतिलिपि किए बिना सबस्ट्रिंग कर सकते हैं, - मौजूदा स्ट्रिंग के तत्व में पॉइंटर बनाकर। यही कारण है कि जावा-स्ट्रिंग आपरेशन कार्यान्वयन इतनी तेजी से
  • अपरिवर्तनीय तार (वस्तुओं) काफी बेहतर उन्हें हैश तालिका में कुंजी
0

मूलरूप के रूप में उपयोग करने के लिए अनुकूल हैं है, अगर एक वस्तु या विधि एक और को जानकारी भेजने की इच्छा

  1. यह एक परिवर्तनशील वस्तु जो जानकारी है, और जो प्राप्तकर्ता का वादा संशोधित करने के लिए कभी नहीं के लिए एक संदर्भ दे सकते हैं:, वहाँ कुछ तरीके यह यह कर सकते हैं कर रहे हैं।

  2. यह किसी ऑब्जेक्ट का संदर्भ दे सकता है जिसमें डेटा है, लेकिन जिसकी सामग्री पर इसकी परवाह नहीं है।

  3. यह जानकारी को एक म्यूटेबल ऑब्जेक्ट में संग्रहीत कर सकता है जिसका इच्छित डेटा प्राप्तकर्ता जानता है (आमतौर पर उस डेटा प्राप्तकर्ता द्वारा प्रदान किया जाता है)।

  4. यह जानकारी युक्त एक अपरिवर्तनीय वस्तु का संदर्भ वापस कर सकता है।

इन तरीकों में से # 4 अब तक का सबसे आसान है। कई मामलों में, म्यूटेबल ऑब्जेक्ट्स को अपरिवर्तनीय लोगों के साथ काम करना आसान होता है, लेकिन "अविश्वसनीय" कोड के साथ साझा करने का कोई आसान तरीका नहीं है जो जानकारी को किसी अन्य चीज़ पर प्रतिलिपि किए बिना किसी म्यूटेबल ऑब्जेक्ट में मौजूद जानकारी के साथ साझा करने का कोई आसान तरीका नहीं है। इसके विपरीत, एक अपरिवर्तनीय ऑब्जेक्ट में रखी गई जानकारी जिसमें कोई संदर्भ धारण करता है उसे आसानी से उस संदर्भ की एक प्रति साझा करके साझा किया जा सकता है।