जावा में एक क्यू में ऐड और ऑफर के तरीकों में क्या अंतर है?


109

लो PriorityQueue, उदाहरण के लिए http://java.sun.com/j2se/1.5.0/docs/api/java/util/PriorityQueue.html#offer(E)

क्या कोई मुझे एक उदाहरण दे सकता है कि Queueकहां addऔर offerतरीके अलग हैं?

Collectionडॉक्टर के अनुसार , addविधि अक्सर यह सुनिश्चित करने की कोशिश करेगी कि एक तत्व Collectionडुप्लिकेट को जोड़ने के बजाय मौजूद है । तो मेरा सवाल यह है कि addऔर offerविधियों में क्या अंतर है ?

यह है कि offerविधि की परवाह किए बिना डुप्लिकेट जोड़ देगा? (मुझे संदेह है कि ऐसा इसलिए है क्योंकि यदि Collectionकेवल अलग-अलग तत्व होने चाहिए, तो यह उस को दरकिनार कर देगा)।

संपादित करें: एक और तरीकों में एक ही तरीका है (नीचे मेरा उत्तर देखें)। क्या कोई मुझे एक ऐसे वर्ग का उदाहरण दे सकता है जहाँ के तरीके और तरीके अलग हैं?PriorityQueueaddofferaddoffer

जवाबों:


148

मुझे लगता है कि अंतर अनुबंध में है, कि जब तत्व को एकत्र करने के लिए जोड़ा नहीं जा सकता है तो addविधि एक अपवाद फेंकता है और offerनहीं।

प्रेषक: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Collection.html#add%28E%29

यदि कोई संग्रह किसी अन्य कारण से किसी विशेष तत्व को जोड़ने से इंकार करता है, तो उसमें पहले से ही तत्व शामिल है, तो उसे एक अपवाद (झूठे के बजाय) फेंकना होगा । यह अपरिवर्तनीय को संरक्षित करता है कि इस कॉल रिटर्न के बाद एक संग्रह में निर्दिष्ट तत्व हमेशा होता है।

प्रेषक: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Queue.html#offer%28E%29

यदि संभव हो तो निर्दिष्ट तत्व को इस कतार में सम्मिलित करता है। सम्मिलन प्रतिबंधों (उदाहरण के लिए क्षमता सीमा) को लागू करने वाली कतारों का उपयोग करते समय, विधि की पेशकश आम तौर पर विधि Collection.add (ई) के लिए बेहतर होती है, जो केवल एक अपवाद फेंककर एक तत्व सम्मिलित करने में विफल हो सकती है।


4
offerबनाम उस स्निपेट को खोजने के लिए कि कब बनाम का उपयोग करना है add
फ़िनबार

28

के कार्यान्वयन के लिए कोई अंतर नहीं है PriorityQueue.add:

public boolean add(E e) {
    return offer(e);
}

के लिए AbstractQueueवहाँ वास्तव में एक अंतर है:

public boolean add(E e) {
    if (offer(e))
        return true;
    else
        throw new IllegalStateException("Queue full");
}

मुझे पता है, मैंने कुछ मिनट पहले खुद ही जवाब दिया था। क्या आप किसी भी वर्ग के बारे में जानते हैं जहाँ addविधि विधि अलग है offer?
फ़िनबार

13

के बीच का अंतर offerऔर addjavadocs से इन दो अंश द्वारा समझाया गया है:

से Collectionइंटरफ़ेस:

यदि कोई संग्रह addकिसी विशेष कारण से किसी अन्य कारण से इनकार करता है, तो उसमें पहले से ही तत्व शामिल है, उसे एक अपवाद फेंकना चाहिए (बजाय झूठे लौटने के)। यह अपरिवर्तनीय को संरक्षित करता है कि इस कॉल रिटर्न के बाद एक संग्रह में निर्दिष्ट तत्व हमेशा होता है।

से Queueइंटरफ़ेस

सम्मिलन प्रतिबंध (उदाहरण के लिए क्षमता सीमा) लगाने वाली कतारों का उपयोग करते समय, विधि offerआम तौर पर विधि के लिए बेहतर होती है Collection.add(E), जो केवल एक अपवाद को फेंककर एक तत्व सम्मिलित करने में विफल हो सकती है।

PriorityQueueएक Queueकार्यान्वयन है जो किसी प्रविष्टि प्रतिबंध नहीं लगाता है। इसलिए addऔर offerविधियों में एक ही शब्दार्थ है।

इसके विपरीत, ArrayBlockingQueueजिसमें एक कार्यान्वयन है offerऔर addकैसे कतार instantiated गया था पर निर्भर करता है, व्यवहार अलग ढंग से।


8

अंतर निम्नलिखित है:

  • प्रस्ताव विधि - एक कतार में एक तत्व जोड़ने की कोशिश करता है, और यदि तत्व जोड़ा नहीं जा सकता है (तो जब कतार भरी होती है), या सही है अगर तत्व जोड़ा गया था, और कोई विशिष्ट अपवाद नहीं फेंकता है, तो गलत रिटर्न देता है ।

  • विधि जोड़ें - एक तत्व को एक कतार में जोड़ने का प्रयास करता है, यदि तत्व जोड़ा गया था, तो सच हो जाता है या यदि वर्तमान में कोई स्थान उपलब्ध नहीं है, तो IllegalStateException को फेंकता है।


1
यदि तत्व पहले से उपलब्ध क्यू <स्ट्रिंग> q = नया प्राथमिकता-क्यू <() उपलब्ध है, तो विधि कभी भी गलत न जोड़ें; स्ट्रिंग बी = "जावा"; बूलियन is1 = q.add (b); बूलियन 2 = q.add ("जावा") है; बूलियन is3 = q.add (b); बूलियन is4 = q.offer ("जावा"); बूलियन is5 = q.offer (b); बूलियन is6 = q.offer (b); Println ( "qq ::" + क्यू);
राज

धन्यवाद, राज! मैंने अपनी प्रतिक्रिया अपडेट कर दी है। ओरेकल दस्तावेज़ीकरण कहता है: "ऑफ़र विधि यदि संभव हो तो एक तत्व सम्मिलित करता है, अन्यथा गलत तरीके से लौटता है। यह Collection.add विधि से भिन्न होता है, जो केवल अनियंत्रित अपवाद को फेंककर एक तत्व को जोड़ने में विफल हो सकता है। प्रस्ताव विधि को विफल होने पर उपयोग के लिए डिज़ाइन किया गया है। असाधारण घटना के बजाय एक सामान्य है, उदाहरण के लिए, निश्चित-क्षमता (या "बाध्य") कतारों में। "
मैक्सिमम ओवसियनिकोव

7

स्रोत कोड से jdk 7 में इस प्रकार है:

public boolean add(E e) {
    if (offer(e))
        return true;
    else
        throw new IllegalStateException("Queue full");
}

हम आसानी से जान सकते हैं कि ऐड फंक्शन सही वापस आएगा जब सफलतापूर्वक एक नया तत्व कतार में जोड़ देगा, लेकिन असफल होने पर एक अपवाद फेंक दें।


5

Queueइंटरफेस निर्दिष्ट करता है कि add()एक फेंक देते हैं IllegalStateException, तो कोई जगह नहीं वर्तमान में उपलब्ध है (और नहीं तो वापसी true), जबकि offer()वापस आ जाएगी falseअगर तत्व क्षमता प्रतिबंधों की वजह से नहीं डाला जा सकता है।

इसका कारण PriorityQueueयह है कि यह एक समान है कि यह कतार अनबाउंड होने के लिए निर्दिष्ट है, अर्थात क्षमता प्रतिबंध नहीं हैं। बिना किसी क्षमता प्रतिबंध के मामले में, समान व्यवहार के अनुबंध add()और offer()प्रदर्शित होते हैं।


2

मैं प्रस्ताव विधि के लिए जावा अनुबंध उदाहरण कोड लिखूंगा और यह दिखाऊंगा कि वे कैसे भिन्न हैं।

BlockingQueue<String> queue = new ArrayBlockingQueue<>(2);
        queue.add("TestQuue1");     
        queue.add("TestQuue2"); 
        queue.add("TestQuue3");  // will throw "java.lang.IllegalStateException: Queue full

BlockingQueue<String> queue = new ArrayBlockingQueue<>(2);
        queue.offer("TestQuue1");       
        queue.offer("TestQuue2");   
        queue.offer("TestQuue3"); // will not throw any exception

0

स्रोत: http://docs.oracle.com/javase/6/docs/api/java/util/Queue.html

यदि संभव हो तो प्रस्ताव विधि एक तत्व सम्मिलित करती है, अन्यथा झूठे वापस लौटती है। यह Collection.add विधि से अलग है, जो केवल अनियंत्रित अपवाद को फेंककर एक तत्व को जोड़ने में विफल हो सकता है। ऑफ़र पद्धति को उपयोग के लिए डिज़ाइन किया गया है जब विफलता सामान्य घटना के बजाय सामान्य होती है, उदाहरण के लिए, निश्चित-क्षमता (या "बाउंडेड") कतारों में।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.