首页 > 作文

java双端队列作用(java三种队列详解)

更新时间:2023-04-05 02:44:06 阅读: 评论:0

linkedblockingdeque概述

linkedblockingdeque是由链表构成的界限可选的双端阻塞队列,支持o(1)的油性头发时间复杂度从两端插入和移除元素,如不指定边界,则为integer.max_value。

由一个reentrantlock保证同步,使用conditions来实现等待通知。

类图结构及重要字段

public class linkedblockingdeque<e>    extends abstractqueue<e>    implements blockingdeque<e>, java.io.rializable {    private static final long rialversionuid = -387911632671998426l;    /** 双向链表节点 */    static final class node<e> {        e item;        node<e> prev;        node<e> next;        node(e x) {            item = x;        }    }    /**     * 指向第一个节点     * invariant: (first == null && last == null) ||     *            (first.prev == null && first.item != null)     */    transient node<e> first;    /**     * 指向最后一个节点     * invariant: (first == null && last == null) ||     *            (last.next == null && last.item != null)     */    transient node<e> last;    /** 节点数量 */    private transient int count;    /** 队列容量 */    private final int capacity;    /** 保证同步 */    final reentrantlock lock = new reentrantlock();    /** take操作发生的条件 */    private final condition notempty = lock.newcondition();    /** put操作发生的条件 */    private final condition notfull = lock.newcondi抽检是什么意思tion();    }

linkfirst

尝试将节点加入失恋三十天到first之前,更新first,如果插入之后超出容量,返回fal。

防辐射服十大品牌private boolean linkfirst(node<e> node) {        // asrt lock.isheldbycurrentthread();        if (count >= capacity)            return fal;        node<e> f = first;        node.next = f;        first = node;        if (last == null)            last = node;        el            f.prev = node;        ++count;        notempty.signal();        return true;    }

linklast

在last节点后加入节点node,更新last。如果插入之后超出容量,返回fal。

private boolean linklast(node<e> node) {        // asrt lock.isheldbycurrentthread();        if (count >= capacity)            return fal;        node<e> l = last;        node.prev = l;        last = node;        if (first == null)            first = node;        el            l.next = node;        ++count;        notempty.signal();// 满足notempty条件        return true;    }

unlinkfirst

移除first节点,并返回其item值,如果队列为空,则返回full。

private e unlinkfirst() {        // asrt lock.isheldbycurrentthread();        node<e> f = first;        if (f == null)            return null;        node<e> n = f.next;        e item = f.item;        f.item = null;        f.next = f; // help gc        first = n;        if (n == null)            last = null;        el            n.prev = null;        --count;        notfull.signal();// 满足notfull条件        return item;    }

unlinklast

移除last节点,并返回其item值,如果队列为空,则返回full。

private e unlinklast() {        // asrt lock.isheldbycurrentthread();        node<e> l = last;        if (l == null)            return null;        node<e> p = l.prev;        e item = l.item;        l.item = null;        l.prev = l; // help gc        last = p;        if (p == null)            first = null;        el            p.next = null;        --count;        notfull.signal(); // 满足notfull条件        return item;    }

unlink

移除任意一个节点,注意这里并没有操作x本身的连接,因为它可能仍被iterator使用着。

void unlink(node<e> x) {        // asrt lock.isheldbycurrentthread();        node<e> p = x.prev;        node<e> n = x.next;        // 移除的是first        if (p == null) {            unlinkfirst();        // 移除的是last        } el if (n == null) {            unlinklast西安外国语大学排名();        } el {            // 移除的是中间节点            p.next = n;            n.prev = p;            x.item = null;            // don't mess with x's links.  they may still be in u by            // an iterator.            // 这里x的prev和next指针都没有改变,因为他们可能在被iterator使用            --count;            notfull.signal();        }    }

总结

linkedblockingdeque是由链表构成的界限可选的双端阻塞队列,支持o(1)的时间复杂度从两端插入和移除元素,如不指定边界,则为integer.max_value。

由一个reentrantlock保证同步,使用conditions来实现等待通知。

上面介绍的所有操作基本上就是核心方法啦,诸如putfirst、putlast、takefirst、takelast等方法都会调用上面的核心方法,而且实现上面也是比较简单的,就是双端链表的基本操作,不懂的可以画画图帮助理解哈。

本文发布于:2023-04-05 02:44:04,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/a0330bb74d3f55548dabed55bfae1de3.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:java双端队列作用(java三种队列详解).doc

本文 PDF 下载地址:java双端队列作用(java三种队列详解).pdf

上一篇:液碱的腐蚀
下一篇:返回列表
标签:节点   移除   队列   的是
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图