Apa perbedaan antara metode add dan offer dalam Queue di Java?

109

Ambil PriorityQueuecontoh http://java.sun.com/j2se/1.5.0/docs/api/java/util/PriorityQueue.html#offer(E)

Adakah yang bisa memberi saya contoh di Queuemana metode adddan offerberbeda?

Menurut Collectiondokumen tersebut, addmetode ini akan sering kali berusaha untuk memastikan bahwa elemen ada di dalam Collectiondaripada menambahkan duplikat. Jadi pertanyaan saya adalah, apa perbedaan antara metode adddan offer?

Apakah offermetode ini akan menambahkan duplikat? (Saya ragu itu karena jika a Collectionseharusnya hanya memiliki elemen yang berbeda, ini akan menghindarinya).

EDIT: Dalam PriorityQueuesatu adddan offermetode adalah metode yang sama (lihat jawaban saya di bawah). Adakah yang bisa memberi saya contoh kelas di mana metode adddan offerberbeda?

Finbarr
sumber

Jawaban:

148

Saya kira perbedaannya ada dalam kontrak, bahwa ketika elemen tidak dapat ditambahkan ke koleksi, addmetode akan mengeluarkan pengecualian dan offertidak.

Dari: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Collection.html#add%28E%29

Jika sebuah koleksi menolak untuk menambahkan elemen tertentu karena alasan apa pun selain karena sudah berisi elemen tersebut, ia harus memunculkan pengecualian (bukan menampilkan false). Ini mempertahankan invarian bahwa koleksi selalu berisi elemen yang ditentukan setelah panggilan ini kembali.

Dari: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Queue.html#offer%28E%29

Menyisipkan elemen yang ditentukan ke dalam antrian ini, jika memungkinkan. Saat menggunakan antrean yang mungkin memberlakukan pembatasan penyisipan (misalnya batas kapasitas), tawaran metode umumnya lebih disukai daripada metode Collection.add (E), yang dapat gagal memasukkan elemen hanya dengan melontarkan pengecualian.

DVD
sumber
4
1 untuk temuan yang potongan tentang kapan untuk menggunakan offervs add.
Finbarr
28

Tidak ada perbedaan untuk penerapan PriorityQueue.add:

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

Karena AbstractQueuesebenarnya ada perbedaan:

public boolean add(E e) {
    if (offer(e))
        return true;
    else
        throw new IllegalStateException("Queue full");
}
Peter Lang
sumber
Saya tahu, saya baru saja memposting jawaban itu sendiri beberapa menit yang lalu. Apakah Anda mengetahui kelas-kelas yang addmetodenya berbeda dengan offermetodenya?
Finbarr
13

Perbedaan antara offerdan adddijelaskan oleh dua kutipan berikut dari javadocs:

Dari Collectionantarmuka:

Jika suatu koleksi menolak addelemen tertentu karena alasan apa pun selain karena sudah berisi elemen tersebut, ia harus memunculkan pengecualian (bukan menampilkan false). Ini mempertahankan invarian bahwa koleksi selalu berisi elemen yang ditentukan setelah panggilan ini kembali.

Dari Queueantarmuka

Saat menggunakan antrian yang mungkin memberlakukan batasan penyisipan (misalnya batas kapasitas), metode offerumumnya lebih disukai daripada metode Collection.add(E), yang bisa gagal memasukkan elemen hanya dengan melontarkan pengecualian.

PriorityQueueadalah Queueimplementasi yang tidak memberlakukan batasan penyisipan apa pun. Oleh karena itu, metode adddan offermemiliki semantik yang sama.

Sebaliknya, ArrayBlockingQueueadalah implementasi di mana offerdan addberperilaku berbeda, tergantung pada bagaimana antrian dibuat.

Stephen C
sumber
8

Perbedaannya adalah sebagai berikut:

  • menawarkan metode - mencoba menambahkan elemen ke antrian, dan mengembalikan false jika elemen tidak dapat ditambahkan (seperti dalam kasus ketika antrian penuh), atau benar jika elemen ditambahkan, dan tidak mengeluarkan pengecualian tertentu .

  • tambahkan metode - mencoba menambahkan elemen ke antrian, mengembalikan nilai true jika elemen ditambahkan, atau melontarkan IllegalStateException jika tidak ada ruang yang tersedia saat ini.

Maksym Ovsianikov
sumber
1
Metode add tidak pernah mengembalikan false jika elemen sudah tersedia Queue <String> q = new PriorityQueue <> (); String b = "java"; boolean is1 = q.add (b); boolean is2 = q.add ("java"); boolean is3 = q.add (b); boolean is4 = q.offer ("java"); boolean is5 = q.offer (b); boolean is6 = q.offer (b); System.out.println ("qq ::" + q);
Raj
Terima kasih, Raj! Saya telah memperbarui tanggapan saya di atas. Dokumentasi Oracle mengatakan: "Metode penawaran menyisipkan elemen jika memungkinkan, jika tidak mengembalikan false. Ini berbeda dari metode Collection.add, yang dapat gagal menambahkan elemen hanya dengan menampilkan pengecualian yang tidak dicentang. Metode penawaran dirancang untuk digunakan ketika gagal adalah kejadian normal, bukan luar biasa, misalnya, dalam antrian berkapasitas tetap (atau "terbatas"). "
Maksym Ovsianikov
7

dari kode sumber di jdk 7 sebagai berikut:

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

kita dapat dengan mudah mengetahui bahwa fungsi tambah akan mengembalikan nilai true ketika berhasil menambahkan elemen baru ke dalam antrian, tetapi memunculkan pengecualian ketika gagal.

Heavin
sumber
5

The Queuemenspesifikasikan interface yang add()akan melemparkan IllegalStateExceptionjika tidak ada ruang yang tersedia saat ini (dan sebaliknya kembali true) sementara offer()akan kembali falsejika elemen tidak bisa dimasukkan karena pembatasan kapasitas.

Alasan mereka sama di a PriorityQueueadalah bahwa antrian ini ditetapkan untuk tidak dibatasi, yaitu tidak ada batasan kapasitas. Jika tidak ada batasan kapasitas, kontrak add()dan offer()menampilkan perilaku yang sama.

Peter
sumber
2

Saya akan menulis kode contoh kontrak java untuk metode penawaran dan menambahkan metode yang menunjukkan perbedaannya.

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
Aslam jawab
sumber
0

Sumber: http://docs.oracle.com/javase/6/docs/api/java/util/Queue.html

Metode penawaran menyisipkan elemen jika memungkinkan, jika tidak mengembalikan false. Ini berbeda dengan metode Collection.add, yang bisa gagal menambahkan elemen hanya dengan melontarkan pengecualian yang tidak dicentang. Metode penawaran dirancang untuk digunakan ketika kegagalan adalah kejadian normal, bukan kejadian luar biasa, misalnya, dalam antrian berkapasitas tetap (atau "terbatas").

Yeshodhan Kulkarni
sumber