2011-03-08 13 views
5

ऐसा लगता है कि जावा में प्रोग्रामिंग करते समय हम वेक्टरों का उपयोग करने के लिए प्रतीत नहीं होते हैं जब धागे शामिल होते हैं।जावा में वेक्टर के बजाय मैं क्या उपयोग कर सकता हूं?

धागे का उपयोग करते समय वेक्टर के बजाय मुझे किस वर्ग का उपयोग करना चाहिए?

import java.util.Vector; 
Vector<String> v = new Vector<String>(); 

उत्तर

4
List<String> list = Collections.synchronizedList(new ArrayList<String>()); 
+2

यह 'वेक्टर' के लिए एक अधिक या कम प्लगइन प्रतिस्थापन है। लेकिन यह जरूरी नहीं है कि उपयोग करने के लिए सही बात है। –

+0

धन्यवाद। मुझे अपने कुछ वेक्टरों को सूची में बदलना होगा। – VSH3R

0

सरणी, लेकिन अगर आप आकार पता नहीं है, concurrentmap

+0

मानते हैं कि आप तत्वों के लिए तेज़ी से यादृच्छिक पहुंच चाहते हैं (यही कारण है कि सूची एक बुरा विचार होगा) – necromancer

+0

अंतर यह है: एक मानचित्र कुंजी द्वारा यादृच्छिक पहुंच प्रदान करता है, एक सूची इंडेक्स द्वारा यादृच्छिक पहुंच प्रदान करती है (अधिक या कम कुशलतापूर्वक)। –

+0

आपका मतलब है नक्शा ओ (लॉग (एन)) पहुंच प्रदान करता है जबकि सूची ओ (1) प्रदान करता है? तो यह एक सूची को कॉल करने के लिए चर्चा को उलझन में डालता है - यह सूची इंटरफ़ेस में एक सरणी है। यदि आप आकार को जानते हैं, तो एक सरणी स्पष्ट रूप से सबसे अच्छा, पसंद समझने के लिए सबसे आसान है। केवल अगर आप आकार को नहीं जानते हैं तो आपकी पसंद नक्शा के बीच है, या बहु-थ्रेडेड स्थिति में कुछ हद तक अप्रत्याशित प्रदर्शन की पेशकश करने वाले सक्षम एरेज़ हैं। – necromancer

-1

उपयोग सूचियाँ के एक कार्यान्वयन का उपयोग करें और उनकी तरह

List<?> list = Collections.synchronizedList(new ArrayList<?>()); 
5

धागे की असुरक्षित मामलों के लिए सिंक्रनाइज़, ArrayList का उपयोग करें।

धागा सुरक्षित मामलों के लिए, का उपयोग करें जो कुछ भी अपने मामले, CopyOnWriteArrayList, Queue, BlockingDeque, आदि अधिक सलाह के लिए सबसे उपयुक्त है, हम जानना चाहते हैं कि आप अपने संग्रह के साथ चीजों में हेरफेर की जरूरत है।

मैं Collections.synchronizedList(...) रैपर का उपयोग करने के खिलाफ अनुशंसा करता हूं क्योंकि यह काफी अच्छी तरह से स्केल नहीं कर सकता है (जब तक कि आप स्केलेबिलिटी के बारे में ज्यादा परवाह नहीं करते)। लेकिन यह सब आपके संदर्भ पर निर्भर करता है।

+0

क्या आप समझा सकते हैं कि क्यों 'संग्रह। सिंक्रनाइज़लिस्टसूची (...)' स्केल नहीं करता है? – corsiKa

+1

यदि आपका उपयोग पैटर्न 99% पढ़ता है और 1% लिखता है, तो CopyOnWriteArrayList बेहतर प्रदर्शन प्रदान करता है (COWAL javadoc पढ़ें)। लेकिन यह सब उपयोग पैटर्न पर निर्भर करता है। – mindas

+0

पर्याप्त मेला - एक दिलचस्प वर्ग। मुझे 100% यकीन नहीं है कि मैं इसके साथ सहमत हूं (यानी यह एक ऐसी समस्या हल करती है जिसे शायद बेहतर डिजाइन का उपयोग करके हल किया जा सकता है) लेकिन कभी-कभी आदर्श क्या होता है और व्यावहारिक क्या है दो अलग-अलग चीजें हैं। +1 – corsiKa

11

ऐसा लगता है कि जावा में प्रोग्रामिंग करते समय हम वेक्टरों का उपयोग करने के लिए प्रतीत नहीं होते हैं जब धागे शामिल होते हैं।

आप क्यों को समझने के लिए का उपयोग कर Vector अधिकांश संदर्भों में एक बुरी बात माना जाता है की जरूरत है। कारण हैं:

  • Vector प्रत्येक ऑपरेशन पर सिंक्रनाइज़ करता है। अधिकांश संदर्भों में ठीक-ठीक सिंक्रनाइज़ेशन की आवश्यकता नहीं होती है, और इस तरह यह एक अवांछित प्रदर्शन ओवरहेड है।

  • Vector.elements() विधि Enumeration देता है जिसमें असफल-तेज़ अर्थशास्त्र नहीं होता है।

इसे अपने प्रश्न पर वापस लाएं। विकल्प आपके धागे करने के लिए कोशिश कर रहे हैं पर निर्भर करते हैं: यूज-केस बिल्कुल तुल्यकालन की आवश्यकता नहीं है

  • हैं, ArrayList, या LinkedList का उपयोग करें। आप आमतौर पर इनका उपयोग करेंगे यदि:

    • सूची थ्रेड-सीमित है; यानी केवल एक धागा इसे एक्सेस कर सकता है।
    • सूची में मोटे अनाज सिंक्रनाइज़ेशन की आवश्यकता है; यानी संचालन के अनुक्रम प्रदर्शन करते समय विशेष पहुंच। इस मामले में, आप आम तौर पर कस्टम क्लास एपीआई में प्रकट नहीं होने वाले एम्बेडेड (कहें) ArrayList के साथ एक कस्टम क्लास बनाते हैं।
  • यूज-केस सुक्ष्म तुल्यकालन की आवश्यकता है, Collections.synchronizedList आवरण एक Vector के बराबर है। वैकल्पिक रूप से, आप Vector के साथ रह सकते हैं और elements() ऑपरेशन का उपयोग करने से बच सकते हैं।

  • CopyOnWriteArrayList सूची का लाभ यह है कि इसका पुनरावर्तक समवर्ती संशोधन का समर्थन करता है ... एक अर्थ में। यदि आपका एप्लिकेशन ज्यादातर सूची पढ़ता है तो यह भी बेहतर होता है। पढ़ें ऑपरेशन को स्पष्ट रूप से सिंक्रनाइज़ करने की आवश्यकता नहीं है, और आम तौर पर केवल एक बार volatile पढ़ने की आवश्यकता होती है। लेकिन फ्लिप पक्ष यह है कि लिखने के संचालन सिंक्रनाइज़ करते हैं, और "सामान्य" ArrayList की तुलना में काफी महंगा हैं।

और Vector साथ दूसरी समस्या Collections.synchronizedList आवरण है कि कुछ उपयोग-मामले मोटे तुल्यकालन की आवश्यकता है, जैसे किसी सूची के आकार का परीक्षण करना और एक सिंक्रनाइज़ ऑपरेशन में सशर्त रूप से तत्व जोड़ना। Queue और Deque कक्षाएं उच्च स्तरीय अवशोषण प्रदान करती हैं जो इस तरह की चीज़ से निपटती हैं ... उपयोग-मामलों के लिए एक थ्रेड से दूसरे थ्रेड में असीमित रूप से काम करना शामिल है।


नीचे की रेखा यह है कि एक आकार-फिट-सभी समाधान नहीं है। आपको अपने एप्लिकेशन डिज़ाइन की समवर्ती विशेषताओं को समझने की आवश्यकता है, और तदनुसार अपनी डेटा संरचनाएं चुनें।


अंत में, यदि आप जावा ME के ​​लिए प्रोग्रामिंग कर रहे हैं, तो आप Vector का उपयोग कर, क्या प्रोफ़ाइल जे 2 एमई आप लक्षित कर रहे हैं पर निर्भर करता के साथ फंस जा सकता है।

+0

@ वीएसएच 3 आर देखें http://stackoverflow.com/questions/703990/why-is-c-list-not-thread-safe और http://www.ibm। com/डेवलपर/जावा/पुस्तकालय/j-jtp09263.html। – tiago2014

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

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