#飞利浦·斯塔克#Java阻塞队列四组API介绍( 二 )



第一组API , 会抛出异常的:一言不合就开干添加元素:add(e):
当队列未满的时候 , 向队列中添加元素正常;当队列满的时候 , 再向队列中添加元素的话 , 会抛出throw new IllegalStateException(\"Queue full\");异常 。
代码演示及运行结果:
源码分析:

从源码中 , 我们可以看到 , 调用的是offer(e)方法 , 在下文中 , 我们也会讲解到的 。 如果offer方法返回true的话 , 就直接返回 , 否则就抛出:throw new IllegalStateException(\"Queue full\");异常的 。

删除元素:remove()
当队列不为空的时候 , 调用该方法 , 返回被移除的元素;当队列为空的时候在调用该方法 , 会抛出异常 。
来看看源码:
源码中调用了poll方法 , 当获取到的对象不为空的时候 , 返回获取到的对象;如果为空的话 , 就抛出:throw new NoSuchElementException();异常 。

判断当前队列的队首元素:element()

该方法是获取队首元素的 。 当队列不为空的时候 , 返回队列中当前队首元素;如果队列为空的时候 , 调用该方法会抛异常的 。
我们来看看源码:
获取队首元素代码演示及运行结果如下图:

第一组API三个方法我们都讲解完了 。 Add/remove/element方法 。 最大的特点就是 , 队列为空或者是队列满了 , 继续操作队列的话 , 就会抛出异常 。 这个凯哥根据就像我们人的一生中少年时期一样 , 初生牛犊不怕虎 , 遇到什么不服的或者是不顺心的就暴躁了 , 碰不得 , 一碰就爆炸 。 一言不合就开干!

第二组:带有返回值的 , 不会抛出异常:为人处事会圆滑了第二组api的不像第一组那么暴躁如雷了 , 不想就抛异常 。 第二组 , 不会抛出异常了 。 我们接着来看看:
添加元素:offer(e)
需要主要:这里的offer方法只有一个参数 , 这个和我们后面讲解的一组的区别
当队列未满的时候 , 向队列中添加元素 , 返回true;当队列已经满了 , 继续向队列中添加元素的话 , 不会抛出异常 , 会返回false.
源码分析:
从源码中 , 我们可以看到 , offer(e)的方法中 , 有个count计数器 , 每次添加元素后 , 都会count++ 。 当count的值等于队列的长度的时候 , 返回false.而不是抛出异常 。 我们来用代码演示.

Offer(e)添加元素代码演示及运行结果:
删除元素:poll()

注意:参数为空哦!
当队列不为空的时候 , 返回被移除的元素 , 当队列为空的时候 , 返回null.而不是抛出异常 。
源码分析:
从源码中 , 我们将看到count这个计数器又起作用了 。 先判断count是否==0
如果不等于0 , 调用dequeue方法 , count-- , 然后将获取到的元素返回;
如果count == 0的话 , 直接返回null.
源码如下图:
代码演示及运行结果:

获取队首元素:peek()

当队列不为空的时候 , 返回当前队列的队首元素;如果队列为空的时候 , 返回null , 而不是抛出异常 。
源码分析:
在源码中 , 我们可以看到调用了itemAt(takeIndex)方法 。 但是在这个方法后面有这么已经注释:null when queue is empty 。 源码如下图:
代码演示:

从运行的结果 , 我们可以看到 , 当移除最后一个元素:kaigejava的时候 , 获取到的队首元素已经为null了 。 因为队列为空了 , 所以 , 就算后面还有循环 , 获取到的队首元素依然是null , 而不是抛出异常 。 运行结果如下图:
从第二组API中 , 我们可以看到 , 不像第一组那么极端了 。 当队列为空或者是队列满的时候 , 返回数据告知对象 。 这个就像我们人生由少年时代 , 进入了青年时代 , 经过学校的洗礼之后 , 为人处事学会了圆滑了 。


推荐阅读