ArrayQueue
- 底层使用数组存储
- 添加时放置于tail指定的位置,从尾部开始添加,尾部满时,继续从头部开始添加,直到head位置,此时队列已满
- head 和tail 操作可以在数组上循环。
public boolean add(T o) {
queue[tail] = o;
int newtail = (tail + 1) % capacity;
if (newtail == head)
throw new IndexOutOfBoundsException("Queue full");
tail = newtail;
return true; // we did add something
}
- 移除时,只能从头部移除
// 构建一个指定初始容量的ArrayQueue,数据为空
public ArrayQueue(int capacity) {
// 容量,resize
this.capacity = capacity + 1;
// 存储数据
this.queue = newArray(capacity + 1);
// 头部元素
this.head = 0;
// 尾部元素
this.tail = 0;
}
// 获取队列的大小
public int size() {
// Can‘t use % here because it‘s not mod: -3 % 2 is -1, not +1.
int diff = tail - head;
if (diff < 0)
diff += capacity;
return diff;
}
// 获取指定位置的元素
public T get(int i) {
int size = size();
if (i < 0 || i >= size) {
final String msg = "Index " + i + ", queue size " + size;
throw new IndexOutOfBoundsException(msg);
}
//head
int index = (head + i) % capacity;
return queue[index];
}
示例
X 代表未填充元素,E代表填充元素,h代表头部元素位置;t代表尾部元素位置
- 初始化 , capacity 指定为4
位置 |
位置 |
位置 |
位置 |
位置 |
X |
X |
X |
X |
X |
h |
|
|
|
|
t |
|
|
|
|
- 添加4元素
位置 |
位置 |
位置 |
位置 |
位置 |
E |
E |
E |
E |
X |
h |
|
|
|
|
|
|
|
|
t |
- 移除二个元素
位置 |
位置 |
位置 |
位置 |
位置 |
X |
X |
E |
E |
X |
|
|
h |
|
|
|
|
|
|
t |
- 添加一个元素
位置 |
位置 |
位置 |
位置 |
位置 |
X |
X |
E |
E |
E |
|
|
h |
|
|
t |
|
|
|
|
- 添加一个元素
位置 |
位置 |
位置 |
位置 |
位置 |
E |
X |
E |
E |
E |
|
|
h |
|
|
|
t |
|
|
|
- 移除三个元素
位置 |
位置 |
位置 |
位置 |
位置 |
E |
X |
X |
X |
X |
h |
|
|
|
|
|
t |
|
|
|
欢迎关注我的公众号:
阅读com.sun.jmx.remote.internal.ArrayQueue源码Note
原文:https://www.cnblogs.com/zzzzzzzh/p/12776051.html