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

테이크 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



답변

차이점은 계약에 있다고 생각합니다. 요소를 컬렉션에 추가 할 수 없을 때 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)보다 선호되며 예외를 발생 시켜서 만 요소를 삽입하는 데 실패 할 수 있습니다.


답변

의 구현에는 차이가 없습니다 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");
}


답변

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

로부터 Collection인터페이스 :

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

로부터 Queue인터페이스

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

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

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


답변

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

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

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


답변

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

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

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


답변

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

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


답변

제안 방법에 대한 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