Java Queue中add/offer/put,element/peek,remove/poll/take的区别和联系
0x00 add()、offer()、put()
add():将指定的元素插入到此队列中(如果立即可行且不会违反容量限制),在成功时返回 true,如果当前没有可用空间,则抛出 IllegalStateException。
offer():将指定元素插入到此队列的尾部(如果立即可行且不会超出此队列的容量),在成功时返回 true,如果此队列已满,则返回 false。当使用有容量限制的队列时,此方法通常要优于 add 方法,后者可能无法插入元素,而只是抛出一个异常。
put():将指定元素插入到此队列的尾部,如有必要,则等待空间变得可用。put方法只存在于LinkedBlockingQueue/ArrayBlockingQueue类型的阻塞队列中,使用put方法向已满的队列添加新元素时,代码会阻塞在put处。
深入剖析java并发之阻塞队列LinkedBlockingQueue与ArrayBlockingQueue
public static void main(String args[]){
try {
LinkedBlockingQueue<String> queue=new LinkedBlockingQueue(2);
queue.put("This");
queue.put("is");
queue.put("me");
// 代码会阻塞在queue.put("me"); 下边的print不会输出
System.out.println("me");
} catch (Exception e) {
e.printStackTrace();
}
}
0x01 poll()、remove()、take()
remove()
和poll()
方法都是从队列中删除第一个元素。如果队列元素为空,调用remove()
的行为与Collection接口的版本相似会抛出异常,但是新的poll()
方法在用空集合调用时只是返回null。因此新的方法更适合容易出现异常条件的情况。而take()
与上面的put()
方法对应,只存在于阻塞队列中,且获得空队列的头部元素,会阻塞在获取的位置。
0x02 element()、peek()
element()
和peek()
用于在队列的头部查询元素。与remove()
方法类似,在队列为空时,element()
抛出一个异常,而peek()
返回null。
add | 增加一个元素 | 如果队列已满,则抛出一个IllegalStateException异常 |
remove | 移除并返回队列头部的元素 | 如果队列为空,则抛出一个NoSuchElementException异常 |
element | 返回队列头部的元素 | 如果队列为空,则抛出一个NoSuchElementException异常 |
offer | 添加一个元素并返回true | 如果队列已满,则返回false |
poll | 移除并返回队列头部的元素 | 如果队列为空,则返回null |
peek | 返回队列头部的元素 | 如果队列为空,则返回null |
put | 添加一个元素 | 如果队列已满,则阻塞 |
take | 移除并返回队列头部的元素 | 如果队列为空,则阻塞 |