मैंने एक एकल-लिंक्ड सूची लिखने का फैसला किया, और आंतरिक लिंक्ड नोड संरचना को अपरिवर्तनीय बनाने के लिए योजना चल रही थी।
मैं हालांकि एक रोड़ा में भाग गया। कहो कि मेरे पास निम्नलिखित लिंक नोड्स हैं (पिछले add
ऑपरेशन से):
1 -> 2 -> 3 -> 4
और कहते हैं कि मैं एक append करना चाहते हैं 5
।
ऐसा करने के लिए, चूंकि नोड 4
अपरिवर्तनीय है, मुझे इसकी एक नई प्रति बनाने की आवश्यकता है 4
, लेकिन इसके next
क्षेत्र को एक नए नोड के साथ बदलें 5
। समस्या अब है, 3
पुराने को संदर्भित कर रहा है 4
; बिना एप्लाइड वाला 5
। अब मुझे कॉपी का संदर्भ 3
लेने की आवश्यकता है , और कॉपी next
को संदर्भित करने के लिए इसके क्षेत्र को बदलना 4
है, लेकिन अब 2
पुराने को संदर्भित कर रहा है 3
...
या दूसरे शब्दों में, एक परिशिष्ट करने के लिए, पूरी सूची की प्रतिलिपि बनाने की आवश्यकता लगती है।
मेरे सवाल:
क्या मेरी सोच सही है? क्या संपूर्ण संरचना की नकल के बिना एक परिशिष्ट करने का कोई तरीका है?
जाहिरा तौर पर "प्रभावी जावा" में शामिल हैं:
जब तक वहाँ एक बहुत अच्छा कारण नहीं है कि उन्हें उत्परिवर्तित करने के लिए कक्षाएं अपरिवर्तनीय होनी चाहिए ...
क्या यह पारस्परिकता के लिए एक अच्छा मामला है?
मुझे नहीं लगता कि यह सुझाए गए उत्तर की नकल है क्योंकि मैं सूची के बारे में बात नहीं कर रहा हूं; यह स्पष्ट रूप से इंटरफेस के अनुरूप है (नई सूची को आंतरिक रूप से रखने और इसे पाने वाले की तरह पुनः प्राप्त करने के बिना कुछ करने के बिना, दूसरे विचार पर, हालांकि, यहां तक कि कुछ उत्परिवर्तन की आवश्यकता होगी; यह सिर्फ एक न्यूनतम तक रखा जाएगा)। मैं इस बारे में बात कर रहा हूं कि सूची के आंतरिक लोगों को अपरिवर्तनीय होना चाहिए या नहीं।
CopyOnWritexxx
बहु-थ्रेडिंग के लिए उपयोग किए जाने वाले अविश्वसनीय रूप से महंगे वर्ग हैं। किसी को भी उम्मीद नहीं है कि संग्रह वास्तव में अपरिवर्तनीय होगा (हालाँकि यह कुछ विचित्रता पैदा करता है)