做网站美工的前途怎么样wordpress 微官网主题下载失败

pingmian/2026/1/20 4:09:59/文章来源:
做网站美工的前途怎么样,wordpress 微官网主题下载失败,wordpress大前端plus,外贸网站建设推广培训一、Queue是什么 该接口是Java集合框架成员 Queue#xff1a; 通常#xff08;但不一定#xff09;队列就是一个先入先出#xff08;FIFO#xff09;的数据结构#xff0c;和堆一样#xff08;但可以进行转换#xff0c;比如优先级列队排序#xff0c;又或者改为栈形…一、Queue是什么 该接口是Java集合框架成员 Queue 通常但不一定队列就是一个先入先出FIFO的数据结构和堆一样但可以进行转换比如优先级列队排序又或者改为栈形式的后进先出数据结构 不论如何都可以用remove()或poll()来调节 Queue接口与List、Set同一级别都是继承了Collection接口。 LinkedList实现的Deque接口中继承了Queue所以在LinkedList中就有Queue重写的方法同时也可以多态的声明Queue队列对象 队列实现通常不允许插入null但不禁止插入null。 数据可重复保证有序性基于数据类型、不可以存储null。 队列是数据结构中比较重要的一种类型是一种数据结构它支持 FIFO尾部添加、头部删除先进队列的元素先出队列跟我们生活中的排队类似。 队列是一种比较特殊的线性结构。它只允许在表的前端front进行删除操作而在表的后端rear进行插入操作。进行插入操作的端称为队尾进行删除操作的端称为队头。 换言之queue不允许有遍历行为。 有特殊情况吗比如在前端进行插入操作有JDK在1.6的时候新增了一个双向队列Deque用来实现更灵活的队列操作。比如可以在前端插入数据。 队列中最先插入的元素也将最先被删除对应的最后插入的元素将最后被删除。因此队列又称为“先进先出”FIFO—first in first out的线性表与栈(FILO-first in last out)刚好相反。 java中的Queue接口就实现了队列的功能Queue接口与List、Set同一级别都是继承了Collection接口。LinkedList虽然是个数组但是也实现了Queue接口(通过Deque接口间接实现)因此可以当做Queue来用。   Queue接口的特点 队列的主要特点是在基本的集合方法之外还提供特殊的插入、获取和检验操作。每个操作都提供两个方法一种返回异常一种返回null或者false.队列一般满足先进先出规则FIFO)除了优先队列priority queue和栈stack但是栈是FILO先进后出规则优先队列自己定义了排序规则。   二、Queue的实现 1、没有实现的阻塞接口的LinkedList 实现了java.util.Queue接口和java.util.AbstractQueue接口 内置的不阻塞队列 PriorityQueue 和 ConcurrentLinkedQueue PriorityQueue 和 ConcurrentLinkedQueue 类在 Collection Framework 中加入两个具体集合实现。  PriorityQueue 类实质上维护了一个有序列表。加入到 Queue 中的元素根据它们的天然排序通过其 java.util.Comparable 实现或者根据传递给构造函数的 java.util.Comparator 实现来定位。 ConcurrentLinkedQueue 是基于链接节点的、线程安全的队列。并发访问不需要同步。因为它在队列的尾部添加元素并从头部删除它们所以只要不需要知道队列的大 小。          ConcurrentLinkedQueue 对公共集合的共享访问就可以工作得很好。收集关于队列大小的信息会很慢需要遍历队列。 2)实现阻塞接口的   java.util.concurrent 中加入了 BlockingQueue 接口和五个阻塞队列类。它实质上就是一种带有一点扭曲的 FIFO 数据结构。不是立即从队列中添加或者删除元素线程执行操作阻塞直到有空间或者元素可用。 五个队列所提供的各有不同   * ArrayBlockingQueue 一个由数组支持的有界队列。   * LinkedBlockingQueue 一个由链接节点支持的可选有界队列。   * PriorityBlockingQueue 一个由优先级堆支持的无界优先级队列。   * DelayQueue 一个由优先级堆支持的、基于时间的调度队列。   * SynchronousQueue 一个利用 BlockingQueue 接口的简单聚集rendezvous机制。 下表显示了jdk1.5中的阻塞队列的操作 add        增加一个元索                     如果队列已满则抛出一个IIIegaISlabEepeplian异常  remove   移除并返回队列头部的元素    如果队列为空则抛出一个NoSuchElementException异常  element  返回队列头部的元素             如果队列为空则抛出一个NoSuchElementException异常  offer       添加一个元素并返回true       如果队列已满则返回false  poll         移除并返问队列头部的元素    如果队列为空则返回null  peek       返回队列头部的元素             如果队列为空则返回null  put         添加一个元素                      如果队列满则阻塞  take        移除并返回队列头部的元素     如果队列为空则阻塞 remove、element、offer 、poll、peek 其实是属于Queue接口。  Queue接口常用API 阻塞队列的操作可以根据它们的响应方式分为以下三类aad、removee和element操作在你试图为一个已满的队列增加元素或从空队列取得元素时 抛出异常。当然在多线程程序中队列在任何时间都可能变成满的或空的所以你可能想使用offer、poll、peek方法。这些方法在无法完成任务时 只是给出一个出错示而不会抛出异常。 注意poll和peek方法出错进返回null。因此向队列中插入null值是不合法的 最后我们有阻塞操作put和take。put方法在队列满时阻塞take方法在队列空时阻塞。 图中我们可以看到最上层是Collection接口Queue满足集合类的所有方法都是非阻塞的。 add(E e)增加元素 remove(Object o)删除元素 clear()清除集合中所有元素 size()集合元素的大小 isEmpty()集合是否没有元素 contains(Object o)集合是否包含元素o。BlockingQueue接口继承Queue接口也扩展了一些方法 put(E e); //阻塞 take(); //阻塞知道这个原理可以帮助我们记忆一些特性比如辨别是否阻塞方法那么联想 add(E e)既然是Collection接口定义的那么一般就是非阻塞的因为同样的实现Collection接口的ArrayList也是非阻塞的。 2.1 阻塞队列 2.1.1 BlockingQueue 阻塞队列BlockingQueue是一个支持两个附加操作的队列。这两个附加的操作是在队列为空时获取元素的线程会等待队列变为非空。当队列满时存储元素的线程会等待队列可用。 阻塞队列常用于生产者和消费者的场景生产者是往队列里添加元素的线程消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器而消费者也只从容器里拿元素。 阻塞队列实现了阻塞接口 BlockingQueue 。 java.util.concurrent中加入了 BlockingQueue 接口和五个阻塞队列类。 方法介绍 阻塞队列提供了四种处理方法 一直阻塞 当阻塞队列满时如果生产者线程往队列里put元素队列会一直阻塞生产者线程直到拿到数据或者响应中断退出。 当队列空时消费者线程试图从队列里take元素队列也会阻塞消费者线程直到队列可用。 超时退出 当阻塞队列满时队列会阻塞生产者线程一段时间如果超过一定的时间生产者线程就会退出。 当阻塞队为空时队列会阻塞消费者线程一段时间如果超过一定的时间消费者线程就会退出。   非阻塞方法remove、element、offer 、poll、peek 其实是属于Queue接口。 而阻塞方法 put、 take 是定义在BlockingQueue接口中 阻塞队列的成员 下面分别简单介绍一下。 ArrayBlockingQueue详情参见 《ArrayBlockingQueue》 是一个用数组实现的有界阻塞队列此队列按照先进先出FIFO的原则对元素进行排序。支持公平锁和非公平锁。 构造函数必须指定大小 【注每一个线程在获取锁的时候可能都会排队等待如果在等待时间上先获取锁的线程的请求一定先被满足那么这个锁就是公平的。反之这个锁就是不公平的。公平的获取锁也就是当前等待时间最长的线程先获取锁】 ArrayBlockingQueue在构造时需要指定容量 并可以选择是否需要公平性如果公平参数被设置true等待时间最长的线程会优先得到处理其实就是通过将ReentrantLock设置为true来 达到这种公平性的即等待时间最长的线程会先操作。通常公平性会使你在性能上付出代价只有在的确非常需要的时候再使用它。它是基于数组的阻塞循环队 列此队列按 FIFO先进先出原则对元素进行排序。 LinkedBlockingQueue 一个由链表结构组成的有界队列此队列按照先进先出的顺序进行排序。 有界队列如果不指定大小则此队列的默认长度为Integer.MAX_VALUE。 LinkedBlockingQueue的容量是没有上限的说的不准确在不指定时容量为Integer.MAX_VALUE不要然的话在put时怎么会受阻呢但是也可以选择指定其最大容量它是基于链表的队列此队列按 FIFO先进先出排序元素。 PriorityBlockingQueue 一个支持线程优先级排序的无界队列默认自然序进行排序也可以自定义实现compareTo()方法来指定元素排序规则不能保证同优先级元素的顺序。 但需要注意的是PriorityBlockingQueue并不会阻塞数据生产者(无界的队列永远不会满无法触发队列满阻塞)而只会在没有可消费的数据时阻塞数据的消费者(即可以触发空阻塞)。因此使用的时候要特别注意生产者生产数据的速度绝对不能快于消费者消费数据的速度否则时间一长会最终耗尽所有的可用堆内存空间。 PriorityBlockingQueue是一个带优先级的 队列而不是先进先出队列。元素按优先级顺序被移除该队列也没有上限看了一下源码PriorityBlockingQueue是对 PriorityQueue的再次包装是基于堆数据结构的而PriorityQueue是没有容量限制的与ArrayList一样所以在优先阻塞 队列上put时是不会受阻的。虽然此队列逻辑上是无界的但是由于资源被耗尽所以试图执行添加操作可能会导致 OutOfMemoryError但是如果队列为空那么取元素的操作take就会阻塞所以它的检索操作take是受阻的。另外往入该队列中的元 素要具有比较能力。 DelayQueue 一个实现PriorityBlockingQueue实现延迟获取的无界队列在创建元素时可以指定多久才能从队列中获取当前元素。只有延时期满后才能从队列中获取元素。 DelayQueue基于PriorityQueue来实现的是一个存放Delayed 元素的无界阻塞队列只有在延迟期满时才能从中提取元素。该队列的头部是延迟期满后保存时间最长的 Delayed 元素。如果延迟都还没有期满则队列没有头部并且poll将返回null。当一个元素的 getDelay(TimeUnit.NANOSECONDS) 方法返回一个小于或等于零的值时则出现期满poll就以移除这个元素了。此队列不允许使用 null 元素。 DelayQueue可以运用在以下应用场景 1.缓存系统的设计可以用DelayQueue保存缓存元素的有效期使用一个线程循环查询DelayQueue一旦能从DelayQueue中获取元素时表示缓存有效期到了。 2.定时任务调度使用DelayQueue保存当天将会执行的任务和执行时间一旦从DelayQueue中获取到任务就开始执行从比如TimerQueue就是使用DelayQueue实现的。   SynchronousQueue 一个不存储元素的阻塞队列每一个put操作必须等待take操作否则不能添加元素。支持公平锁和非公平锁。SynchronousQueue的一个使用场景是在线程池里。Executors.newCachedThreadPool()就使用了SynchronousQueue这个线程池根据需要新任务到来时创建新的线程如果有空闲线程则会重复使用线程空闲了60秒后会被回收。   2.1.2 BlockingDeque BlockingDeque阻塞双端队列在Deque的基础上实现了双端阻塞等待的功能。和第2节说的类似BlockingDeque也提供了双端队列该有的阻塞等待方法 putFirst(E e)在队首插入元素如果队列满了阻塞等待直到被中断为止。 putLast(E e)在队尾插入元素如果队列满了阻塞等待直到被中断为止。 offerFirst(E e, long timeout, TimeUnit unit)向队首插入元素。如果队列满了阻塞等待timeout个时长如果到了超时时间还没有空间抛弃该元素。 offerLast(E e, long timeout, TimeUnit unit)向队尾插入元素。如果队列满了阻塞等待timeout个时长如果到了超时时间还没有空间抛弃该元素。 takeFirst()获取并移除队首的元素。如果队列为空阻塞等待直到被中断为止。 takeLast()获取并移除队尾的元素。如果队列为空阻塞等待直到被中断为止。 pollFirst(long timeout, TimeUnit unit)获取并移除队首的元素。如果队列为空阻塞等待timeout个时长如果到了超时时间还没有元素则返回null。 pollLast(long timeout, TimeUnit unit)获取并移除队尾的元素。如果队列为空阻塞等待timeout个时长如果到了超时时间还没有元素则返回null。 removeFirstOccurrence(Object o)从队首开始移除第一个和o相等的元素。 removeLastOccurrence(Object o)从队尾开始移除第一个和o相等的元素。从图中我们可以知道实现了BlockingDeque的类有 LinkedBlockingDeque 一个由链表结构组成的双向阻塞队列。队列头部和尾部都可以添加和移除元素多线程并发时可以将锁的竞争最多降到一半。  2.1.3 TransferQueue TransferQueue是JDK 1.7对于并发类库新增加的一个接口它扩展自BlockingQueue所以自然保持着阻塞队列的所有特性。 有人这样评价它TransferQueue是是ConcurrentLinkedQueue、SynchronousQueue (公平模式下)、无界的LinkedBlockingQueues等的超集。 TransferQueue对比与BlockingQueue更强大的一点是生产者会一直阻塞直到所添加到队列的元素被某一个消费者所消费不仅仅是添加到队列里就完事。新添加的transfer方法用来实现这种约束。顾名思义阻塞就是发生在元素从一个线程transfer到另一个线程的过程中它有效地实现了元素在线程之间的传递以建立Java内存模型中的happens-before关系的方式。 我们来看看该接口提供的标准方法 tryTransfer(E e)若当前存在一个正在等待获取的消费者线程使用take()或者poll()函数使用该方法会即刻转移/传输对象元素e并立即返回true若不存在则返回false并且不进入队列。这是一个不阻塞的操作。 transfer(E e)若当前存在一个正在等待获取的消费者线程即立刻移交之否则会插入当前元素e到队列尾部并且等待进入阻塞状态到有消费者线程取走该元素。 tryTransfer(E e, long timeout, TimeUnit unit)若当前存在一个正在等待获取的消费者线程会立即传输给它;否则将插入元素e到队列尾部并且等待被消费者线程获取消费掉若在指定的时间内元素e无法被消费者线程获取则返回false同时该元素被移除。 hasWaitingConsumer()判断是否存在消费者线程。 getWaitingConsumerCount()获取所有等待获取元素的消费线程数量。其实transfer方法在SynchronousQueue的实现中就已存在了只是没有做为API暴露出来。SynchronousQueue有一个特性:它本身不存在容量,只能进行线程之间的元素传送。 SynchronousQueue在执行offer操作时如果没有其他线程执行poll则直接返回false.线程之间元素传送正是通过transfer方法完成的。 TransferQueue相比SynchronousQueue用处更广、更好用因为你可以决定是使用BlockingQueue的方法例如put方法还是确保一次传递完成即transfer方法。在队列中已有元素的情况下调用transfer方法可以确保队列中被传递元素之前的所有元素都能被处理。 从图中我们可以知道实现了TransferQueue的类有 LinkedTransferQueue一个由链表结构组成的无界阻塞队列。 好了队列的API先说到这里下面我会另起一文重点说说阻塞队列的那些个实现类的原理。   2.2 非阻塞队列 内置的不阻塞队列 PriorityQueue 和 ConcurrentLinkedQueue PriorityQueue 和 ConcurrentLinkedQueue 类在 Collection Framework 中加入两个具体集合实现。 PriorityQueue 类实质上维护了一个有序列表。加入到 Queue 中的元素根据它们的天然排序通过其 java.util.Comparable 实现或者根据传递给构造函数的 java.util.Comparator 实现来定位。ConcurrentLinkedQueue 是基于链接节点的、线程安全的队列。并发访问不需要同步。因为它在队列的尾部添加元素并从头部删除它们所以只要不需要知道队列的大 小ConcurrentLinkedQueue 对公共集合的共享访问就可以工作得很好。收集关于队列大小的信息会很慢需要遍历队列。 入队和出队操作均利用CAScompare and set更新这样允许多个线程并发执行并且不会因为加锁而阻塞线程使得并发性能更好。 没有实现阻塞接口的LinkedList 实现了java.util.Queue接口和java.util.AbstractQueue接口   2.3 到底什么是阻塞队列 区分阻塞队列和非阻塞队列的关键因素是什么 按照大多数文章的介绍阻塞队列支持阻塞特性在队列满或为空时会阻塞但是我想到队列必须是线程安全的阻塞队列前文表格中的那5个阻塞队列都是利用悲观加锁互斥做到线程安全的貌似加锁在某种程度上也等价于阻塞巧合的是非阻塞队列比如ConcurrentLinkedQueue又是利用乐观锁实现线程安全的乐观锁可以理解成未加锁。 在《JAVA中的阻塞队列和非阻塞队列》一文中介绍非阻塞队列时有如下 基于锁的算法会带来一些活跃度失败的风险。如果线程在持有锁的时候因为阻塞I/O、页面错误、或其他原因发生延迟很可能所有的线程都不能工作了。一个线程的失败或挂起不应该影响其他线程的失败或挂起这样的算法称为非阻塞算法如果算法的每一个步骤中都有一些线程能够继续执行那么这样的算法称为锁自由lock-free算法。在线程间使用CAS进行协调这样的算法如果能构建正确的话它既是非阻塞的又是锁自由的。java中提供了基于CAS非阻塞算法实现的队列比较有代表性的有ConcurrentLinkedQueue和LinkedTransferQueue它们的性能一般比阻塞队列的好。 那么如果回答什么是阻塞队列什么是非阻塞队列时是不是2个要素都要提及 答案 阻塞队列是指多线程访问竞争资源时当竞争资源已被某线程获取时其它要获取该资源的线程需要阻塞等待 虽然队列满了会休眠出队发现为空就等待也是阻塞但不是阻塞队列的核心概念 三、案例 1.算法案例 /*** 入口* 101. 对称二叉树* 1.创建链表root* 输入* TreeNode root [1,2,2,3,4,4,3]* 输出* result true* 解释* 1.递归* 2.迭代Queue队列*/Testpublic void suanfa21(){// 创建树TreeNode root new TreeNode(1, new TreeNode(2, new TreeNode(3), new TreeNode(4)), new TreeNode(2, new TreeNode(4), new TreeNode(3)));// 调用方法迭代boolean result2 this.isSymmetricIteration(root);System.out.println(results2 result2);}/*** 迭代方案** param root 二叉树* return*/public boolean isSymmetricIteration(TreeNode root){// Queue队列 和 堆的处理方案一样都是先进先出FIFO的数据结构QueueTreeNode treeNodes new LinkedList();// 存入根节点的 左子树 和 右子树treeNodes.offer(root.left);treeNodes.offer(root.right);// 如果Queue队列不为空就循环比较while (!treeNodes.isEmpty()){// 获取存入的左子树 和 右子树 因为先进先出所以可以确认顺序TreeNode rootLeft treeNodes.poll();TreeNode rootRight treeNodes.poll();// 两个都等于null 所以没有子节点了就继续判断队列中是否还有值有则比较无则结束返回trueif (rootLeft null rootRight null){continue;}// 左子树 或 右子树如果有一个是null就说明不相等,直接返回false因为上面的判断所以不可能两个都是nullif (rootLeft null || rootRight null){return false;}// 左子树 比较 右子树 的值不相等,直接返回falseif (rootLeft.val ! rootRight.val){return false;}// 存入 左子树的左子树 和 右子树的右子树这样当取出比较相等就说明是镜像treeNodes.offer(rootLeft.left);treeNodes.offer(rootRight.right);// 存入 左子树的右子树 和 右子树的左子树这样当取出比较相等就说明是镜像treeNodes.offer(rootLeft.right);treeNodes.offer(rootRight.left);}// 当执行到这里说明树两边是镜像的return true;} 2.多线程案例 package com.yao; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class BlockingQueueTest {/**定义装苹果的篮子*/public static class Basket{// 篮子能够容纳3个苹果BlockingQueueString basket new ArrayBlockingQueueString(3);// 生产苹果放入篮子public void produce() throws InterruptedException{// put方法放入一个苹果若basket满了等到basket有位置basket.put(An apple);}// 消费苹果从篮子中取走public String consume() throws InterruptedException{// get方法取出一个苹果若basket为空等到basket有苹果为止String apple basket.take();return apple;}public int getAppleNumber(){return basket.size();}}// 测试方法public static void testBasket() {// 建立一个装苹果的篮子final Basket basket new Basket();// 定义苹果生产者class Producer implements Runnable {public void run() {try {while (true) {// 生产苹果System.out.println(生产者准备生产苹果 System.currentTimeMillis());basket.produce();System.out.println(生产者生产苹果完毕 System.currentTimeMillis());System.out.println(生产完后有苹果basket.getAppleNumber()个);// 休眠300msThread.sleep(300);}} catch (InterruptedException ex) {}}}// 定义苹果消费者class Consumer implements Runnable {public void run() {try {while (true) {// 消费苹果System.out.println(消费者准备消费苹果 System.currentTimeMillis());basket.consume();System.out.println(消费者消费苹果完毕 System.currentTimeMillis());System.out.println(消费完后有苹果basket.getAppleNumber()个);// 休眠1000msThread.sleep(1000);}} catch (InterruptedException ex) {}}}ExecutorService service Executors.newCachedThreadPool();Producer producer new Producer();Consumer consumer new Consumer();service.submit(producer);service.submit(consumer);// 程序运行10s后所有任务停止try {Thread.sleep(10000);} catch (InterruptedException e) {}service.shutdownNow();}public static void main(String[] args) {BlockingQueueTest.testBasket();} } 3.top K问题 查找指定数据中出现次数最多的前K个数据 比如求前K个最大数据我们创建一个容量为K的底层为小根堆的队列每次插入数据只需要与根数据比较决定是否插入即可相反求最小数据就创建一个大跟堆。 public static void BufferedReaderEx(String str) {//指定文件目录File file new File(str); //file实例FileReader reader null;//读取数据并存储在list集合中try {reader new FileReader(file);BufferedReader bufferedReader new BufferedReader(reader);String tmp;ArrayListString list new ArrayList();while ((tmp bufferedReader.readLine()) ! null) {String[] split tmp.split(,);for (String s:split){list.add(s);}}HashMapString,Integer map HashMapEx(list);PriorityQueueMap.EntryString, Integer queue QueueEx(map,5);while (!queue.isEmpty()){Map.EntryString, Integer remove queue.remove();System.out.println(数字 remove.getKey() ,出现 remove.getValue() 次);}} catch (IOException e) {e.printStackTrace();}}public static HashMapString,Integer HashMapEx(ArrayListString list){//将数据存储到HashMap中用来统计一个数组出现的次数 key为数据 value为出现次数HashMapString, Integer map new HashMap();while (!list.isEmpty()){String index list.remove(0);if (map.containsKey(index)) {map.put(index, map.get(index) 1);} else {map.put(index, 1);}}return map;}public static PriorityQueueMap.EntryString, Integer QueueEx(HashMapString,Integer map,int num){//将Map中的Entry存储到PriorityQueue队列中并提供一个关于Entry.value的比较器并将队列的容量设置为KPriorityQueueMap.EntryString, Integer queue new PriorityQueue(num, new ComparatorMap.EntryString, Integer() {Overridepublic int compare(Map.EntryString, Integer o1, Map.EntryString, Integer o2) {return (Integer) o1.getValue() - (Integer) o2.getValue();}});IteratorMap.EntryString, Integer iterator map.entrySet().iterator();while (iterator.hasNext()){//遍历Map集合 如果队列容量小于K直接插入数据否则与queue顶部数据进行Value计较如果大于顶部数据插入到queue中Map.EntryString, Integer next iterator.next();if(queue.size()num){queue.add(next);}else {if(next.getValue()queue.peek().getValue()){queue.remove();queue.add(next);}}}return queue;}Queue接口保证数据有序性基于数据类型、不可以存储nullPriorityQueue介绍可以自定义比较器用来实现自己想要的底层结构方便我们最值问题和topK问题的求解。 Deque类 Deque是一个双端队列接口继承Queue接口Deque的实现类是LinkedList、ArrayDeque和LinkedBlockingDeque其中LinkedList是最常用的。其中LinkedBlockingDeque是一个基于链表实现的双向阻塞队列。 Deque在Queue的基础上增加了以下几个方法 addFirst(E e)在前端插入元素异常处理和add一样 addLast(E e)在后端插入元素和add一样的效果 offerFirst(E e)在前端插入元素异常处理和offer一样 offerLast(E e)在后端插入元素和offer一样的效果 removeFirst()移除前端的一个元素异常处理和remove一样 removeLast()移除后端的一个元素和remove一样的效果 pollFirst()移除前端的一个元素和poll一样的效果 pollLast()移除后端的一个元素异常处理和poll一样 getFirst()获取前端的一个元素和element一样的效果 getLast()获取后端的一个元素异常处理和element一样 peekFirst()获取前端的一个元素和peek一样的效果 peekLast()获取后端的一个元素异常处理和peek一样 removeFirstOccurrence(Object o)从前端开始移除第一个是o的元素 removeLastOccurrence(Object o)从后端开始移除第一个是o的元素 push(E e)和addFirst一样的效果 pop()和removeFirst一样的效果。可以发现其实很多方法的效果都是一样的只不过名字不同。比如Deque为了实现Stack的语义定义了push和pop两个方法。 注意区分LinkedBlockingQueue和LinkedBlockingDeque两个都是队列只不过前者只能一端出一端入后者则可以两端同时出入 Deque有三种用途普通队列一端进另一端出、双端队列两端都可进出、堆栈。 普通队列 Queue queue new LinkedList()  或  Deque deque new LinkedList() 双端队列 Deque deque new LinkedList() Deque deque1 new LinkedBlockingDeque(); LinkedBlockingDeque deque2 new LinkedBlockingDeque(); 堆栈 Deque deque new LinkedList() 代码演示 1、实体类 package cn.com.easyExcel.point;import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import lombok.Data; import lombok.NoArgsConstructor;import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime;Data NoArgsConstructor public class PointValue implements Serializable {private static final long serialVersionUID -3925356810846060856L;// 值public BigDecimal value;// 某时刻JsonFormat(pattern yyyy-MM-dd HH:mm:ss)JsonSerialize(using LocalDateTimeSerializer.class)JsonDeserialize(using LocalDateTimeDeserializer.class)public LocalDateTime time;public static PointValue of(BigDecimal value, LocalDateTime time) {PointValue pointPower new PointValue();pointPower.setValue(value);pointPower.setTime(time);return pointPower;} } 2、赋值执行方法 package cn.com.easyExcel.point;import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Data; import lombok.NoArgsConstructor;import java.io.Serializable; import java.util.Deque; import java.util.LinkedList; import java.util.concurrent.LinkedBlockingDeque;/*** 双向队列***/ Data NoArgsConstructor public class PointValueQueue implements Serializable {private static final long serialVersionUID 5938295366928195243L;private Long pointId;private String pointName;private LinkedBlockingDequePointValue queue new LinkedBlockingDequePointValue();public static PointValueQueue of(Long pointId, String pointName) {PointValueQueue pointValueQueue new PointValueQueue();pointValueQueue.setPointId(pointId);pointValueQueue.setPointName(pointName);return pointValueQueue;}/*** 新增元素, 队尾** param pointValue*/public void addLast(PointValue pointValue) {this.queue.addLast(pointValue);}/*** 获取队首元素值, 不移除, 队列为空时, 抛出异常** return*/JsonIgnorepublic PointValue getFirst() {return this.queue.getFirst();}/*** 获取队首元素值, 不移除, 队列为空时, 返回null** return*/JsonIgnorepublic PointValue peekFirst() {return this.queue.peekFirst();}/*** 获取队尾元素值, 不移除** return*/JsonIgnorepublic PointValue getLast() {return this.queue.getLast();}/*** 获取队首元素值, 移除** return*/public PointValue poll() {return this.queue.poll();}/*** 获取队列当前大小** return*/public int size() {return this.queue.size();}/*** 是否为空队列** return*/JsonIgnorepublic boolean isEmpty() {return this.queue.isEmpty();}/*** 清空*/public void clear() {this.queue.clear();}} 3、调用方法实现过程 package cn.com.easyExcel;import cn.com.easyExcel.point.PointValue; import cn.com.easyExcel.point.PointValueQueue; import com.baomidou.mybatisplus.core.toolkit.StringPool; import org.junit.jupiter.api.Test;import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.HashMap; import java.util.Map; import java.util.Optional;/*** description:测试写队列* LinkedBlockingQueue和LinkedBlockingDeque两个都是队列只不过前者只能一端出一端入后者则可以两端同时出入* 并且都是结构改变线程安全的队列。其实两个队列从实现思想上比较容易理解* 有以下特点* 链表结构动态数组* 通过ReentrantLock实现锁* 利用Condition实现队列的阻塞等待唤醒**/ public class DequeDemoTest {Testpublic void LinkedBlockingDeque() {//字符串池String key StringPool.EMPTY;MapLong, PointValueQueue queueMap getSet();for (int i 0; i 20 ; i) {// 队列PointValueQueue pointValueQueue Optional.ofNullable(queueMap.get((long)i)).orElse(PointValueQueue.of((long)i, i));System.out.println((i)之前pointValueQueue);// 队尾元素PointValue tail pointValueQueue.getLast();// 队首元素PointValue head pointValueQueue.getFirst();if(i%30){//pointValueQueue.clear();// 获取队首元素值, 移除pointValueQueue.poll();System.out.println((i)之后pointValueQueue);}if(i10){pointValueQueue.clear();System.out.println((i)最后pointValueQueue);}}}//设置值private MapLong, PointValueQueue getSet(){MapLong, PointValueQueue roomSuspectedQueuenew HashMapLong, PointValueQueue();for (int i 0; i 20; i) {PointValueQueue pointValueQueue PointValueQueue.of((long)i, i );for (int j 0; j 10 ; j) {LocalDateTime now LocalDateTime.now();LocalDateTime time now.plusHours(j);//功率BigDecimal p new BigDecimal(j);// 队列新元素PointValue pointValue PointValue.of(p, time);// 更新队列pointValueQueue.addLast(pointValue);}roomSuspectedQueue.put((long)i,pointValueQueue);}return roomSuspectedQueue;} }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/87648.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

假山网站如何做淘客个人网站怎么建设

来都来了给我点个赞收藏一下再走呗🌹🌹🌹🌹🌹 目录 一、下载需要用到的python库selenium 二、selenium的基本使用 1.在python代码引入库 2.打开浏览器 3.元素定位 1)通过id定位 2)通过标…

域名及网站建设实验报告邯郸营销网站建设

系列文章目录 文章目录 系列文章目录一、springboot常用的starter有哪些二、 SpringBoot 实现热部署有哪几种方式?三、如何理解 Spring Boot 配置加载顺序? 一、springboot常用的starter有哪些 spring-boot-starter-web 嵌入tomcat和web开发需要servlet…

仪征市城乡建设局网站怎样建网上商城

RBAC 模型 RBAC 基于角色的访问控制是实施面向企业安全策略的一种有效的访问控制方式。 基本思想是,对系统操作的各种权限不是直接授予具体的用户,而是在用户集合与权限集合之间建立一个角色集合。每一种角色对应一组相应的权限。一旦用户被分配了适当…

私募网站建设服务wap网站建设管理制度

将修改后的代码从一个克隆的仓库推送到新的 GitHub 仓库 本文介绍了如何从一个已经克隆下来的 GitHub 仓库中,将修改后的代码推送到一个新创建的 GitHub 仓库。 前提条件 已经克隆了一个现有的 GitHub 仓库到本地。示例仓库为:https://github.com/gao…

软件开发和网站建设一样吗那个网站做室内比较好的

在现代社会中,信息技术的持续发展使得机房UPS监控变得至关重要。机房是企业信息系统的核心,UPS监控系统能够确保在电力故障或其他问题发生时,机房设备能够持续稳定运行,从而保障数据的安全性和可用性。 客户案例 金融机构 河北某…

宣威市住房与城乡建设局网站wordpress 五分钟

概览 在 SwiftUI 中写一个自定义文件内容的管理器有多难呢? 答案可能超乎小伙伴们的想象:仅需4步!可谓是超级简单! 在本篇博文中,您将学到如下内容: 概览1. 第一步:定义文件类型2. 第二步&…

贵州省遵义市住房城乡建设局网站拓者设计吧官网效果图

使用场景:页面需要定时刷新,实时加载数据,需要实时查看监控数据(H5中的WebSocket和SSE可以实现局部刷新)一定时间之后跳转到指定页面(登录注册之类)前端开发使用伪数据调试html页面(…

金融公司网站源码浙江省建设厅网站查询

文章目录 简单介绍RabbitMQRabbitMQ架构什么是 RabbitMQ?有什么显著的特点?RabbitMQ 有那些基本概念?RabbitMQ routing 路由模式消息怎么路由?RabbitMQ publish/subscribe 发布订阅(共享资源)能够在地理上分开的不同数据中心使用 …

苏州h5网站建设价钱搜素引擎排名优化

目录 一.安装elasticsearch 1.拉取镜像 2.创建存放数据及配置文件的文件夹,启动时挂载。 4.修改文件夹权限 5.启动容器 5.1参数解释 6.安装ik分词器 6.2测试一下Ik分词器 二.添加文章索引库 1查询所有的文章信息,批量导入到es索引库中 2)测试 …

做公众号的网站模板下载wordpress美术馆插件

在 Golang 的日常开发中,往往要面对各种和操作系统相关的操作,例如文件的读写、环境变量的处理、程序参数的获取等等。Golang 的 os 标准库为我们提供了与操作系统打交道的各类工具,能让这些操作变得更加简洁和简单。 基础应用 文件的读写操…

关于网站开发的外文书籍搞笑图片网站源码

简介: minicoredump神也! 继上一篇非典型程序员青囊搞定内存泄露问题后,美美地睡了一觉。睡梦中,突然金光闪闪,万道光芒照进时光隧道,恍惚来到大唐神龙年间。青囊此时化身狄仁杰高级助理,陪同狄…

手机建站程序下载个网上销售网站

从架构的角度看来,Asterisk是由许多不同的模块组成的。在设计基于Asterisk的系统时,这种模块化的特性,提供了几乎无限的灵活必。作为Asterisk系统管理员,你拥有选择加载模块的权利。你所加载的每一个模块,都提供了不同…

所有的网站都要用htmlu做吗超级优化残剑

项目开发经验谈:项目的到底谁说了算 前言:项目到底是为谁而做,一个项目的成功到底是怎么样在评价:是领导阶层肯定,还是客户满意? 系列文章链接 项目开发经验谈:如何成为出色的开发人员盲目的项目…

net网站建设语言小型网站开发需要什么步骤

缘起 我在上一篇文章——《调试实战 —— dll 加载失败之全局变量初始化篇》中,跟大家分享了一个由于全局变量初始化顺序导致的 dll 加载失败的例子。感兴趣的小伙伴儿可以点击阅读。虽然我们知道了是由于全局变量初始化顺序导致的问题,也给出了解决方案…

哈密做网站公众号引流推广平台

先介绍一下本文的作者,本人本科来自于某双非财经类院校,于2019年考入南开大学某应用经济学专业,在2019年考研初始专业课826经济学基础(也就是20年的823)中拿到了138分的成绩,自认为对专业课的复习有一定心得…

自助建设彩票网站在建立网站站点的过程中

经常做的一个操作,列出数据库中一个表的所有列名。方法如下:先从SYSTEMOBJECT系统表中取得数据表的SYSTEMID,然后再从SYSCOLUMN表中取得该表的所有列名。SQL语句如下:use dbname --dbname改为你要…

cms企业网站模板大连微信公众号开发公司

宇宙射线也叫电磁波,其中包含γ射线、X射线、紫外线、可见光、红外线、近红外、远红外,还有无线电和超声波。 无线电波是振荡电路中自由电子作周期性的运动产生的. 红外线、可见光、紫外线是原子外层电子受激发产生的. X射线是原…

免费dede企业网站模板鞍山网站怎么做出来的

电机特性 电机堵转: 电机堵转的原理 玻璃升降器: 工作电压 升降器在 9V~16V 电压下应运行平稳,不允许有异音和卡滞现象。 工作电流 升降器的工作电流不大于 12A,堵转电流不大于 28A。 堵转 力 升降器 堵转 力应 不小于 212N。 玻璃升降器结构 电动车窗…

天津市网站建设 网页制作做汽车配件生意的网站

总结: ①没有byte的字面值,赋值时需要强制转换类型 ②涉及运算,系统自动进行类型升级,由此用final修饰,代表这是一个不会更改值的常量,通过编译 感受:还是用int吧,自动类型转换太复…

青岛 企业网站建站如何去做电商

应用分层 在开发的过程中, 我们会发现, 程序的代码有时会很"杂乱", 如果后面的项目更大了, 那就会更加地杂乱无章(文件乱, 代码内容乱). 也基于此, 接下来让我们来学习一下应用分层. 也类似于公司的组织架构 公司初创阶段, 一个人身兼数职, 既做财务, 又做人事,还有…