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

flush() and isEmpty() methods for a ring buffer without using .size() in Java

我正在尝试在 Java 中实现一个字符环(循环队列),但我很难思考如何在不使用 .size() 方法的情况下检测缓冲区是否为空阵列。

因为如果 Ring Buffer 已满 read pointer == write pointer 但如果 R​​ing Buffer 为空,read pointer == write pointer 所以我不确定如何正确检查 isEmpty()。我知道我可以用 .size() 做到这一点,但我想弄清楚是否有可能在没有的情况下实现它。

我知道我需要在数组末尾浪费一个 space 但我不确定如何检查它。检查会像 if (head != (tail - 1)) 一样简单吗?

此外,我正在尝试编写 flush() 方法,我认为我可以使用如下所示的 for each 循环来实现:

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

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

非常感谢任何帮助。完整的class如下供参考:

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;
    }

}

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

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

始终保留一个空位

缓冲区永远不会满到最后一项,但总会有一个空位。这意味着你可以像这样区分满的和空的:

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;
}

这意味着缓冲区将被视为空的。不管什么数据真正写入内存都会被忽略然后被覆盖。


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