दिलचस्प पोस्ट
सशर्त रूप से प्रदर्शित JSF घटकों एक चयनित राज्य के साथ एंड्रॉइड छवि बट्ट? पाठ फ़ाइल की पहली और अंतिम पंक्ति प्राप्त करने का सबसे कारगर तरीका क्या है? कैसे जावास्क्रिप्ट के साथ GetElementById के बजाय ElementByClass प्राप्त करने के लिए? जावास्क्रिप्ट – एक अन्य सरणी पर आधारित सॉर्ट सरणी सी # मैं कैसे जांच सकता हूँ कि कोई URL मौजूद है / मान्य है? JAXB: XJC- उत्पन्न वर्ग नामों को बदलने के लिए जब attr प्रकार XSD में निर्दिष्ट किया जाता है? कैसे सेट सीमित करने के लिए केवल "वैध" उपयोग करता है? एसक्यूएल: यदि खंड जहां भीतर होता है I bash: pip: कमांड नहीं मिला time.sleep – थ्रेड या प्रक्रिया सोता है? SQL सर्वर एकाधिक पंक्तियों में CSV को विभाजित करता है टूटी हुई फिक्स्ड कार्यान्वयन जावास्क्रिप्ट से कुकी की समाप्ति तिथि / निर्माण तिथि कैसे प्राप्त करें? आप jQuery में एक तत्व का चयन करें एक विशेष विकल्प कैसे चुनते हैं?

अपरिवर्तनीय बनाम अनमोडीएबलबल संग्रह

संग्रह फ्रेमवर्क अवलोकन से :

संग्रह जो संशोधन संचालन का समर्थन नहीं करते (जैसे कि add , remove और clear ) को अनमोडिफायबल के रूप में संदर्भित किया जाता है। संग्रह जो अनगॉडिएबल नहीं हैं, उन्हें बदलने योग्य हैं

संग्रह जो अतिरिक्त गारंटी देता है कि Collection ऑब्जेक्ट में कोई भी परिवर्तन दिखाई नहीं देगा, उन्हें अपरिवर्तनीय कहा जाता है। संग्रह जो अपरिवर्तनीय नहीं हैं, अस्थिर हैं

मुझे भेद समझ में नहीं आ रहा है।
असमाप्त और अपरिवर्तनीय यहाँ के बीच अंतर क्या है?

Solutions Collecting From Web of "अपरिवर्तनीय बनाम अनमोडीएबलबल संग्रह"

एक अनगॉडिएबल संग्रह अक्सर एक संशोधनीय संग्रह के आस-पास एक आवरण होता है, जो अन्य कोड के पास अब तक पहुंच हो सकती है । इसलिए जब आप केवल उसके लिए कोई भी बदलाव नहीं कर सकते हैं, तो आप उस सामग्री पर भरोसा नहीं कर सकते हैं जो न बदलते हैं।

एक अपरिवर्तनीय संग्रह गारंटी देता है कि कोई भी संग्रह को और भी बदल सकता है। यदि यह एक संशोधनीय संग्रह को लपेटता है, तो यह सुनिश्चित करता है कि कोई अन्य कोड उस संशोधनीय संग्रह तक पहुंच नहीं सकता है। ध्यान दें कि हालांकि कोई भी कोड परिवर्तित नहीं कर सकता है कि कौन से ऑब्जेक्ट्स के संग्रह में संदर्भ होता है, ऑब्जेक्ट स्वयं अब भी अस्थिर हो सकते हैं – StringBuilder का अपरिवर्तनीय संग्रह बनाने से उन वस्तुओं को "फ्रीज" नहीं किया जाता है

असल में, अंतर यह है कि क्या अन्य कोड आपकी पीठ के पीछे संग्रह को बदलने में सक्षम हो सकता है या नहीं।

असल रूप से unModifiable संग्रह एक दृश्य है, इसलिए अप्रत्यक्ष रूप से यह अभी भी कुछ unModifiable से 'संशोधित' हो सकता है जो कि बदलने योग्य है। साथ ही यह संग्रह के बारे में केवल एक पढ़ने योग्य दृश्य के रूप में, जब स्रोत संग्रह में परिवर्तन नहीं किया जाता है, तो हमेशा नवीनतम मानों के साथ पेश किया जाएगा।

हालांकि immutable संग्रह को एक और संग्रह की एक पठनीय प्रति के रूप में माना जा सकता है और संशोधित नहीं किया जा सकता है। इस मामले में जब स्रोत संग्रह बदलता है, अपरिवर्तनीय संग्रह परिवर्तनों को प्रतिबिंबित नहीं करता है

इस अंतर को देखने के लिए यहां एक टेस्टकेस है

 @Test public void testList() { List<String> modifiableList = new ArrayList<String>(); modifiableList.add("a"); System.out.println("modifiableList:"+modifiableList); System.out.println("--"); //unModifiableList assertEquals(1, modifiableList.size()); List<String> unModifiableList=Collections.unmodifiableList( modifiableList); modifiableList.add("b"); boolean exceptionThrown=false; try { unModifiableList.add("b"); fail("add supported for unModifiableList!!"); } catch (UnsupportedOperationException e) { exceptionThrown=true; System.out.println("unModifiableList.add() not supported"); } assertTrue(exceptionThrown); System.out.println("modifiableList:"+modifiableList); System.out.println("unModifiableList:"+unModifiableList); assertEquals(2, modifiableList.size()); assertEquals(2, unModifiableList.size()); System.out.println("--"); //immutableList List<String> immutableList=Collections.unmodifiableList( new ArrayList<String>(modifiableList)); modifiableList.add("c"); exceptionThrown=false; try { immutableList.add("c"); fail("add supported for immutableList!!"); } catch (UnsupportedOperationException e) { exceptionThrown=true; System.out.println("immutableList.add() not supported"); } assertTrue(exceptionThrown); System.out.println("modifiableList:"+modifiableList); System.out.println("unModifiableList:"+unModifiableList); System.out.println("immutableList:"+immutableList); System.out.println("--"); assertEquals(3, modifiableList.size()); assertEquals(3, unModifiableList.size()); assertEquals(2, immutableList.size()); } 

उत्पादन

 modifiableList:[a] -- unModifiableList.add() not supported modifiableList:[a, b] unModifiableList:[a, b] -- immutableList.add() not supported modifiableList:[a, b, c] unModifiableList:[a, b, c] immutableList:[a, b] -- 

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

ओरेकल के जावा कलेक्शन रेपर ट्यूटोरियल में यह कहना है (जोर दिया गया है):

अनमोडिफायबल रैपरर्स में दो मुख्य उपयोग हैं, निम्नानुसार:

  • एक बार इसे बनाए जाने के बाद एक संग्रह अपरिवर्तनीय बनाने के लिए इस मामले में, बैकिंग संग्रह के संदर्भ को बनाए रखने के लिए यह अच्छा अभ्यास है। यह बिल्कुल अपरिवर्तनीयता की गारंटी देता है
  • कुछ क्लाइंट को केवल-पढ़ने के लिए अपने डेटा संरचना तक पहुंचने की अनुमति देने के लिए आप बैकिंग संग्रह के संदर्भ को रखते हैं लेकिन आवरण के संदर्भ में हाथ डालते हैं। इस तरह, क्लाइंट देख सकते हैं, लेकिन संशोधित नहीं करते हैं, जबकि आप पूर्ण पहुंच बनाए रखते हैं

यदि हम Unmodifiable* बारे में बात कर रहे हैं, तो Immutable* बनाम Immutable* , वास्तव में अंतर प्रदर्शन में भी है। अपरिवर्तनीय संग्रह तेजी से और अधिक मेमोरी-कुशल हो सकते हैं यदि वे नियमित संग्रह के आसपास रैपर नहीं होते हैं (जेडीके कार्यान्वयन रैपर हैं)। अमरीकी टीम का हवाला देते हुए :

जेडीके संग्रह प्रदान करता है। अनमोडिफायैरएचईएफ़एक्स तरीके, लेकिन हमारी राय में, यह हो सकता है

<…>

  • अक्षम: डेटा संरचनाओं में अब भी सभी परिवर्तन किए गए हैं, जिसमें समवर्ती संशोधन चेक, हैश तालिका में अतिरिक्त स्थान आदि शामिल हैं।

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

अनमोडिफायबल रैपरर्स में दो मुख्य उपयोग हैं, निम्नानुसार:

एक बार इसे बनाए जाने के बाद एक संग्रह अपरिवर्तनीय बनाने के लिए इस मामले में, बैकिंग संग्रह के संदर्भ को बनाए रखने के लिए यह अच्छा अभ्यास है। यह बिल्कुल अपरिवर्तनीयता की गारंटी देता है

कुछ क्लाइंट को केवल-पढ़ने के लिए अपने डेटा संरचना तक पहुंचने की अनुमति देने के लिए आप बैकिंग संग्रह के संदर्भ को रखते हैं लेकिन आवरण के संदर्भ में हाथ डालते हैं। इस तरह, क्लाइंट देख सकते हैं, लेकिन संशोधित नहीं करते हैं, जबकि आप पूर्ण पहुंच बनाए रखते हैं।

यह वाकई इसे ऊपर बताता है

जैसा कि ऊपर उल्लिखित नहीं है, अपरिवर्तनीय नहीं है क्योंकि उदाहरण के लिए एक अनमॉडिएबल संग्रह को बदला जा सकता है, उदाहरण के लिए एक अनमॉडिएबल संग्रह में अंतर्निहित प्रतिनिधि संग्रह है जिसे किसी अन्य ऑब्जेक्ट द्वारा संदर्भित किया गया है और वह ऑब्जेक्ट इसे बदलता है

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

यह मानते हुए कि हम ऐसा कर सकते हैं, अवधारणा धागा सुरक्षित भी है। और आपको विश्वास हो सकता है कि अपरिवर्तनीय (या समय के साथ बदनाम नहीं) भी धागा सुरक्षित का अर्थ है हालांकि यह मामला नहीं है और यह मुख्य बिंदु है जो मैं यहाँ बना रहा हूं जो अभी तक अन्य उत्तर में नहीं लिखा गया है। मैं एक अपरिवर्तनीय वस्तु का निर्माण कर सकता हूं जो हमेशा एक ही परिणाम देता है अभी तक धागा सुरक्षित नहीं है यह मानने के लिए कि समय के साथ अतिरिक्त और विलोपन बनाए रखने के द्वारा मैं एक अपरिवर्तनीय संग्रह का निर्माण कर सकता हूं। अब अपरिवर्तनीय संग्रह आंतरिक तत्व (जो समय के साथ बदल सकता है) को देखकर अपने तत्वों को वापस देता है और फिर (आंतरिक) संग्रह के निर्माण के बाद जोड़े गए या हटाए गए तत्वों को जोड़ने और हटा रहा है। जाहिर है, हालांकि संग्रह हमेशा एक ही तत्व वापस करेगा, यह केवल धागा सुरक्षित नहीं है क्योंकि यह मूल्य कभी नहीं बदलेगा

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