मैं निम्नलिखित स्थिति है:सीधे सुलभ डेटा संरचना जावा
- एक डेटा संरचना है जो केवल कभी बढ़ाया जा सकता है (मैं ही कभी पूंछ में चीजों को जोड़ने)
- मैं रखने के लिए सक्षम होना चाहिए ट्रैक करें कि मेरे पास पहले से देखा गया है (मेरे पास एक इंडेक्स है, और आदर्श रूप से मैं इस विशेष तत्व से सूची को फिर से घुमाने में सक्षम होना चाहता हूं)
- मैं पढ़ना चाहता हूं कि कभी भी अवरुद्ध न हो और अतिरिक्त का नया तत्व केवल कभी भी लो की कतार की पूंछ पूरी कतार
यह एक संरचना है जिसे कई धागे द्वारा भारी रूप से संशोधित किया जाता है।
इसके लिए सबसे अच्छी डेटा संरचना क्या होगी?
ArrayList। इंडेक्स का उपयोग करके देखे गए अंतिम तत्व को सीधे एक्सेस करने में सक्षम होने के लिए यह आदर्श होगा, लेकिन यह समवर्ती संशोधन अपवादों की ओर जाता है। (के रूप में यह केवल एक ही जहां नए तत्वों को जोड़ने के समवर्ती राईट हो सकता है या किसी बहुत पिछले तत्व से अलग ताला लगा,) मैं इसे सिंक्रनाइज़ कर सकता है, लेकिन ताला लगा से बचने के लिए चाहते हैं
ConcurrentLinkedQueue। यह मेरी समवर्ती समस्या को हल करेगा, लेकिन समस्या है कि मुझे एक पूर्णांक सूचकांक की बजाय पुनरावृत्ति की वर्तमान स्थिति को स्टोर करना होगा। कुंजी के रूप में सूचकांक के साथ
ConcurrentHashMap: इस समस्या यह है कि यह एक कमजोर संगत iterator जो नई वस्तुओं है कि सूची में जोड़ा गया है के बाद से इटरेटर (जावाडोक स्रोत) बनाया गया था वापस करने के लिए गारंटी नहीं है देता है। इसका लाभ यह है कि मैं सीधे सही इंडेक्स से संबंधित डेटा तक पहुंच सकता हूं, लेकिन यह मुद्दा है कि "getNext" ऑपरेटर नहीं है जो मुझे इंडेक्स से सूचकांक, सूचकांक + 1, आदि
पर कुशलता से पार करने की अनुमति देगावेक्टर यह कुछ ऐसी समस्याओं को हल करने में मेरी समस्याओं का समाधान करेगा जो समवर्ती संशोधन अपवाद फेंक नहीं देंगे और सीधे पहुंच के लिए अनुमति देंगे। हालांकि, सभी विधियों को सिंक्रनाइज़ किया गया है, प्रदर्शन सरणीसूची की तुलना में खराब है। यह देखते हुए कि मैं केवल संरचना का विस्तार करना चाहता हूं, और बीच में रिकॉर्ड सम्मिलित नहीं करना चाहता, मैं इस भारी वजन समाधान के लिए जाने के लिए अनिच्छुक हूं, जहां पढ़ना भी एक प्रदर्शन हिट का सामना करना पड़ता है (जबकि, मेरे उपयोगकेस को देखते हुए, तत्व की अनुक्रमणिका वास्तव में कभी बदलता है, तो सिंक्रनाइज़ करने के लिए पढ़ता है कि पूंछ नहीं हैं)
कस्टम डेटा संरचना कोई आवश्यकता नहीं है: इस सरणी की पूंछ (पिछले तत्व के लिए वस्तुओं मैं संग्रहीत करना चाहते हैं की एक सरणी और एक सूचक रखने सेट करें), जब कोई नई ऑब्जेक्ट डालें, पूंछ को इंगित करें पूंछ और ऑब्जेक्ट को पूंछ से इंगित करें। जब ऑब्जेक्ट लॉकिंग आकार बदलने के लिए, अपने वर्तमान आकार से अधिक हो जाता है।
सबसे अच्छी रणनीति/कोई और अधिक कुशल कार्यान्वयन क्या होगा?
आप एक ArrayList के बजाय java.util.Vector का उपयोग कर सकते हैं। यह आपकी सिंक समस्याओं को हल करेगा। आपके शोध प्रयासों के लिए – sk2212
+1। –
@ user1018513 आपका क्या मतलब है "मुझे ट्रैक रखने में सक्षम होना चाहिए कि मैंने कौन से तत्व पहले ही देखे हैं"। क्या आप थोड़ा और समझा सकते हैं? – Eugene