2010-10-31 21 views
20

ठीक है तो मुझे पता है कि Set, List और Map इंटरफेस हैं लेकिन दूसरी पंक्ति की तुलना में कोड की पहली पंक्ति क्या बेहतर बनाती है?सूची के रूप में ArrayList बनाम सूची?

List myArr = new ArrayList(); 
ArrayList myArr = new ArrayList(); 
+0

दूसरी पंक्ति बेहतर है क्योंकि ArrayList प्रकार सूची के अतिरिक्त अधिक कार्यक्षमता प्रदान करता है। हालांकि सूची प्रकार बेहतर होता है जब आप कोड करते हैं जो सूची कार्यान्वयन पर निर्भर नहीं होता है। कृपया इसे गहराई से जानने के लिए मेरे [आंतरिक लेख का आंतरिक जीवन] (http://volodial.blogspot.com/2013/07/internal-life-of-arraylist-in-java.html) को कवर करें। –

उत्तर

32

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

+2

मुझे लगता है कि जब आप डिबगिंग के लिए संग्रह.checkedList() में अपने ArrayList को लपेटने का उल्लेख करते हैं तो केस को और अधिक आकर्षक बना दिया जा सकता है। जब आप लिंक्डलिस्ट का उल्लेख करते हैं, तो लोग कहते हैं, "मैं कभी लिंक्डलिस्ट का उपयोग क्यों करूं?"। – ILMTitan

+1

@ILMTitan: सहमत।'लिंक्डलिस्ट' पर स्विच करने की तुलना में यह एक बहुत ही आम परिदृश्य है। लेकिन 'लिंक्डलिस्ट' भी उपयोगी है, जब भी मुझे शुरुआत में बहुत सारे जोड़/हटाने की ज़रूरत होती है, तब भी मुझे उनका उपयोग करने के लिए स्विच करना पड़ता था। यहां मुख्य बिंदु कार्यान्वयन और इंटरफ़ेस को अलग करना है ताकि कार्यान्वयन शेष कोड में बहुत से परिवर्तन किए बिना बदल सकता है। – MAK

6

आप ArrayListhere के स्रोत से देख सकते हैं, कार्यान्वित @override के रूप में एनोटेट तरीकों में से सबसे क्योंकि उन सभी को List इंटरफेस के माध्यम से ऐसा है, परिभाषित कर रहे हैं कि अगर आप वाला उपयोग सिर्फ बुनियादी कार्यक्षमताओं (जो है कि तुम क्या कर रहे हैं ज्यादातर समय करने वाला) अंतर कोई व्यावहारिक नहीं होगा।

अंतर आएगा यदि किसी दिन आपको लगता है कि ArrayList की विशेषताएं आपकी समस्या के लिए अब उपयुक्त नहीं हैं और आपको कुछ अलग (उदाहरण के लिए LinkedList) की आवश्यकता होगी। यदि आपने सबकुछ List के रूप में घोषित किया है लेकिन ArrayList के रूप में तत्काल इसे new ArrayList() पर तत्काल बदलकर नए कार्यान्वयन पर स्विच किया जाएगा जबकि अन्य मामले में आपको सभी परिवर्तनीय घोषणाओं को भी बदलना होगा।

List list = new ArrayList() का उपयोग करना अधिक ओओपी शैली है क्योंकि आप घोषणा करते हैं कि आपको सूची के विशिष्ट कार्यान्वयन की परवाह नहीं है, और आप इस प्रकार के बारे में स्थिर जानकारी को त्यागना चाहते हैं क्योंकि आप इस तरह के इंटरफ़ेस पर भरोसा करेंगे इसके कार्यान्वयन से संग्रह संग्रह का।

इस प्रकार
10

प्रोग्रामिंग में प्रकार (कुछ समय robustness principle के रूप में) के बारे में एक उपयोगी सामान्य सिद्धांत है:

  • तुम क्या स्वीकार
  • आप क्या फेंकना
के बारे में रूढ़िवादी हो के बारे में उदार बनें

सूची ArrayList से अधिक उदार है, क्योंकि सूची किसी प्रकार की सूची कार्यान्वयन हो सकती है जैसे एक ArrayList, एक लिंक्डलिस्ट या FrancosSpecialList। इसलिए उदार होना और किसी भी तरह की सूची स्वीकार करना एक अच्छा विचार है क्योंकि आप बाद में कार्यान्वयन को बदलना चाहते हैं।

स्पष्ट रूप से एक प्रकार (आपका दूसरा मामला) के रूप में स्पष्ट रूप से ऐरेलिस्ट का उपयोग करने का मुख्य कारण यह है कि यदि आपको सूची इंटरफ़ेस के माध्यम से उपलब्ध नहीं है जो ArrayList के लिए विशिष्ट विधियों का उपयोग करने की आवश्यकता है। इस मामले में एक सामान्य सूची काम नहीं करेगी (जब तक कि आप बहुत बदसूरत और भ्रमित कास्टिंग नहीं करना चाहते), तो आप स्पष्ट रूप से स्पष्ट हो सकते हैं और सीधे ऐरेलिस्ट का उपयोग कर सकते हैं। इसमें एक पाठक को संकेत देने का जोड़ा बोनस है कि ऐरेलिस्ट की विशिष्ट विशेषताओं की आवश्यकता है।

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