Jaka jest różnica między metodami add i offer w kolejce w Javie?


109

Weźmy PriorityQueuena przykład http://java.sun.com/j2se/1.5.0/docs/api/java/util/PriorityQueue.html#offer(E)

Czy ktoś może mi podać przykład, w Queuektórym metody addi offersą różne?

Według Collectiondokumentu addmetoda ta często stara się zapewnić istnienie elementu w obrębie, Collectiona nie dodawać duplikatów. Więc moje pytanie brzmi: jaka jest różnica między metodami addi offer?

Czy to dlatego, że offermetoda i tak doda duplikaty? (Wątpię, czy dzieje się tak dlatego, że gdyby a Collectionmiał tylko odrębne elementy, pozwoliłoby to obejść).

EDIT: w i metody są takie same metody (patrz moją odpowiedź poniżej). Czy ktoś może mi podać przykład klasy, w której metody i są różne?PriorityQueueaddofferaddoffer

Odpowiedzi:


148

Wydaje mi się, że różnica tkwi w umowie, że gdy elementu nie można dodać do kolekcji, addmetoda zgłasza wyjątek i offertego nie robi.

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

Jeśli kolekcja odmówi dodania określonego elementu z jakiegokolwiek innego powodu niż to, że już zawiera element, musi zgłosić wyjątek (zamiast zwracać false). To zachowuje niezmienność, że kolekcja zawsze zawiera określony element po zwróceniu tego wywołania.

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

Jeśli to możliwe, wstawia określony element do tej kolejki. W przypadku korzystania z kolejek, które mogą narzucać ograniczenia wstawiania (na przykład ograniczenia pojemności), oferta metody jest ogólnie lepsza niż metoda Collection.add (E), która może nie wstawić elementu tylko przez zgłoszenie wyjątku.


4
+1 za znalezienie fragmentu o tym, kiedy używać, offera kiedy add.
Finbarr

28

Nie ma różnicy w realizacji PriorityQueue.add:

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

W AbstractQueuerzeczywistości istnieje różnica:

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

Wiem, właśnie opublikowałem tę odpowiedź kilka minut temu. Czy znasz jakieś klasy, w których addmetoda różni się od offermetody?
Finbarr

13

Różnica między offeri addjest wyjaśniona przez te dwa fragmenty z javadocs:

Z Collectioninterfejsu:

Jeśli kolekcja odmawia addokreślonego elementu z jakiegokolwiek innego powodu niż to, że już zawiera element, musi zgłosić wyjątek (zamiast zwracać false). To zachowuje niezmienność, że kolekcja zawsze zawiera określony element po zwróceniu tego wywołania.

Z Queueinterfejsu

W przypadku korzystania z kolejek, które mogą narzucać ograniczenia wstawiania (na przykład ograniczenia pojemności), metoda offerMethod jest ogólnie lepsza niż metoda Collection.add(E), która może nie wstawić elementu tylko przez zgłoszenie wyjątku.

PriorityQueueto Queueimplementacja, która nie nakłada żadnych ograniczeń wstawiania. Dlatego metody addi offermają tę samą semantykę.

Z kolei ArrayBlockingQueuejest to implementacja, w której offeri addzachowują się inaczej, w zależności od tego, w jaki sposób została utworzona instancja kolejki.


8

Różnica jest następująca:

  • offer - próbuje dodać element do kolejki i zwraca false, jeśli elementu nie można dodać (jak w przypadku, gdy kolejka jest pełna) lub true, jeśli element został dodany i nie zgłasza żadnego konkretnego wyjątku .

  • add metoda - próbuje dodać element do kolejki, zwraca wartość true, jeśli element został dodany, lub zgłasza wyjątek IllegalStateException, jeśli obecnie nie ma wolnego miejsca.


1
metoda add nigdy nie zwraca wartości false, jeśli element jest już dostępny 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. oferta (b); boolean is6 = q. oferta (b); System.out.println ("qq ::" + q);
Raj

Dzięki, Raj! Zaktualizowałem moją odpowiedź powyżej. Dokumentacja Oracle mówi: „Metoda offer wstawia element, jeśli to możliwe, w przeciwnym razie zwraca wartość false. Różni się to od metody Collection.add, która może nie dodać elementu tylko przez zgłoszenie niezaznaczonego wyjątku. Metoda offer jest przeznaczona do użycia w przypadku niepowodzenia to normalne, a nie wyjątkowe zdarzenie, na przykład w kolejkach o stałej pojemności (lub „ograniczonych”). "
Maksym Ovsianikov

7

z kodu źródłowego w jdk 7 w następujący sposób:

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

możemy łatwo wiedzieć, że funkcja add zwróci wartość true po pomyślnym dodaniu nowego elementu do kolejki, ale wyrzuci wyjątek, gdy się nie powiedzie.


5

Do Queueinterfejsu określa, że add()rzuci IllegalStateExceptionjeśli nie jest obecnie dostępna przestrzeń (i inaczej powrotne true), podczas gdy offer()powróci false, jeśli element nie może być włożona z powodu ograniczeń pojemności.

Powodem, dla którego są takie same w a, PriorityQueuejest to, że ta kolejka jest określona jako nieograniczona, tj. Nie ma ograniczeń pojemności. W przypadku braku ograniczeń przepustowości umowy add()i offer()zachowują się tak samo.


2

Napiszę przykładowy kod kontraktu java dla metody oferty i dodam metodę pokazującą czym się różnią.

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

Źródło: http://docs.oracle.com/javase/6/docs/api/java/util/Queue.html

Metoda offer wstawia element, jeśli to możliwe, w przeciwnym razie zwraca false. Różni się to od metody Collection.add, która może nie dodać elementu tylko przez zgłoszenie niezaznaczonego wyjątku. Metoda sprzedaży jest przeznaczona do użycia, gdy awaria jest normalnym, a nie wyjątkowym zdarzeniem, na przykład w kolejkach o stałej pojemności (lub „ograniczonych”).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.