ArrayList और वेक्टर के बीच अंतर क्या हैं?


352

दो डेटा संरचनाओं ArrayList और वेक्टर के बीच अंतर क्या हैं , और आपको उनमें से प्रत्येक का उपयोग कहां करना चाहिए?


5
मैं यहां सटीक डुप्लिकेट नहीं देख रहा हूं।
जेफ एटवुड

2
खैर, आप जावा में वैक्टर भी बना सकते हैं - Vector v = new Vector(3, 2);
sgsi

कभी भी उपयोग Vector, उपयोग ArrayListया LinkedListयाArrayDeque

जवाबों:


365

मतभेद

  • वैक्टर सिंक्रनाइज़ किए जाते हैं, ArrayLists नहीं हैं।
  • डेटा ग्रोथ के तरीके

यदि वैक्टर का उपयोग करने की कोई विशेष आवश्यकता नहीं है, तो ArrayLists का उपयोग करें।

तादात्म्य

यदि कई सूत्र एक ArrayList को समवर्ती रूप से एक्सेस करते हैं, तो हमें बाह्य रूप से कोड के ब्लॉक को सिंक्रनाइज़ करना होगा जो सूची को संरचनात्मक रूप से संशोधित करता है या बस एक तत्व को संशोधित करता है। संरचनात्मक संशोधन का अर्थ है सूची से तत्व (ओं) को जोड़ना या हटाना। किसी मौजूदा तत्व का मान सेट करना एक संरचनात्मक संशोधन नहीं है।

Collections.synchronizedList आम तौर पर सूची के निर्माण के समय उपयोग किया जाता है ताकि सूची में किसी भी आकस्मिक असम्बद्ध उपयोग से बचा जा सके।

संदर्भ

डेटा की वृद्धि

आंतरिक रूप से, ArrayList और वेक्टर दोनों एक Array का उपयोग करके अपनी सामग्री पर पकड़ रखते हैं। जब एक तत्व को एक ArrayList या वेक्टर में डाला जाता है, तो ऑब्जेक्ट को कमरे से बाहर चलाने पर अपने आंतरिक सरणी का विस्तार करने की आवश्यकता होगी। एक वेक्टर अपने सरणी के आकार को दोगुना करने के लिए चूकता है, जबकि ArrayList अपने सरणी आकार को 50 प्रतिशत बढ़ाता है।

संदर्भ


7
@ रेई वास्तव में उन्होंने क्या कहा: एकाधिक सूत्र ( docs.oracle.com/javase/tutorial/essential/concurrency/… )
RecursiveExceptionException

एक बहुरंगी तरीके से एक ArrayList से काम करने के बारे में क्या? क्या वह धागा सुरक्षित है?
Xunie

@Xunie ArrayList या अन्य संग्रह कक्षाओं से पढ़ना कभी एक समस्या नहीं है। समस्या तब उत्पन्न होती है जब आप मौजूदा मानों को ArrayList या संग्रह में जोड़ या हटा या संशोधित कर रहे होते हैं।
साईनाथ रेड्डी

85

जैसा कि प्रलेखन कहता है, ए Vectorऔर ए ArrayListलगभग बराबर हैं। अंतर यह है कि एक तक पहुँच को Vectorसिंक्रनाइज़ किया जाता है, जबकि एक तक पहुंच ArrayListनहीं है। इसका मतलब यह है कि Vectorएक समय में केवल एक धागा तरीकों को कॉल कर सकता है , और लॉक प्राप्त करने में एक मामूली ओवरहेड है; यदि आप एक का उपयोग करते हैं ArrayList, तो यह मामला नहीं है। आम तौर पर, आप एक का उपयोग करना चाहते हैं ArrayList; एकल-थ्रेडेड मामले में यह एक बेहतर विकल्प है, और बहु-थ्रेडेड मामले में, आपको लॉकिंग पर बेहतर नियंत्रण मिलता है। समवर्ती पठन की अनुमति देना चाहते हैं? ठीक। दस लिखने के एक बैच के लिए एक तुल्यकालन प्रदर्शन करना चाहते हैं? भी ठीक। यह आपके अंत पर थोड़ी अधिक देखभाल की आवश्यकता है, लेकिन यह संभावना है कि आप क्या चाहते हैं। यह भी ध्यान दें कि यदि आपके पास एक ArrayList है, तो आप इसका उपयोग कर सकते हैंCollections.synchronizedListएक सिंक्रनाइज़ सूची बनाने के लिए फ़ंक्शन, इस प्रकार आप एक के बराबर हो रही है Vector


53

Vectorएक टूटा हुआ वर्ग है जो थ्रेडसेफ़ नहीं है , इसके बावजूद इसे "सिंक्रनाइज़" किया जाता है और इसका उपयोग केवल छात्रों और अन्य अनुभवहीन प्रोग्रामर द्वारा किया जाता है।

ArrayList पेशेवरों और अनुभवी प्रोग्रामरों द्वारा उपयोग की जाने वाली सूची-सूची है।

थ्रेडसेफ़ सूची कार्यान्वयन के इच्छुक पेशेवर इसका उपयोग करते हैं CopyOnWriteArrayList


10
सिंक्रनाइज़ है, लेकिन थ्रेडसेफ़ नहीं है? इसका क्या मतलब है? [मैं शुरुआत कर रहा हूं]
दिनेशकुमार

13
@ दिनेशकुमार Vectorका इरादा थ्रेडसेफ़ था , लेकिन इसमें एक डिज़ाइन दोष है जो इसे बनाता है * वास्तव में थ्रेडसेफ़ नहीं, यह मूल रूप से एक पदावनत वर्ग है। किसी कारण से, विश्वविद्यालयों आदि ने इस खबर के बारे में नहीं सुना है और अभी भी इसके उपयोग की वकालत करते हैं।
बोहेमियन

1
@Dineshkumar देखना यह quesion
बोहेमियन

3
@ दिनेशकुमार क्षमा करें - यह एक अच्छी कड़ी नहीं थी। यहाँ एक निश्चित जवाब है । संक्षेप में, इसका सिंक्रनाइज़ेशन बेकार है।
बोहेमियन

7
मजेदार तथ्य: Java1.7 का स्टैक वेक्टर क्लास का उपयोग करता है।
तोबी

26

ArrayList नया है और 20-30% तेज है।

यदि आपको कुछ स्पष्ट रूप से स्पष्ट नहीं है Vector, तो उपयोग करेंArrayList


32
क्या आप इसका प्रमाण देकर दावे का समर्थन कर सकते हैं 20-30% faster?
उपयोगकर्ता

5
@user उस समय यह विशाल सरणियों को समेटते हुए बस व्यक्तिगत अनुभव था। अब तीन साल से अधिक समय से, मैं आपको ठीक-ठीक नहीं बता सकता कि मैं किस बारे में बात कर रहा था लेकिन वहाँ बहुत सारे बेंचमार्क हैं। यह थ्रेडिंग तक नहीं है जहां आप सबसे बड़ी छलांग देखते हैं, लेकिन यहां एक है: javacodegeeks.com/2010/08/…
Oli

20-30% केवल मेल खाते हैं, यदि आप वेक्टर / Arraylist को पढ़ते हैं और लिखते हैं, क्योंकि वृद्धि फ़ंक्शन सबसे बड़ा प्रभाव डालेगा। यदि आपके पास एक बेंचमार्क है जो केवल एक बार लिखता है और फिर पढ़ता है केवल एक अलग परिणाम देगा
तोबी

2
कृपया अपने डेटा के लिए एक सबूत प्रदान करें
wiredmark

चूंकि वेक्टर सिंक्रनाइज़ किया गया है और सरणी सूची सिंक्रनाइज़ नहीं है, यह एक कारण हो सकता है, सरणी सूची वेक्टर की तुलना में तेज होती है।
ASK

23

वेक्टर और एरेइलिस्ट के बीच 2 प्रमुख भेदभाव हैं।

  1. वेक्टर डिफ़ॉल्ट रूप से सिंक्रनाइज़ है, और ArrayList नहीं है। नोट: आप ArrayList को भी संग्रहित ऑब्जेक्ट द्वारा संग्रहित करके संग्रहित कर सकते हैं। SynchronizedList () विधि। सिंक्रोनाइज़्ड साधन: इसका उपयोग किसी भी साइड इफेक्ट के साथ कई थ्रेड्स के साथ किया जा सकता है।

  2. ArrayLists पिछले आकार का 50% बढ़ जाता है जब अंतरिक्ष नए तत्व के लिए पर्याप्त नहीं होता है, जहां वेक्टर पिछले आकार के 100% तक बढ़ जाएगा जब नए आने वाले तत्व के लिए कोई स्थान नहीं होता है।

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

  1. वेक्टर से किसी विशेष स्थान पर तत्व प्राप्त करने के लिए हम एलिमेंट (इंट इंडेक्स) फ़ंक्शन का उपयोग करते हैं। यह फ़ंक्शन नाम बहुत लंबा है। ArrayList में इस के स्थान पर हमारे पास मिलता है (पूर्णांक सूचकांक), जो बहुत ही आसान याद करने के लिए और उपयोग करने के लिए है।
  2. इसी तरह वेक्टर में एक नए तत्व के साथ एक मौजूदा तत्व को बदलने के लिए हम सेटएलेटमेंट () पद्धति का उपयोग करते हैं , जो फिर से बहुत लंबा है और बार-बार उपयोग करने के लिए प्रोग्रामर को परेशान कर सकता है। इसके स्थान पर ArrayList में add (int index, object) विधि है जिसका उपयोग करना और याद रखना आसान है। इस तरह वे ArrayList में फ़ंक्शन नाम का उपयोग करने के लिए अधिक प्रोग्रामर के अनुकूल और आसान हैं।

कब कौन सा उपयोग करें?

  1. पूरी तरह से वैक्टर का उपयोग करने से बचने की कोशिश करें। ArrayLists एक वेक्टर क्या कर सकते हैं सब कुछ कर सकते हैं। अधिक ArrayLists डिफ़ॉल्ट रूप से सिंक्रनाइज़ नहीं हैं। यदि आप चाहें, तो जब भी आपको संग्रह उपयोग वर्ग का उपयोग करके आवश्यकता हो, आप इसे सिंक्रनाइज़ कर सकते हैं।
  2. ArrayList को फ़ंक्शन नामों को याद रखना और उपयोग करना आसान है।

नोट : भले ही सरणीसूची 100% बढ़ती है, आप यह सुनिश्चित करने के लिए इसे सुनिश्चित कर सकते हैं () विधि यह सुनिश्चित करने के लिए कि आप प्रारंभिक चरणों में ही पर्याप्त मेमोरी आवंटित कर रहे हैं।

आशा है ये मदद करेगा।


5
ArrayLIst और वेक्टर के लिए बढ़ते आकार पर गलत जानकारी (स्विच्ड), अन्यथा बहुत अच्छा जवाब।
नेनाड बुलैटोविक

वेक्टर की वृद्धि आवश्यक डॉक्स के साथ दोगुनी हो रही है। AracleList के दौरान docs.oracle.com/javase/7/docs/api/java/util/Vector.html "विकास नीति का विवरण इस तथ्य से परे निर्दिष्ट नहीं है कि एक तत्व जोड़ना लगातार परिशोधन समय लागत। " docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html
मोहम्मद अल-

मुझे समझ में नहीं आता है कि उस विधि का उपयोग करने या न करने के लिए विधि का नाम कैसे मानदंड हो सकता है।
सुरेन्द्र खेरवा १२'१

14

ArrayListऔर Vectorदोनों सूची इंटरफ़ेस को लागू करता है और प्रविष्टि क्रम को बनाए रखता है। लेकिन इसके ArrayListऔर Vectorवर्गों के बीच कई अंतर हैं ...

ArrayList -

  1. ArrayList सिंक्रनाइज़ नहीं है।
  2. ArrayList यदि तत्व की संख्या उसकी क्षमता से अधिक है, तो वर्तमान सरणी आकार का 50% बढ़ जाता है।
  3. ArrayList एक विरासत वर्ग नहीं है, इसे JDK 1.2 में पेश किया गया है।
  4. ArrayList तेज है क्योंकि यह गैर-सिंक्रनाइज़ है।
  5. ArrayList तत्वों को पार करने के लिए Iterator इंटरफ़ेस का उपयोग करता है।

वेक्टर -

  1. Vector सिंक्रनाइज़ किया गया है।
  2. Vector वेतन वृद्धि 100% का मतलब है सरणी आकार दोगुना अगर तत्व की कुल संख्या इसकी क्षमता से अधिक है।
  3. Vector एक विरासत वर्ग है।

  4. Vector यह धीमा है क्योंकि यह सिंक्रनाइज़ किया गया है यानी मल्टीथ्रेडिंग वातावरण में, यह थ्रेडेबल या गैर-रननीय अवस्था में अन्य थ्रेड्स को तब तक रखेगा जब तक कि वर्तमान थ्रेड ऑब्जेक्ट का लॉक रिलीज़ नहीं करता है।

  5. Vectorतत्वों को पार करने के लिए गणना इंटरफ़ेस का उपयोग करता है। लेकिन यह इटरेटर का भी उपयोग कर सकता है।

इसे भी देखें: https://www.javatpoint.com/difference-between-arraylist-and-vector


10

मूल रूप से दोनों ArrayList और वेक्टर दोनों आंतरिक वस्तु सरणी का उपयोग करते हैं।

ArrayList: ArrayList वर्ग AbstractList का विस्तार करता है और सूची इंटरफ़ेस और RandomAccess (मार्कर इंटरफ़ेस) को लागू करता है। ArrayList डायनेमिक सरणियों का समर्थन करता है जो आवश्यकतानुसार बढ़ सकता है। यह हमें पहले तत्वों पर पुनरावृत्ति देता है। ArrayList आंतरिक वस्तु सरणी का उपयोग करता है; वे 10 के डिफ़ॉल्ट प्रारंभिक आकार के साथ बनाए जाते हैं। जब यह आकार पार हो जाता है, तो संग्रह स्वचालित रूप से डिफ़ॉल्ट आकार के आधे तक बढ़ जाता है जो कि 15 है।

वेक्टर: वेक्टर ArrayList के समान है, लेकिन अंतर हैं, यह सिंक्रनाइज़ है और इसका डिफ़ॉल्ट प्रारंभिक आकार 10 है और जब आकार इसके आकार से अधिक हो जाता है तो मूल आकार का दोगुना हो जाता है अर्थात नया आकार 20 होगा। वेक्टर एकमात्र वर्ग है RandomAccess को लागू करने के लिए ArrayList के अलावा अन्य। वेक्टर में चार कंस्ट्रक्टर होते हैं, जिसमें से दो पैरामीटर लेते हैं वेक्टर (int initialCapacity, int कैपेसिटी इंक्रीमेंट) क्षमता Increment वह राशि है जिसके द्वारा वेक्टर के ओवरफ्लो होने पर क्षमता बढ़ जाती है, इसलिए इसका लोड फैक्टर पर अधिक नियंत्रण होता है।

कुछ अन्य अंतर हैं: यहां छवि विवरण दर्ज करें


1
लिंक्डलिस्ट में सबसे पहले और आखिर में ऑब्जेक्ट क्यों जोड़ा जाता है? क्या यह बीओटीएच सरणी और वेक्टर से तेज नहीं होना चाहिए?
CHANist

@ मैं भी सहमत हूँ। प्रारंभ और अंत में एक वस्तु जोड़ना इसके बीच में एक वस्तु को जोड़ने की तुलना में तेज होना चाहिए।
राहुल रस्तोगी

1
इस तालिका के लिंक्डलिस्ट कॉलम में प्रयुक्त भाषा विरोधाभासी है। लिंक्डलिस्ट से जुड़ने और जुड़ने दोनों ही बीच में तत्वों को जोड़ने की तुलना में तेज़ होते हैं, लेकिन ArrayLists या Vectors में शामिल होने या अपील करने की तुलना में धीमा होते हैं। ऐसा इसलिए है क्योंकि हर प्रविष्टि में गैर-स्थानीय संदर्भों के साथ मेमोरी आवंटन की आवश्यकता होती है, जिससे कैश मिस की संभावना बढ़ जाती है। हालांकि एक लिंक्डलिस्ट में लुकअप तत्वों की संख्या के साथ रैखिक है और अंत तक एक पॉइंटर संग्रहीत नहीं किया गया है, फिर भी संलग्न करना प्रीपेडिंग की तुलना में तेज़ है क्योंकि मेमोरी केवल एक तत्व के लिए वास्तविक है।
सोफिया गोल्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.