테이크 PriorityQueue
예를 http://java.sun.com/j2se/1.5.0/docs/api/java/util/PriorityQueue.html#offer(E)
사람이 나에게의 예를 줄 수 Queue
곳 add
과 offer
방법이 다르다?
Collection
문서 에 따르면 이 add
메서드는 Collection
중복을 추가 하는 대신 요소가 내부에 존재하는지 확인하는 경우가 많습니다 . 그래서 제 질문은 방법 add
과 offer
방법 의 차이점은 무엇 입니까?
그것은인가요 offer
방법에 관계없이 중복을 추가 할 것인가? (나는 a Collection
가 고유 한 요소 만 가져야 한다면 그것을 우회 할 수 있기 때문인지 의심합니다 .)
편집 : A의 및 방법은 동일한 방법입니다 (내 대답은 아래 참조). 누구든지 및 메서드가 다른 클래스의 예를 줄 수 있습니까 ?PriorityQueue
add
offer
add
offer
답변
차이점은 계약에 있다고 생각합니다. 요소를 컬렉션에 추가 할 수 없을 때 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
와는 add
JavaDoc을 행 두 발췌하여 설명한다 :
로부터 Collection
인터페이스 :
컬렉션이
add
이미 요소를 포함하고있는 것 이외의 이유로 특정 요소를 거부 하는 경우 (false를 반환하는 대신) 예외를 throw해야합니다. 이렇게하면이 호출이 반환 된 후 컬렉션에 항상 지정된 요소가 포함된다는 불변성이 유지됩니다.
로부터 Queue
인터페이스
삽입 제한 (예 : 용량 경계)을 부과 할 수있는 큐를 사용할 때
offer
일반적으로 method 가 method 보다 선호되며Collection.add(E)
예외를 발생시켜 요소를 삽입하는 데 실패 할 수 있습니다.
PriorityQueue
A는 Queue
어떤 삽입 제한을 부과하지 않는 구현. 따라서 add
및 offer
메서드는 동일한 의미를 갖습니다.
대조적으로, ArrayBlockingQueue
어떤 구현에서 offer
와 add
큐 인스턴스화 방법에 따라 행동하고 다르게.
답변
차이점은 다음과 같습니다.
-
제공 방법은 – 시도는 큐에 요소를 추가하고 반환하는 잘못된 요소를 추가 할 수없는 경우 (같은 큐가 가득 차면 경우), 또는 진정한 요소가 추가 된 경우, 그리고 특정 예외를 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