Java의 대기열에서 add 및 offer 메소드의 차이점은 무엇입니까?


109

테이크 PriorityQueue예를 http://java.sun.com/j2se/1.5.0/docs/api/java/util/PriorityQueue.html#offer(E)

사람이 나에게의 예를 줄 수 Queueaddoffer방법이 다르다?

Collection문서 에 따르면 이 add메서드는 Collection중복을 추가 하는 대신 요소가 내부에 존재하는지 확인하는 경우가 많습니다 . 그래서 제 질문은 방법 addoffer방법 의 차이점은 무엇 입니까?

그것은인가요 offer방법에 관계없이 중복을 추가 할 것인가? (나는 a Collection가 고유 한 요소 만 가져야 한다면 그것을 우회 할 수 있기 때문인지 의심합니다 .)

편집 : A의 및 방법은 동일한 방법입니다 (내 대답은 아래 참조). 누구든지 및 메서드가 다른 클래스의 예를 줄 수 있습니까 ?PriorityQueueaddofferaddoffer

답변:


148

차이점은 계약에 있다고 생각합니다. 요소를 컬렉션에 추가 할 수 없을 때 add메서드는 예외를 throw하고 offer그렇지 않습니다.

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

컬렉션이 이미 요소를 포함하고있는 것 이외의 다른 이유로 특정 요소 추가를 거부 하는 경우 (false를 반환하는 대신) 예외 를 throw해야합니다 . 이렇게하면이 호출이 반환 된 후 컬렉션에 항상 지정된 요소가 포함된다는 불변성이 유지됩니다.

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

가능한 경우 지정된 요소를이 큐에 삽입합니다. 삽입 제한 (예 : 용량 경계)을 부과 할 수있는 큐를 사용할 때 일반적으로 메소드 offer가 메소드 Collection.add (E)보다 선호되며 예외를 발생 시켜서 만 요소를 삽입하는 데 실패 할 수 있습니다.


4
사용시기 offeradd.
Finbarr

28

의 구현에는 차이가 없습니다 PriorityQueue.add.

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

들어 AbstractQueue이 실제로 차이가 있습니다 :

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

알아요, 제가 몇 분 전에 직접 그 답변을 게시했습니다. add방법이 방법과 다른 클래스를 알고 offer있습니까?
Finbarr

13

차이 offer와는 addJavaDoc을 행 두 발췌하여 설명한다 :

로부터 Collection인터페이스 :

컬렉션이 add이미 요소를 포함하고있는 것 이외의 이유로 특정 요소를 거부 하는 경우 (false를 반환하는 대신) 예외를 throw해야합니다. 이렇게하면이 호출이 반환 된 후 컬렉션에 항상 지정된 요소가 포함된다는 불변성이 유지됩니다.

로부터 Queue인터페이스

삽입 제한 (예 : 용량 경계)을 부과 할 수있는 큐를 사용할 때 offer일반적으로 method 가 method 보다 선호되며 Collection.add(E)예외를 발생시켜 요소를 삽입하는 데 실패 할 수 있습니다.

PriorityQueueA는 Queue어떤 삽입 제한을 부과하지 않는 구현. 따라서 addoffer메서드는 동일한 의미를 갖습니다.

대조적으로, ArrayBlockingQueue어떤 구현에서 offeradd큐 인스턴스화 방법에 따라 행동하고 다르게.


8

차이점은 다음과 같습니다.

  • 제공 방법은 - 시도는 큐에 요소를 추가하고 반환하는 잘못된 요소를 추가 할 수없는 경우 (같은 큐가 가득 차면 경우), 또는 진정한 요소가 추가 된 경우, 그리고 특정 예외를 throw하지 않습니다 .

  • add 메소드-큐에 요소를 추가하려고 시도 하고 요소가 추가 된 경우 true를 반환 하거나 현재 사용 가능한 공간이없는 경우 IllegalStateException을 throw합니다.


1
요소가 이미 사용 가능한 경우 add 메서드는 false를 반환하지 않습니다. Queue <String> q = new PriorityQueue <> (); String b = "java"; 부울 is1 = q.add (b); 부울 is2 = q.add ( "java"); 부울 is3 = q.add (b); 부울 is4 = q.offer ( "java"); 부울 is5 = q.offer (b); 부울 is6 = q.offer (b); System.out.println ( "qq ::"+ q);
Raj

고마워, 라지! 위의 응답을 업데이트했습니다. Oracle 설명서에 따르면 "제공 방법은 가능한 경우 요소를 삽입하고 그렇지 않으면 false를 반환합니다. 이것은 확인되지 않은 예외를 발생시켜 요소를 추가하는 데 실패 할 수있는 Collection.add 방법과 다릅니다. 제공 방법은 실패 할 때 사용하도록 설계되었습니다. 예를 들어 고정 용량 (또는 "제한된") 대기열에서 예외가 아닌 정상적인 발생입니다. "
Maksym Ovsianikov

7

다음과 같이 jdk 7의 소스 코드에서 :

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

새 요소를 큐에 성공적으로 추가하면 add 함수가 true를 반환하지만 실패하면 예외를 throw한다는 것을 쉽게 알 수 있습니다.


5

Queue인터페이스를 지정 add()가 발생합니다 IllegalStateException공백이 현재 사용할 수없는 경우 (그렇지 않으면 반환 true하면서) offer()돌아갑니다 false요소가 용량 제한으로 인해 삽입 할 수없는 경우.

에서 동일한 이유 PriorityQueue는이 대기열이 제한되지 않도록 지정 되었기 때문입니다. 즉, 용량 제한이 없습니다. 용량 제한이없는 경우 계약 add()offer()동일한 동작을 표시합니다.


2

제안 방법에 대한 Java 계약 예제 코드를 작성하고 차이점을 보여주는 방법을 추가합니다.

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

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

offer 메소드는 가능한 경우 요소를 삽입하고 그렇지 않으면 false를 리턴합니다. 이것은 체크되지 않은 예외를 던져서 만 요소를 추가하지 못할 수있는 Collection.add 메서드와 다릅니다. 제안 방법은 예를 들어 고정 용량 (또는 "제한된") 대기열에서 오류가 예외적 인 발생이 아니라 정상일 때 사용하도록 설계되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.