อะไรคือความแตกต่างระหว่างวิธีการเพิ่มและข้อเสนอในคิวใน Java?


110

ใช้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

คำตอบ:


149

ฉันเดาว่าข้อแตกต่างอยู่ในสัญญาเมื่อไม่สามารถเพิ่มองค์ประกอบลงในคอลเลกชันได้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 (E) ซึ่งไม่สามารถแทรกองค์ประกอบได้โดยการโยนข้อยกเว้นเท่านั้น


4
+1 สำหรับการค้นพบว่า snippet เกี่ยวกับเมื่อใช้VSoffer add
Finbarr

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เมธอดนี้?
Finbarr

14

ความแตกต่างระหว่างofferและaddอธิบายได้จากข้อความที่ตัดตอนมาทั้งสองนี้จาก Javadocs:

จากCollectionอินเทอร์เฟซ:

หากคอลเล็กชันปฏิเสธaddองค์ประกอบใดองค์ประกอบหนึ่งด้วยเหตุผลอื่นใดนอกเหนือจากที่มีองค์ประกอบอยู่แล้วคอลเลกชันนั้นจะต้องมีข้อยกเว้น (แทนที่จะส่งคืนเท็จ) สิ่งนี้จะรักษาค่าคงที่ที่คอลเลกชันมีองค์ประกอบที่ระบุไว้เสมอหลังจากที่การเรียกนี้ส่งคืน

จากQueueอินเทอร์เฟซ

เมื่อใช้คิวที่อาจกำหนดข้อ จำกัด ในการแทรก (ตัวอย่างเช่นขอบเขตความจุ) offerโดยทั่วไปแล้วเมธอดจะนิยมใช้เมธอดCollection.add(E)ซึ่งไม่สามารถแทรกองค์ประกอบได้โดยการโยนข้อยกเว้นเท่านั้น

PriorityQueueเป็นการQueueใช้งานที่ไม่ได้กำหนดข้อ จำกัด การแทรกใด ๆ ดังนั้นaddและofferวิธีการจึงมีความหมายเหมือนกัน

ในทางตรงกันข้ามArrayBlockingQueueคือการดำเนินการในการที่offerและaddทำงานแตกต่างกันขึ้นอยู่กับว่าคิวถูก instantiated


10

ความแตกต่างดังต่อไปนี้:

  • วิธีการเสนอ - พยายามเพิ่มองค์ประกอบลงในคิวและส่งกลับค่าเท็จหากไม่สามารถเพิ่มองค์ประกอบได้ (เช่นในกรณีที่คิวเต็ม) หรือเป็นจริงหากมีการเพิ่มองค์ประกอบและไม่ทำให้เกิดข้อยกเว้นใด ๆ .

  • วิธีการเพิ่ม - พยายามเพิ่มองค์ประกอบลงในคิวส่งคืนค่าจริงหากมีการเพิ่มองค์ประกอบหรือโยน IllegalStateException หากไม่มีพื้นที่ว่างในขณะนี้


1
วิธีการเพิ่มจะไม่ส่งกลับเท็จหากองค์ประกอบมีอยู่แล้ว Queue <String> q = new PriorityQueue <> (); สตริง b = "java"; บูลีน is1 = q.add (b); บูลีน is2 = q.add ("java"); บูลีน is3 = q.add (b); บูลีน is4 = q.offer ("java"); บูลีน is5 = q.offer (b); บูลีน is6 = q.offer (b); System.out.println ("qq ::" + q);
Raj

ขอบคุณ Raj! ฉันได้อัปเดตคำตอบของฉันด้านบนแล้ว เอกสารของ Oracle ระบุว่า: "วิธีการ offer จะแทรกองค์ประกอบหากเป็นไปได้มิฉะนั้นจะคืนค่าเป็นเท็จซึ่งแตกต่างจากเมธอด Collection.add ซึ่งไม่สามารถเพิ่มองค์ประกอบได้โดยการโยนข้อยกเว้นที่ไม่ได้ตรวจสอบเท่านั้นวิธี offer ได้รับการออกแบบมาเพื่อใช้เมื่อเกิดความล้มเหลว เป็นเรื่องปกติแทนที่จะเป็นเหตุการณ์พิเศษตัวอย่างเช่นในคิวความจุคงที่ (หรือ "ขอบเขต") "
Maksym Ovsianikov

7

จากซอร์สโค้ดใน jdk 7 ดังต่อไปนี้:

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

เราสามารถรู้ได้อย่างง่ายดายว่าฟังก์ชันเพิ่มจะคืนค่าจริงเมื่อเพิ่มองค์ประกอบใหม่ลงในคิวสำเร็จ แต่จะทิ้งข้อยกเว้นเมื่อล้มเหลว


7

Queueอินเตอร์เฟซที่ระบุว่าadd()จะโยนIllegalStateExceptionหากพื้นที่ใดมีอยู่ในปัจจุบัน (และอื่น ๆ กลับtrue) ในขณะที่offer()จะกลับมาfalseถ้าองค์ประกอบไม่สามารถแทรกเนื่องจากข้อ จำกัด ด้านความจุ

เหตุผลที่เหมือนกันใน a PriorityQueueคือคิวนี้ถูกระบุให้ไม่ถูกผูกไว้นั่นคือไม่มีข้อ จำกัด ด้านความจุ ในกรณีที่ไม่มีข้อ จำกัด ด้านความจุสัญญาadd()และoffer()แสดงพฤติกรรมเดียวกัน


2

ฉันจะเขียนโค้ดตัวอย่างสัญญา java สำหรับวิธีการเสนอและเพิ่มวิธีการที่แสดงความแตกต่าง

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

1

ที่มา: http://docs.oracle.com/javase/6/docs/api/java/util/Queue.html

วิธีการเสนอจะแทรกองค์ประกอบถ้าเป็นไปได้มิฉะนั้นจะส่งคืนเท็จ สิ่งนี้แตกต่างจากเมธอด Collection.add ซึ่งไม่สามารถเพิ่มองค์ประกอบได้โดยการโยนข้อยกเว้นที่ไม่เลือก วิธีการเสนอถูกออกแบบมาเพื่อใช้เมื่อความล้มเหลวเป็นเรื่องปกติแทนที่จะเป็นเหตุการณ์พิเศษตัวอย่างเช่นในคิวความจุคงที่ (หรือ "ขอบเขต")

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.