首页 > 其他 > 详细

阅读com.sun.jmx.remote.internal.ArrayQueue源码Note

时间:2020-04-25 23:34:44      阅读:54      评论:0      收藏:0      [点我收藏+]

ArrayQueue

技术分享图片

  1. 底层使用数组存储
  2. 添加时放置于tail指定的位置,从尾部开始添加,尾部满时,继续从头部开始添加,直到head位置,此时队列已满
  3. 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
    }
  1. 移除时,只能从头部移除
    // 构建一个指定初始容量的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代表尾部元素位置

  1. 初始化 , capacity 指定为4
位置 位置 位置 位置 位置
X X X X X
h
t
  1. 添加4元素
位置 位置 位置 位置 位置
E E E E X
h
t
  1. 移除二个元素
位置 位置 位置 位置 位置
X X E E X
h
t
  1. 添加一个元素
位置 位置 位置 位置 位置
X X E E E
h
t
  1. 添加一个元素
位置 位置 位置 位置 位置
E X E E E
h
t
  1. 移除三个元素
位置 位置 位置 位置 位置
E X X X X
h
t

欢迎关注我的公众号:

技术分享图片

阅读com.sun.jmx.remote.internal.ArrayQueue源码Note

原文:https://www.cnblogs.com/zzzzzzzh/p/12776051.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!