सारांश ArrayList
के साथ ArrayDeque
में बेहतर हैं कई और अधिक से अधिक उपयोग-मामले LinkedList
। यदि आप निश्चित नहीं हैं - बस के साथ शुरू करते हैं ArrayList
।
LinkedList
और ArrayList
सूची इंटरफ़ेस के दो अलग-अलग कार्यान्वयन हैं। LinkedList
इसे दोहरे लिंक वाली सूची के साथ लागू करता है। ArrayList
इसे गतिशील रूप से पुन: आकार देने वाले सरणी के साथ लागू करता है।
मानक लिंक्ड सूची और सरणी संचालन के साथ, विभिन्न तरीकों में अलग-अलग एल्गोरिथम रनटाइम होंगे।
के लिये LinkedList<E>
get(int index)
है हे (एन) (साथ n / 4 औसत पर कदम), लेकिन हे (1) जब index = 0
या index = list.size() - 1
(इस मामले में, आप भी उपयोग कर सकते हैं getFirst()
और getLast()
)। के मुख्य लाभों में से एक है LinkedList<E>
add(int index, E element)
है हे (एन) (साथ n / 4 औसत पर कदम), लेकिन हे (1) जब index = 0
या index = list.size() - 1
(इस मामले में, आप भी उपयोग कर सकते हैं addFirst()
और addLast()
/ add()
)। के मुख्य लाभों में से एक है LinkedList<E>
remove(int index)
है हे (एन) (साथ n / 4 औसत पर कदम), लेकिन हे (1) जब index = 0
या index = list.size() - 1
(इस मामले में, आप भी उपयोग कर सकते हैं removeFirst()
और removeLast()
)। के मुख्य लाभों में से एक है LinkedList<E>
Iterator.remove()
है हे (1) । के मुख्य लाभों में से एक है LinkedList<E>
ListIterator.add(E element)
है हे (1) । के मुख्य लाभों में से एक है LinkedList<E>
नोट: कई ऑपरेशनों को औसत पर n / 4 चरणों की आवश्यकता होती है , सबसे अच्छे मामले में निरंतर चरणों की संख्या (जैसे सूचकांक = 0), और n / 2 सबसे खराब स्थिति में (सूची के मध्य)
के लिये ArrayList<E>
get(int index)
है हे (1) । का मुख्य लाभ ArrayList<E>
add(E element)
है हे (1) परिशोधित, लेकिन हे (एन) बुरी से बुरी हालत के बाद से सरणी का आकार बदला और प्रतिलिपि बनाई जानी चाहिए
add(int index, E element)
है O (n) ( औसत पर n / 2 चरणों के साथ )
remove(int index)
है O (n) ( औसत पर n / 2 चरणों के साथ )
Iterator.remove()
है O (n) ( औसत पर n / 2 चरणों के साथ )
ListIterator.add(E element)
है O (n) ( औसत पर n / 2 चरणों के साथ )
नोट: आपरेशन के कई की जरूरत n / 2 औसत, पर चरणों लगातार सबसे अच्छा मामले में कदम (सूची के अंत) की संख्या, एन सबसे खराब स्थिति में कदम (सूची के शुरू)
LinkedList<E>
पुनरावृत्तियों का उपयोग करके निरंतर-समय सम्मिलन या निष्कासन की अनुमति देता है , लेकिन तत्वों की केवल अनुक्रमिक पहुंच। दूसरे शब्दों में, आप सूची को आगे या पीछे की ओर ले जा सकते हैं, लेकिन सूची में स्थिति खोजने पर सूची के आकार के लिए आनुपातिक समय लगता है। Javadoc का कहना है कि "सूची में अनुक्रमणिका, जो सूची में शुरुआत या अंत से सूची को पार कर लेगी, जो भी करीब हो" , इसलिए वे विधियां औसतन O (n) ( n / 4 चरण) हैं, हालाँकि O (1) के लिए index = 0
।
ArrayList<E>
दूसरी ओर, तेजी से यादृच्छिक पढ़ने की अनुमति दें, ताकि आप किसी भी तत्व को निरंतर समय में पकड़ सकें। लेकिन जोड़ने या कहीं से भी हटाने के लिए, लेकिन अंत में सभी बाद के तत्वों को स्थानांतरित करने की आवश्यकता होती है, या तो एक खोलने या अंतर को भरने के लिए। इसके अलावा, अगर आप अंतर्निहित सरणी की क्षमता की तुलना में अधिक तत्वों को जोड़ने, एक नई सरणी (1.5 गुना आकार) आवंटित किया जाता है, और पुराने सरणी नया एक को कॉपी किया है, इसलिए एक को जोड़ने ArrayList
है हे (एन) सबसे खराब में मामला लेकिन औसत पर स्थिर।
इसलिए आपके द्वारा किए जाने वाले कार्यों के आधार पर, आपको अपने अनुसार कार्यान्वयन का चयन करना चाहिए। किसी भी प्रकार की सूची से अधिक व्यावहारिक रूप से समान रूप से सस्ता है। (मैं एक ArrayList
से अधिक तकनीकी रूप से तेज़ हूं, लेकिन जब तक आप वास्तव में प्रदर्शन-संवेदनशील कुछ नहीं कर रहे हैं, आपको इस बारे में चिंता नहीं करनी चाहिए - वे दोनों सहायक हैं।)
LinkedList
जब आप तत्वों को सम्मिलित करने और निकालने के लिए मौजूदा पुनरावृत्तियों का फिर से उपयोग करते हैं, तो एक उत्पन्न होने वाले उपयोग का मुख्य लाभ । ये ऑपरेशन केवल स्थानीय रूप से सूची बदलकर O (1) में किए जा सकते हैं । एक सरणी सूची में, शेष सरणी को स्थानांतरित करने की आवश्यकता है (यानी कॉपी की गई)। दूसरी तरफ, सबसे खराब स्थिति के लिए ओ (एन) ( एन / 2 चरणों) LinkedList
में लिंक का पालन करने वाले साधनों में मांग करते हैं , जबकि एक वांछित स्थिति में गणितीय रूप से गणना की जा सकती है और ओ (1) में एक्सेस किया जा सकता है ।ArrayList
LinkedList
सूची के प्रमुख से जब आप जोड़ते या हटाते हैं, तो उत्पन्न होने वाले उपयोग का एक अन्य लाभ , क्योंकि वे संचालन O (1) हैं , जबकि वे O (n) के लिए हैं ArrayList
। ध्यान दें कि सिर से जोड़ने और हटाने के लिए ArrayDeque
एक अच्छा विकल्प हो सकता है LinkedList
, लेकिन यह एक नहीं है List
।
इसके अलावा, यदि आपके पास बड़ी सूची है, तो ध्यान रखें कि मेमोरी का उपयोग भी अलग है। LinkedList
अगले और पिछले तत्वों की ओर संकेत करने के बाद से प्रत्येक का एक तत्व अधिक उपरि है। ArrayLists
यह ओवरहेड नहीं है। हालांकि, ArrayLists
क्षमता के लिए जितनी स्मृति आवंटित की गई है , ले लो, चाहे तत्व वास्तव में जोड़े गए हों।
डिफ़ॉल्ट की प्रारंभिक प्रारंभिक क्षमता ArrayList
बहुत छोटी है (जावा 1.4 - 1.8 से 10)। लेकिन चूंकि अंतर्निहित कार्यान्वयन एक सरणी है, इसलिए यदि आप बहुत सारे तत्व जोड़ते हैं, तो सरणी का आकार बदल दिया जाना चाहिए। आकार बदलने की उच्च लागत से बचने के लिए जब आप जानते हैं कि आप बहुत सारे तत्व जोड़ने जा रहे हैं, तो ArrayList
उच्च प्रारंभिक क्षमता के साथ निर्माण करें ।