自己用 Java 写一个阻塞队列(二)
上一章 自己用 Java 写一个阻塞队列 我们写了一个初始阻塞队列。过了几天再回头看。嗯,好像看出哪里不对劲了。尝试改了一下。
原先队列实现的问题
我们说是队列,但是队列的特点是什么?先进先出!在上一个版本中,我们在出队列的时候用的是size值,也就是最后一个位置值。那么想想,我们这算队列么?这是栈啊。这是问题一。
另外我们知道 arraylist 其实其底层实现还是数组,那为啥我不直接用数组了?我基本上也不用 list 的功能啊。那这个地方就是第二个可以优化的地方了。
在第一个版本中为了运行正常,我把 size 的初始值定为 -1,我有点受不了,不行,这个地方我也要优化。
嗯,就优化这三个地方吧。
优化问题 ArrayList
其实际很简单,把 ArrayList 改为数组 Object[]。原先 add 和 get 的地方直接使用 Object[idx] 代替即可。
1 | Object[] objects = new Object[10]; |
优化入队和出队
队列的本质应该是先进先出的数据结构。这里用两个 idx 来代替,一个是入队索引,一个是出队索引。
1 | int enqIdx = 0;//入队的索引号 |
这里有个问题,就是当索引到了我们的数组大小的时候,要把索引重新开始计数。
1 | if((enqIdx+1)==objects.length){ |
开始代码
1 |
|
嗯,看起来有点样子了。不再像之前的感觉了。 毕竟这个版本是正经的队列的先进先出了。而且看不惯的从 -1 计数也改了。其实有时候多加几个指针索引也挺好的。