Sự khác biệt giữa các phương thức thêm và chào hàng trong Hàng đợi trong Java là gì?


109

Lấy PriorityQueueví dụ http://java.sun.com/j2se/1.5.0/docs/api/java/util/PosystemQueue.html#offer(E)

Bất cứ ai có thể cho tôi một ví dụ về một Queuenơi mà các phương pháp addofferkhác nhau?

Theo Collectiontài liệu, addphương pháp này thường sẽ tìm cách đảm bảo rằng một phần tử tồn tại bên trong Collectionthay vì thêm các bản sao. Vì vậy, câu hỏi của tôi là, sự khác biệt giữa phương pháp addofferphương pháp là gì?

Có phải là offerphương pháp sẽ thêm các bản sao bất kể? (Tôi nghi ngờ rằng đó là bởi vì nếu a Collectionchỉ nên có các phần tử riêng biệt thì điều này sẽ phá vỡ điều đó).

EDIT: Trong một PriorityQueuesự addofferphương pháp là phương pháp tương tự (xem câu trả lời của tôi dưới đây). Bất cứ ai có thể cho tôi một ví dụ về một lớp mà các phương thức addofferphương thức khác nhau?

Câu trả lời:


148

Tôi đoán sự khác biệt là trong hợp đồng, rằng khi phần tử không thể được thêm vào bộ sưu tập, addphương thức ném một ngoại lệ và offerkhông.

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

Nếu một tập hợp từ chối thêm một phần tử cụ thể vì bất kỳ lý do nào khác ngoài lý do nó đã chứa phần tử đó, nó phải ném một ngoại lệ (thay vì trả về false). Điều này bảo toàn bất biến mà một tập hợp luôn chứa phần tử được chỉ định sau khi cuộc gọi này trả về.

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

Chèn phần tử được chỉ định vào hàng đợi này, nếu có thể. Khi sử dụng hàng đợi có thể áp đặt các hạn chế chèn (ví dụ: giới hạn dung lượng), phương thức cung cấp thường thích hợp hơn phương thức Collection.add (E), phương thức này có thể không chèn một phần tử chỉ bằng cách ném một ngoại lệ.


4
+1 để tìm đoạn mã đó về thời điểm sử dụng offerso với add.
Finbarr

28

Không có sự khác biệt cho việc triển khai PriorityQueue.add:

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

AbstractQueuethực sự có một sự khác biệt:

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

Tôi biết, tôi vừa tự mình đăng câu trả lời đó cách đây vài phút. Bạn có biết bất kỳ lớp nào mà addphương thức khác với offerphương thức không?
Finbarr

13

Sự khác biệt giữa offeraddđược giải thích bởi hai đoạn trích này từ javadocs:

Từ Collectiongiao diện:

Nếu một tập hợp từ chối addmột phần tử cụ thể vì bất kỳ lý do nào khác với lý do nó đã chứa phần tử đó, nó phải ném một ngoại lệ (thay vì trả về false). Điều này bảo toàn bất biến mà một tập hợp luôn chứa phần tử được chỉ định sau khi cuộc gọi này trả về.

Từ Queuegiao diện

Khi sử dụng các hàng đợi có thể áp đặt các hạn chế chèn (ví dụ: giới hạn dung lượng), phương thức offerthường được ưu tiên hơn phương thức Collection.add(E), phương thức này có thể không chèn một phần tử chỉ bằng cách ném một ngoại lệ.

PriorityQueuelà một Queuetriển khai không áp đặt bất kỳ hạn chế chèn nào. Do đó, các phương thức addoffercó cùng ngữ nghĩa.

Ngược lại, ArrayBlockingQueuelà một triển khai trong đó offeraddhoạt động khác nhau, tùy thuộc vào cách hàng đợi được khởi tạo.


8

Sự khác biệt là sau:

  • phương thức cung cấp - cố gắng thêm một phần tử vào hàng đợi và trả về false nếu phần tử không thể được thêm (như trong trường hợp hàng đợi đầy) hoặc true nếu phần tử đã được thêm vào và không đưa ra bất kỳ ngoại lệ cụ thể nào .

  • add method - cố gắng thêm một phần tử vào hàng đợi, trả về true nếu phần tử đã được thêm vào hoặc ném IllegalStateException nếu hiện không có chỗ trống.


1
phương thức add không bao giờ trả về false nếu phần tử đã có sẵn Queue <String> q = new PriorityQueue <> (); Chuỗi 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

Cảm ơn, Raj! Tôi đã cập nhật câu trả lời của mình ở trên. Tài liệu của Oracle cho biết: "Phương thức offer sẽ chèn một phần tử nếu có thể, nếu không sẽ trả về false. Điều này khác với phương thức Collection.add, phương thức này có thể không thêm một phần tử chỉ bằng cách đưa ra một ngoại lệ không được chọn. Phương thức offer được thiết kế để sử dụng khi bị lỗi là một sự xuất hiện bình thường, thay vì đặc biệt, ví dụ, trong hàng đợi có dung lượng cố định (hoặc "giới hạn"). "
Maksym Ovsianikov

7

từ mã nguồn trong jdk 7 như sau:

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

chúng ta có thể dễ dàng biết rằng hàm add sẽ trả về true khi thêm thành công một phần tử mới vào hàng đợi, nhưng ném một ngoại lệ khi không thành công.


5

Các Queuequy định cụ thể giao diện mà add()sẽ ném một IllegalStateExceptionnếu không có không gian hiện có (và nếu không trở lại true) trong khi offer()sẽ trở lại falsenếu các phần tử không thể được chèn do hạn chế năng lực.

Lý do chúng giống nhau ở điểm a PriorityQueuelà hàng đợi này được chỉ định là không bị ràng buộc, tức là không có giới hạn dung lượng. Trong trường hợp không hạn chế năng lực, các hợp đồng của add()offer()hiển thị cùng một hành vi.


2

Tôi sẽ viết mã ví dụ hợp đồng java cho phương thức ưu đãi và thêm phương thức cho thấy chúng khác nhau như thế nào.

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

Nguồn: http://docs.oracle.com/javase/6/docs/api/java/util/Queue.html

Phương thức offer sẽ chèn một phần tử nếu có thể, nếu không sẽ trả về false. Điều này khác với phương thức Collection.add, phương thức này có thể không thêm một phần tử chỉ bằng cách ném một ngoại lệ không được chọn. Phương thức ưu đãi được thiết kế để sử dụng khi lỗi là một điều bình thường, thay vì xảy ra đặc biệt, ví dụ, trong các hàng đợi có dung lượng cố định (hoặc "có giới hạn").

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.