2009-11-24 9 views
26

पहले मैं हमेशा सोचा था कि लंबाई अज्ञात होने पर गैर-वर्णित वस्तुओं के लिए उपयोग करने के लिए वेक्टर अच्छा था। जहां तक ​​मुझे पता था कि मैंने सोचा था कि यह थ्रेड-सुरक्षित भी थाjava.util.Vector - विकल्प

Vector को और क्या बदलना चाहिए, और विकल्प क्या है?

+1

यह उत्सुक है कि 'वेक्टर' को बहिष्कृत नहीं किया गया है। मुझे लगता है कि कोई भी एक प्रतिस्थापन नहीं है, इसलिए उन्होंने ऐसा नहीं किया है। – skaffman

+0

ध्यान दें कि यह हैशटेबल के बारे में भी सच है - इसके बजाय हैश मैप का उपयोग करें। –

+0

@ स्काफमैन 'CopyOnWriteArrayList' एक-एक-एक प्रतिस्थापन के रूप में कम या कम है क्योंकि यह थ्रेडसेफ' सूची' कार्यान्वयन है। अधिकांश उपयोगों के लिए, 'CopyOnWriteArrayList' को' वेक्टर ' –

उत्तर

35

आपको Vector के बजाय ArrayList का उपयोग करना चाहिए। Vector आंतरिक सिंक्रनाइज़ेशन का उपयोग किया जाता है, लेकिन वास्तविक स्थिरता के लिए यह शायद ही कभी पर्याप्त है, और जब वास्तव में इसकी आवश्यकता नहीं होती है तो केवल निष्पादन धीमा हो जाता है।

this stackoverflow question भी देखें।

+11

से बेहतर प्रदर्शन प्रदान करना चाहिए, शायद ही कभी "वास्तविक स्थिरता के लिए पर्याप्त" होने के बारे में अच्छा बिंदु। यदि एक संग्रह एकाधिक धागे के लिए दृश्यमान है, तो आपको शायद 'java.util.concurrent' से उचित संग्रह का उपयोग (और अच्छी तरह समझने) का उपयोग करना चाहिए। और यदि यह एकाधिक धागे तक पहुंच योग्य नहीं है, तो 'ऐरेलिस्ट' सस्ता है। ग्रे क्षेत्रों को हटा दें जहां एक संग्रह "हो सकता है" एकाधिक धागे द्वारा उपयोग किया जाता है: आप आंतरिक रूप से थ्रेड-सुरक्षित संग्रह नहीं कर सकते; इसके ग्राहक इसका उपयोग कैसे करते हैं हमेशा एक कारक है। – erickson

+0

आजकल, क्या आपको पता है कि वेक्टर में सुधार हुआ है या अगर हमें ऐरेलिस्ट के साथ रहना चाहिए? –

+1

@ AquariusPower अनुबंध निर्दिष्ट करता है कि इसे सिंक्रनाइज़ेशन का उपयोग करने की आवश्यकता है, इसलिए इसे वास्तव में सुधार नहीं किया जा सकता है। उस ने कहा, एक आधुनिक जेवीएम कभी-कभी सिंक्रनाइज़ेशन को ऑप्टिमाइज़ेशन के रूप में हटाने में सक्षम होगा, लेकिन सामान्य रूप से, यह ऐरेलिस्ट का उपयोग करना बेहतर होगा। –

7

ArrayList अब उपयोग करने के लिए बेहतर कक्षा है। Vector अब विरासत माना जाता है, और इसमें थ्रेड-सेफ होने का अतिरिक्त प्रदर्शन ओवरहेड है।

14

आप इसके बजाय ArrayList का उपयोग कर सकते हैं।

आप एक तुल्यकालन संस्करण की आवश्यकता है, तो आप की तरह कुछ कर सकते हैं:

ArrayList arrayList = new ArrayList(); 

List synchList = Collections.synchronizedList(arrayList); 
7

उपयोग ArrayList जब आप एक List कार्यान्वयन की जरूरत है, लेकिन धागा सुरक्षा की जरूरत नहीं है, और CopyOnWriteArrayList का उपयोग जब आप एक List कार्यान्वयन की जरूरत है कि धागा सुरक्षित है।

5

Vector जावा 1.0 से एक विरासत संग्रह कक्षा है। जावा 1.2 में (बहुत पहले!), Collections Framework जोड़ा गया था जिसमें ArrayList और HashMap जैसे नए संग्रह वर्ग शामिल थे, जिनका उद्देश्य विरासत कक्षा Vector और Hashtable को प्रतिस्थापित करना था।

जैसा कि पहले कहा गया था, विरासत संग्रह कक्षाओं में अंतर्निहित सिंक्रनाइज़ेशन था, जो कई अनुप्रयोगों के लिए अनावश्यक है। सिंक्रनाइज़ेशन में एक प्रदर्शन ओवरहेड होता है, इसलिए यदि यह आवश्यक नहीं है, तो आपको इसका उपयोग नहीं करना चाहिए।

कुछ मामलों में (जब आपका प्रोग्राम बहु-थ्रेडेड होता है, और एकाधिक थ्रेड एक ही डेटा तक पहुंचते हैं) तो आपको अपने संग्रह सिंक्रनाइज़ करने की आवश्यकता होती है। कुछ लोगों को तो पुराने Vector या Hashtable कक्षाओं का प्रयोग करेंगे, लेकिन एक बेहतर तरीका उदाहरण के लिए एक ArrayList के साथ एक तुल्यकालन आवरण का उपयोग करने के लिए है:

// Your standard, unsynchronized list 
List<String> data = new ArrayList<String>(); 

// Use this to put it into a synchronization wrapper 
List<String> syncedData = Collections.synchronizedList(data); 

अधिक जानकारी के लिए Collections.synchronizedList() (और अन्य तरीकों) की API दस्तावेज़ देखें।

+6

यदि आपको थ्रेड-सुरक्षित सूची की आवश्यकता है, तो CopyOnWriteArrayList Collections.synchronizedList (डेटा) –

+0

@ डोनल की तुलना में बेहतर प्रदर्शन (अधिकांश मामलों में) प्रदान करता है जो वास्तव में सच नहीं है। –

+0

@StefanReich कृपया विस्तृत करें –

संबंधित मुद्दे