Weźmy PriorityQueue
na 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 Queue
którym metody add
i offer
są różne?
Według Collection
dokumentu add
metoda ta często stara się zapewnić istnienie elementu w obrębie, Collection
a nie dodawać duplikatów. Więc moje pytanie brzmi: jaka jest różnica między metodami add
i offer
?
Czy to dlatego, że offer
metoda i tak doda duplikaty? (Wątpię, czy dzieje się tak dlatego, że gdyby a Collection
miał 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?PriorityQueue
add
offer
add
offer
offer
a kiedyadd
.Nie ma różnicy w realizacji
PriorityQueue.add
:W
AbstractQueue
rzeczywistości istnieje różnica:źródło
add
metoda różni się odoffer
metody?Różnica między
offer
iadd
jest wyjaśniona przez te dwa fragmenty z javadocs:Z
Collection
interfejsu:Z
Queue
interfejsuPriorityQueue
toQueue
implementacja, która nie nakłada żadnych ograniczeń wstawiania. Dlatego metodyadd
ioffer
mają tę samą semantykę.Z kolei
ArrayBlockingQueue
jest to implementacja, w którejoffer
iadd
zachowują się inaczej, w zależności od tego, w jaki sposób została utworzona instancja kolejki.źródło
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.
źródło
z kodu źródłowego w jdk 7 w następujący sposób:
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.
źródło
Do
Queue
interfejsu określa, żeadd()
rzuciIllegalStateException
jeśli nie jest obecnie dostępna przestrzeń (i inaczej powrotnetrue
), podczas gdyoffer()
powrócifalse
, jeśli element nie może być włożona z powodu ograniczeń pojemności.Powodem, dla którego są takie same w a,
PriorityQueue
jest to, że ta kolejka jest określona jako nieograniczona, tj. Nie ma ograniczeń pojemności. W przypadku braku ograniczeń przepustowości umowyadd()
ioffer()
zachowują się tak samo.źródło
Napiszę przykładowy kod kontraktu java dla metody oferty i dodam metodę pokazującą czym się różnią.
źródło
Ź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”).
źródło