Java'da bir Sıradaki ekleme ve teklif yöntemleri arasındaki fark nedir?


109

Al PriorityQueueörneğin http://java.sun.com/j2se/1.5.0/docs/api/java/util/PriorityQueue.html#offer(E)

Biri bana ve yöntemlerinin farklı Queueolduğu bir örnek verebilir mi?addoffer

Belgeye göre Collection, addyöntem genellikle Collectionkopyaları eklemek yerine içinde bir öğenin var olmasını sağlamaya çalışacaktır . Öyleyse sorum şu, addve offeryöntemler arasındaki fark nedir?

O mi offeryöntem ne olursa olsun çiftleri katacak? (Şundan şüpheliyim, çünkü eğer Collectiona'nın sadece farklı unsurları olması gerekiyorsa, bu bunu engelleyecektir).

DÜZENLEME: Bir de ve yöntemleri aynı yöntemdir (aşağıda benim cevabını bakın). Biri bana ve yöntemlerinin farklı olduğu bir sınıf örneği verebilir mi?PriorityQueueaddofferaddoffer

Yanıtlar:


148

Sanırım fark sözleşmede, koleksiyona eleman eklenemediğinde addyöntem bir istisna atıyor ve offeryapmıyor.

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

Koleksiyonu zaten eleman içerdiğini dışında herhangi bir nedenden dolayı belirli bir öğe eklemek için reddederse, o atmak gerekir bir istisna (yanlış döndürmek yerine). Bu, bir koleksiyonun bu çağrı döndükten sonra her zaman belirtilen öğeyi içerdiği değişmezi korur.

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

Mümkünse, belirtilen öğeyi bu kuyruğa ekler. Ekleme kısıtlamaları (örneğin kapasite sınırları) uygulayabilen kuyruklar kullanılırken, yöntem teklifi genellikle Collection.add (E) yöntemine tercih edilir ve bu yöntem, yalnızca bir istisna atılarak bir öğe eklenemeyebilir.


4
Ne zaman kullanılacağına dair pasajı bulgu için 1 offervs add.
Finbarr

28

Aşağıdakilerin uygulanmasında hiçbir fark yoktur PriorityQueue.add:

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

Çünkü AbstractQueueaslında bir fark var:

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

Biliyorum, bu cevabı birkaç dakika önce kendim gönderdim. addYöntemin yöntemden farklı olduğu herhangi bir sınıf biliyor musunuz offer?
Finbarr

13

Arasındaki fark offerve addjavadocs bu iki alıntılar ile açıklanmaktadır:

Gönderen Collectionarayüzüne:

Bir koleksiyon addbelirli bir öğeyi zaten içermesi dışında herhangi bir nedenle reddederse , bir istisna atması gerekir (yanlış döndürmek yerine). Bu, bir koleksiyonun bu çağrı döndükten sonra her zaman belirtilen öğeyi içerdiği değişmezi korur.

Gönderen Queuearayüzünde

Ekleme kısıtlamaları uygulayabilen kuyruklar kullanılırken (örneğin kapasite sınırları), yöntem offergenellikle yönteme tercih edilir ve Collection.add(E)yalnızca bir istisna atılarak bir öğe eklenemeyebilir.

PriorityQueueQueueherhangi bir ekleme kısıtlaması getirmeyen bir uygulamadır. Bu nedenle addve offeryöntemleri aynı anlamlara sahiptir.

Buna karşılık, ArrayBlockingQueueolduğu bir uygulamasıdır offerve addkuyruk örneği edilme biçimine bağlı olarak, farklı davranır.


8

Fark şudur:

  • teklif yöntemi - bir kuyruğa bir öğe eklemeye çalışır ve öğe eklenemezse (örneğin bir kuyruğun dolu olması durumunda) false veya öğe eklendiyse ve belirli bir istisna oluşturmazsa true döndürür .

  • add method - bir kuyruğa bir öğe eklemeye çalışır , öğe eklendiyse true değerini döndürür veya şu anda boş alan yoksa IllegalStateException oluşturur.


1
Öğe zaten mevcutsa add yöntemi hiçbir zaman yanlış döndürmez Queue <String> q = new PriorityQueue <> (); Dize b = "java"; boole 1 = q.add (b); boolean2 = q.add ("java"); boolean 3 = q.add (b); boolean 4 = q.offer ("java"); boolean5 = q.offer (b); boolean6 = q.offer (b); System.out.println ("qq ::" + q);
Raj

Teşekkürler Raj! Cevabımı yukarıda güncelledim. Oracle dokümantasyonu şöyle diyor: "Teklif yöntemi mümkünse bir öğe ekler, aksi takdirde yanlış döndürür. Bu, yalnızca denetlenmemiş bir istisna atarak öğe ekleyemeyen Collection.add yönteminden farklıdır. Teklif yöntemi, başarısız olduğunda kullanılmak üzere tasarlanmıştır. örneğin sabit kapasiteli (veya "sınırlı") kuyruklarda istisnai olmaktan çok normal bir durumdur. "
Maksym Ovsianikov

7

jdk 7'deki kaynak kodundan aşağıdaki gibi:

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

Kuyruğa başarılı bir şekilde yeni bir öğe eklediğinde add işlevinin true döneceğini, ancak başarısız olduğunda bir istisna atacağını kolayca bilebiliriz.


6

QueueArayüz belirtir add()bir atacağım IllegalStateExceptionboşluk mevcut ise (ve aksi dönüş trueyaparken) offer()döndürecektirfalse eleman kapasite kısıtlamaları nedeniyle eklenemez eğer.

A'da aynı olmasının nedeni PriorityQueue, bu kuyruğun sınırsız olarak belirtilmiş olmasıdır, yani kapasite kısıtlaması yoktur. Kapasite kısıtlaması olmaması durumunda, sözleşmeler aynı davranışı sergiler add()ve offer()gösterir.


2

Teklif yöntemi için java sözleşmesi örnek kodunu yazacağım ve nasıl farklı olduklarını gösteren yöntemi ekleyeceğim.

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

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

Teklif yöntemi mümkünse bir öğe ekler, aksi takdirde yanlış döndürür. Bu, yalnızca denetlenmemiş bir istisna atarak öğe ekleyemeyen Collection.add yönteminden farklıdır. Teklif yöntemi, örneğin sabit kapasiteli (veya "sınırlı") kuyruklarda başarısızlık olağandışı bir olaydan ziyade normal bir durum olduğunda kullanılmak üzere tasarlanmıştır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.