用于环形缓冲区的flush()和isEmpty()方法,而不使用Java中的.size()

时间:2015-02-22 18:24:20

标签: java pointers queue circular-buffer

我正在尝试用Java实现Chars的Ring(循环队列),并且我很难想到如何在不使用数组上的.size()方法的情况下检测缓冲区是否为isEmpty。

因为如果环形缓冲区已满read pointer == write pointer,而且环形缓冲区为空,read pointer == write pointer所以我不确定如何正确检查isEmpty()。我知道我可以用.size()来做,但是我试图弄清楚它是否可以在没有它的情况下实现它。

我知道我需要在阵列末尾浪费一个空间,但我不确定如何检查它。支票会像if (head != (tail - 1))一样简单吗?

另外,我正在尝试编写flush()方法,并且我认为我可以这样做,每个循环看起来像这样:

for(char c : items){
            c = (Character) null;
        } 

但eclipse向我大喊大叫,因为空指针访问需要自动装箱和拆箱。

非常感谢任何帮助。完整的课程如下:

public class RingBuffer {
    private char[] items;
    private int front;
    private int rear; 
    private int last;

    public RingBuffer(int capacity){
        items = new char[capacity +1];
        front = 0;
        rear = 0;
        last = capacity;

    }

    public void flush(){
        for(char c : items){
            c = (Character) null;
        }       
    }

    public boolean isEmpty(){
        return false;
    }

}

1 个答案:

答案 0 :(得分:1)

您可以在维基百科上阅读有关完整/空缓冲区别的更多信息 http://en.wikipedia.org/wiki/Circular_buffer#Full_.2F_Empty_Buffer_Distinction

描述了多种解决方法。我会指出你提到的那个,也许是最容易理解的。

始终打开一个广告位

缓冲区永远不会填满最后一项,但总会有一个空槽。这意味着您可以像这样区分出full和empty:

public boolean isEmpty() {
     return head == tail;
}

public boolean isFull() {
     // don't forget about the modulo here
     return head == ((tail - 1) % capacity);
}

当刷新时(我会将其命名为clear()),您不必覆盖数组中的数据或分配新数据。你可以设置指向数组开头的指针。

public void clear() {
     head = 0;
     tail = 0;
}

这意味着缓冲区将被视为空。无论什么数据真正写入内存,它们都会被忽略然后被覆盖。


如果你喜欢这个答案,请将其标记为已接受。谢谢。