【发布时间】:2015-06-03 06:04:54
【问题描述】:
我们如何在Android中实现循环缓冲区的实现?
如果存在预定义的方法,我们是否可以重用?或者我们是否支持 Android 中的 C 标准库?
【问题讨论】:
我们如何在Android中实现循环缓冲区的实现?
如果存在预定义的方法,我们是否可以重用?或者我们是否支持 Android 中的 C 标准库?
【问题讨论】:
在 Android 开发中,首选是使用 Java 而不是 C 来实现这些东西。当然,您可以在 C 中(使用 JNI)执行此操作,但这需要一定的开销,即您需要实现自己的垃圾收集逻辑以及循环缓冲区的代码,而在 Java 中,这可以自动实现。 .如果它适用于您的情况,请参阅下面的课程..
import java.nio.BufferOverflowException;
import java.nio.BufferUnderflowException;
public class CustomCircularBuffer<T> {
private T[] buffer;
private int tail;
private int head;
public CustomCircularBuffer(int n) {
buffer = (T[]) new Object[n];
tail = 0;
head = 0;
}
public void add(T toAdd) {
if (head != (tail - 1)) {
buffer[head++] = toAdd;
} else {
throw new BufferOverflowException();
}
head = head % buffer.length;
}
public T get() {
T t = null;
int adjTail = tail > head ? tail - buffer.length : tail;
if (adjTail < head) {
t = (T) buffer[tail++];
tail = tail % buffer.length;
} else {
throw new BufferUnderflowException();
}
return t;
}
public String toString() {
return "CustomCircularBuffer(size=" + buffer.length + ", head=" + head + ", tail=" + tail + ")";
}
}
这里有一些其他有用的链接可以提供必要的解释..
【讨论】:
我刚刚意识到ArrayDeque 将是一个很好的实现。
还有来自 Android 支持的 CircularArray。
CircularArray 是一个通用的循环数组数据结构,它提供 O(1) 随机读取,O(1) 前置和 O(1) 附加。圆形阵列 当添加的项目数量结束时自动增加容量 它的容量。
我无法判断它的性能,但快速浏览一下 Javadocs,它似乎在设计时就考虑到了效率。现在不太确定了。
【讨论】: