2012-09-02 10 views
8

Queue एक इंटरफेस क्यों है, लेकिन Stack और ArrayList जैसे अन्य वर्ग कक्षाएं हैं?java.util पैकेज - कक्षा बनाम इंटरफेस

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

... या क्या मुझसे कोई चूक हो रही है?

+2

आप सही ढंग से एक हल्के विसंगति देखा गया है। जावा बहुत अच्छा है, कुल मिलाकर, लेकिन दुनिया में बाहर भी कुछ भी बिल्कुल सही नहीं है। :-) वीर का उत्तर नीचे उल्लेख करता है कि स्टैक पुराने संस्करण से है, लेकिन कभी-कभी सब कुछ चारों ओर रहना पड़ता है। –

+0

यह दिलचस्प है कि यदि आप 'कतार' एपीआई दस्तावेज़ों के "उपयोग" पर क्लिक करते हैं, तो आप कार्यान्वयन देखेंगे लेकिन वास्तव में इसका उपयोग करने वाले कुछ भी नहीं।सामान्य उपयोग में इसका उपयोग कक्षा के भीतर निजी रूप से किया जाता है। इंटरफेस मौजूद नहीं होने पर कोई महत्वपूर्ण प्रभाव नहीं पड़ेगा। –

उत्तर

7

Queue कई फैशनों में कार्यान्वित किया जा सकता है, जैसे List या Set। वे सभी केवल विभिन्न प्रकार के संग्रह के लिए एक अनुबंध निर्दिष्ट करते हैं।

एक ArrayList, हालांकि, List का एक विशेष कार्यान्वयन है, जो आंतरिक रूप से तत्वों को संग्रहीत करने के लिए एक सरणी का उपयोग करने के लिए बनाया गया है। LinkedListList का कार्यान्वयन भी है, जो इंटरकनेक्टेड नोड्स की श्रृंखला का उपयोग करता है, यानी doubly linked list। इसी तरह, TreeSet और HashMap क्रमशः सेट और मानचित्र के विशेष कार्यान्वयन हैं।

अब, Stack यहां एक अजीब मामला है, खासकर क्योंकि यह जावा के पुराने संस्करणों से विरासत वर्ग है। आपको वास्तव में Stack का उपयोग नहीं करना चाहिए; इसके बजाय, आपको अपने आधुनिक समकक्ष, ArrayDeque का उपयोग करना चाहिए। ArrayDequeDeque (एक डबल-एंडेड कतार) का कार्यान्वयन है, जो आंतरिक रूप से भंडारण के लिए एक सरणी का उपयोग करता है (जो कि Stack करता है)। एक Deque एक Stack के कार्यों के सभी का समर्थन करता है, pop, push, आदि जैसे Deque के अन्य कार्यान्वयन, के रूप में किसी और के द्वारा उल्लेख किया है, LinkedList शामिल है, हालांकि यह है कि में Stack से भटक अंतर्निहित यह एक सरणी नहीं है, लेकिन एक दोगुना से जुड़े सूची: -पी

अब, Queue के कई कार्यान्वयन हैं, और कई अलग-अलग प्रकार के Queue एस हैं। आपके पास केवल BlockingQueue s (अक्सर निर्माता-उपभोक्ता के लिए उपयोग किया जाता है), जिनके सामान्य कार्यान्वयन में LinkedBlockingQueue और ArrayBlockingQueue शामिल हैं, लेकिन TransferQueue s, और इसी तरह भी। मैं digress ... आप प्रासंगिक Java Tutorial में संग्रह एपीआई पर और अधिक पढ़ सकते हैं।

+0

आपके उत्तर के लिए धन्यवाद। देर से धन्यवाद के लिए क्षमा करें नोट। मुझे यह पढ़ना याद है और यह समझ में आता है लेकिन जवाब देने के लिए पूरी तरह से भूल गया। – Siddhartha

3

आपको इंटरफ़ेस का सही ढंग से विचार मिलता है। इस मामले में जावा मानक पुस्तकालय पहले ही कार्यान्वयन और इंटरफेस दोनों प्रदान करता है। आप एक इंटरफेस का उपयोग करने के बेहतर हैं ताकि आप किसी भी समय कार्यान्वयन स्विच कर सकें।

आशा है कि यह समझ में आता है।

0

मुझे लगता है कि Stack एक कक्षा होने के लिए प्रसिद्ध है जो एक इंटरफेस होना चाहिए। इंटरफ़ेस प्रदान करने के लिए सही तरीके से चयन करने पर आता है जब जावा पुस्तकालय थोड़ा हिट-एंड-मिस होते हैं।

ArrayListList इंटरफ़ेस का केवल एक कार्यान्वयन है, इसलिए सूर्य को वहां सही मिला! एक और क्लासिक मिस (मेरी राय में) Observable कक्षा है, जिसे केवल एक वर्ग की बजाय इंटरफ़ेस का डिफ़ॉल्ट कार्यान्वयन होना आवश्यक है।

+0

'अवलोकन योग्य '1.0 वर्ग बहुत अधिक है। थोड़ा और आधुनिक समतुल्य 'java.beans.PropertyChangeSupport' है, जो आपके पास रचना द्वारा होगा। –

0

दिलचस्प सवाल। इस बारे में मेरा विचार है कि Queue ब्लॉकिंग क्यूई, प्राथमिकता क्यूई, डेक इत्यादि जैसे कई डेटा संरचनाओं का आधार है।कक्षाओं के इस समूह को विभिन्न परिचालनों के लिए विशिष्ट कार्यान्वयन की आवश्यकता है, इसलिए Queue को इंटरफेस के रूप में बनाना बहुत आसान है।

0

कारण कोड और कतार के लिए इंटरफेस का उपयोग अत्यधिक कोड को कम करने के लिए किया जाता है।

इंटरफेस का मुख्य लाभ यह है कि वे आपको लचीला, ढीला युग्मित कोड लिखने की अनुमति देते हैं।

एक इंटरफेस बस तरीकों कि एक वर्ग द्वारा लागू किया जाएगा की एक सूची को परिभाषित करता है (यहाँ एक awesome answer कि इस अवधारणा को पूरी तरह से वर्णन करता है)।

  • हम सभी वर्गों है कि एक अंतरफलक उसे लागू इलाज कर सकते हैं:

    यह हमें एक अद्भुत शक्तिशाली कुछ करने की अनुमति देता है।

यह एक बड़ा फायदा है।

हम एक डिबग विधि है कि एक Collection में हर तत्व प्रिंट लिखना चाहते हैं:

यहाँ एक बहुत ही सरल उदाहरण है।

Collection एक इंटरफ़ेस है। यह संचालन की एक सूची को परिभाषित करता है और उन्हें लागू नहीं करता है।

आप संग्रह को तत्काल नहीं कर सकते हैं। आप संग्रह को लागू करने वाली कक्षा को तुरंत चालू कर सकते हैं।

कई वर्गों है कि लागू Collection हैं: ArrayList, वेक्टर, TreeSet, LinkedList, आदि वे सभी अलग अत्यधिक आकर्षित विशेषताएं हैं ..., लेकिन वे भीआम में कुछ चीजें है: क्योंकि प्रत्येक वर्ग संग्रह को लागू करता है, वे सभी found here प्रत्येक विधि को लागू करते हैं।

  • हम एक विधि है कि किसी भी वर्ग कि संग्रह लागू करता है पर चल रही है लिख सकते हैं:

    यह हमें एक बहुत शक्तिशाली बात करने के लिए अनुमति देता है।

यह सिर्फ इस तरह दिखेगा: इंटरफेस की जादू की वजह से

public void printCollection(Collection semeCollection) { 
    for (Object o : someCollection) { 
     String s = (o == null) ? "null" : o.toString(); 
     System.out.println(s); 
    } 
} 

, अब हम निम्न कर सकते हैं:

public void testStuff() { 

    Collection s = new TreeSet(); 
    Collection a = new ArrayList(); 
    Collection v = new Vector(); 

    s.add("I am a set"); 
    a.add("I am an array list"); 
    v.add("I am a vector"); 

    printCollection(s); 
    printCollection(a); 
    printCollection(v); 
} 
संबंधित मुद्दे