java - जावा वेक्टर क्लास अप्रचलित या बहिष्कृत क्यों माना जाता है?
vector stack (4)
जावा वेक्टर को विरासत वर्ग क्यों माना जाता है, अप्रचलित या बहिष्कृत?
समरूपता के साथ काम करते समय इसका उपयोग वैध नहीं है?
और यदि मैं ऑब्जेक्ट्स को मैन्युअल रूप से सिंक्रनाइज़ नहीं करना चाहता हूं और केवल अंतर्निहित सरणी (जैसे CopyOnWriteArrayList
करता है) की ताजा प्रतियां बनाने के बिना थ्रेड-सुरक्षित संग्रह का उपयोग करना चाहते हैं, तो क्या Vector
का उपयोग करना ठीक है?
Stack
बारे में क्या, जो Vector
उप-वर्ग है, इसके बजाय मुझे इसका क्या उपयोग करना चाहिए?
आप गैर-थ्रेड सुरक्षित से थ्रेड सुरक्षित संग्रह प्राप्त करने के लिए java.util.Collection
पर synchronizedCollection/List विधि का उपयोग कर सकते हैं।
वेक्टर 1.0 का हिस्सा था - मूल कार्यान्वयन में दो दोष थे:
1. नामकरण: वैक्टर वास्तव में केवल सूचियां हैं जिन्हें सरणी के रूप में एक्सेस किया जा सकता है, इसलिए इसे ArrayList
कहा जाना चाहिए (जो Vector
लिए जावा 1.2 संग्रह प्रतिस्थापन है)।
2. Concurrency: सभी get()
, set()
विधियों को synchronized
, इसलिए आप synchronized
पर ठीक दाग नियंत्रण नहीं कर सकते हैं।
ArrayList
और Vector
बीच बहुत अंतर नहीं है, लेकिन आपको ArrayList
उपयोग करना चाहिए।
एपीआई दस्तावेज़ से।
जावा 2 प्लेटफार्म v1.2 के रूप में, इस वर्ग को सूची इंटरफ़ेस को लागू करने के लिए पुन: स्थापित किया गया था, जिससे इसे जावा संग्रह फ्रेमवर्क का सदस्य बना दिया गया था। नए संग्रह कार्यान्वयन के विपरीत, वेक्टर सिंक्रनाइज़ किया गया है।
Vector
प्रत्येक व्यक्तिगत ऑपरेशन पर सिंक्रनाइज़ करता है। यह लगभग कभी नहीं है जो आप करना चाहते हैं।
आम तौर पर आप संचालन के पूरे अनुक्रम को सिंक्रनाइज़ करना चाहते हैं। व्यक्तिगत संचालन को सिंक्रनाइज़ करना दोनों कम सुरक्षित है (उदाहरण के लिए, यदि आप एक Vector
पर फिर से चलते हैं, तो आपको एक ही समय में संग्रह को बदलने वाले किसी और से बचने के लिए लॉक निकालना होगा, जिससे पुनरावृत्ति थ्रेड में एक ConcurrentModificationException
मोडिफिकेशन एक्सेप्शन होगा) लेकिन यह भी धीमा (एक बार बार पर्याप्त रूप से लॉक क्यों लेंगे)?
बेशक, जब आपको आवश्यकता नहीं होती है तब भी लॉकिंग का ओवरहेड होता है।
असल में, यह ज्यादातर स्थितियों में सिंक्रनाइज़ेशन के लिए एक बहुत ही दोषपूर्ण दृष्टिकोण है। जैसा कि श्री ब्रायन हेनक ने बताया, आप संग्रह। सिंक्रनाइज़लिस्ट सूची जैसे कॉल का उपयोग करके संग्रह को सजाने के लिए कर सकते हैं - तथ्य यह है कि Vector
"हर ऑपरेशन सिंक्रनाइज़" बिट के साथ "आकार बदलकर सरणी" संग्रह कार्यान्वयन दोनों को जोड़ता है, खराब डिजाइन का एक और उदाहरण है; सजावट दृष्टिकोण चिंताओं के क्लीनर अलगाव देता है।
एक Stack
समकक्ष के रूप में - मैं शुरू करने के लिए ArrayDeque
/ ArrayDeque
।
java.util.Stack
के सिंक्रनाइज़ेशन ओवरहेड को विरासत में लेता है, जिसे आमतौर पर उचित नहीं माना जाता है।
हालांकि, इससे कहीं अधिक विरासत प्राप्त होती है। तथ्य यह है कि java.util.Stack extends java.util.Vector
ऑब्जेक्ट उन्मुख डिज़ाइन में एक गलती है। पुरीस्ट ध्यान देंगे कि यह परंपरागत रूप से एक ढेर (अर्थात्: पुश, पॉप, पीक, आकार) से जुड़े संचालन से परे कई तरीकों की पेशकश करता है। search
, elementAt
, setElementAt
, remove
, और कई अन्य यादृच्छिक-अभिगम संचालन करना भी संभव है। स्टैक के गैर-स्टैक ऑपरेशंस का उपयोग करने से बचने के लिए यह मूल रूप से उपयोगकर्ता तक है।
इन प्रदर्शनों और ArrayDeque
डिजाइन कारणों के लिए, ArrayDeque
लिए JavaDoc प्राकृतिक प्रतिस्थापन के रूप में ArrayDeque
की सिफारिश करता है। (एक डेक एक ढेर से अधिक है, लेकिन कम से कम यह सब कुछ यादृच्छिक पहुंच प्रदान करने के बजाय, दोनों सिरों में हेरफेर करने के लिए प्रतिबंधित है।)