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
但如果 Ring 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;
}
这意味着缓冲区将被视为空的。不管什么数据真正写入内存都会被忽略然后被覆盖。
如果您喜欢这个答案,请将其标记为已接受。谢谢。
我正在尝试在 Java 中实现一个字符环(循环队列),但我很难思考如何在不使用 .size() 方法的情况下检测缓冲区是否为空阵列。
因为如果 Ring Buffer 已满 read pointer == write pointer
但如果 Ring 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;
}
这意味着缓冲区将被视为空的。不管什么数据真正写入内存都会被忽略然后被覆盖。
如果您喜欢这个答案,请将其标记为已接受。谢谢。