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


12

ในjava.util.PriorityQueueเรามีวิธีการและadd(E e) offer(E e)ทั้งสองวิธีมีการบันทึกไว้เป็น:

แทรกองค์ประกอบที่ระบุลงในคิวลำดับความสำคัญนี้

ความแตกต่างระหว่างสองวิธีนี้มีอะไรบ้าง

คำตอบ:


17

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

คุณควรใช้offer()เมื่อความล้มเหลวในการแทรกองค์ประกอบจะเป็นเรื่องปกติและadd()เมื่อความล้มเหลวจะเกิดขึ้นเป็นพิเศษ (ที่ต้องจัดการ)


4

ในการค้นหาความแตกต่างเราจำเป็นต้องติดตามPriorityQueue API javadocsซึ่งจะมีส่วน "ระบุโดย" ที่อ้างถึงผู้อ่านไปยังวิธีการที่เกี่ยวข้องในQueueอินเทอร์เฟซ:

  • Queue.add

    แทรกองค์ประกอบที่ระบุลงในคิวนี้ถ้าเป็นไปได้ที่จะทำเช่นนั้นทันทีโดยไม่ละเมิดข้อ จำกัด ด้านความจุคืนจริงเมื่อสำเร็จและโยน IllegalStateException หากไม่มีพื้นที่ว่างในขณะนี้ ...
    ส่งคืน: true(ตามที่ระบุโดยCollection.add (E) )
    พ่น: IllegalStateException- หากองค์ประกอบไม่สามารถเพิ่มได้ในขณะนี้เนื่องจากข้อ จำกัด ความจุ ...

  • Queue.offer

    แทรกองค์ประกอบที่ระบุในคิวนี้ถ้าเป็นไปได้ที่จะทำทันทีโดยไม่ละเมิดข้อ จำกัด ความจุ เมื่อใช้คิวที่จำกัดความจุวิธีนี้โดยทั่วไปจะนิยมเพิ่ม (E) ซึ่งไม่สามารถแทรกองค์ประกอบได้โดยการโยนข้อยกเว้นเท่านั้น ...
    ส่งคืน: trueถ้าองค์ประกอบถูกเพิ่มลงในคิวนี้มิฉะนั้นfalse...

ทั้งสองวิธีมีอยู่เพราะสิ่งเหล่านี้จะต้องดำเนินการโดยอินเตอร์เฟสที่ประกาศไว้

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


2
Pffft คุณไปและดูเอกสาร อ่อนแอ. ; P
yannis

1
@YannisRizos สิ่งต่อไปที่คุณจะเห็นฉันจะบ่นเหมือน Col Shrapnel :) โอ้คุณไม่สามารถแข่งขันกับคำตอบ 30 วินาที: คำถามจะได้รับ 5 คำตอบก่อนที่คุณจะสามารถหาลิงค์ที่เหมาะสม blah blah
gnat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.