如何在搜索引擎做网站做化妆品网站

张小明 2026/1/7 16:15:40
如何在搜索引擎做网站,做化妆品网站,图片本地化wordpress,企业微信开发者平台ArrayList和LinkedList有什么区别#xff1f; 这种侮辱人的问题#xff0c;默认就把这两者限定在了同一个场景之中#xff0c;它甚至连八股文都算不上。 一旦你被问到这种问题#xff0c;也证明面试基本上泡汤了--面试官已经实在是找不到其他问题与你交流了。 你Over了。…ArrayList和LinkedList有什么区别这种侮辱人的问题默认就把这两者限定在了同一个场景之中它甚至连八股文都算不上。一旦你被问到这种问题也证明面试基本上泡汤了--面试官已经实在是找不到其他问题与你交流了。你Over了。但当我们细看一下LinkedList的class定义就会发现它并不像是ArrayList的那样具有纯洁的列表精神。public class ArrayListE extends AbstractListE implements ListE, RandomAccess, Cloneable, java.io.Serializable //VS public class LinkedListE extends AbstractSequentialListE implements ListE, DequeE, Cloneable, java.io.SerializableLinkedList除了能够当作普通的列表它还是一个Deque。双向链表听着就比较唬人这就是一个既能当做队列、又能当做栈的存在。有了这种双重Buff的叠加LinkedList的应用场景比ArrayList丰富的多。除了能做最简单的LRU缓存LinkedList在刷题的时候也是充满了正能量。关于类似Deque的APIxjjdog以前有专门的文章来介绍这些爆炸性的方法。《带你见识一下JAVA中的方法爆炸》王者ConcurrentLinkedQueue一个阻塞的双向队列它的基本操作方法有(3[基本]x2[异常与返回值]4[阻塞加超时])x3[队头队尾]5x2x330足足有30个方法。看完上面的文章这30个方法可以很快手到擒来。不过我们今天要聊的一个重点是使用Deque来实现更快的延迟队列。延迟队列如果你想要某些数据延迟一段时间再进行处理或者要再某段时间内按照分组进行一些计算那延迟队列无疑是非常合适的。在Java的Concurrent包里就静悄悄的躺着DelayQueue。只要你的数据实现了Delayed接口那么就可以放心大胆的把它们往里面塞。可惜的是DelayQueue的底层存储使用的是PriorityQueue。PriorityQueue是堆实现的offer和poll数据的时间复杂度是O(logN)。这就意味着当DelayQueue中的数据比较多的时候它的性能就会下降。除了把数据分片使用多个DelayQueue来完成工作我们有没有速度更快的方法比如把PriorityQueue使用LinkedList来替换这要看场景。如果你向DelayQueue中添加数据是与当前添加的时间相关的那完全可以使用LinkedList来替换PriorityQueue。关键代码要了解DelayQueue的运行原理我们可以需要先看一下Delayed接口。任何想要存储到DelayQueue中的数据都需要实现这个接口。其中getDelay就是用来判断当前数据是否超时的方法。而compareTo则是PriorityQueue用来排序的如果我们是按照当前塞入数据的则compareTo方法就不是必要的。public long getDelay(NotNull TimeUnit unit) { return MAX_CACHE_DUAL this.enqueueTimeNs - System.nanoTime(); } public int compareTo(NotNull Delayed o) { long d getDelay(TimeUnit.NANOSECONDS) - o.getDelay(TimeUnit.NANOSECONDS); return (d 0) ? 0 : (d 0 ? -1 : 1); }按照以上的思路我们把DelayQueue的代码拷贝一份仅保留关键代码如下。public class LightweightDelayedQueueE extends Delayed { private final transient ReentrantLock lock new ReentrantLock(); private final LinkedListE q new LinkedList(); private final Condition available lock.newCondition(); private Thread leader; public void put(E e) { final ReentrantLock lock this.lock; lock.lock(); try { q.offer(e); if (q.peek() e) { leader null; available.signal(); } } finally { lock.unlock(); } } public E take() throws InterruptedException { final ReentrantLock lock this.lock; lock.lockInterruptibly(); try { for (; ; ) { E first q.peek(); if (first null) available.await(); else { long delay first.getDelay(NANOSECONDS); if (delay 0L) return q.poll(); first null; // dont retain ref while waiting if (leader ! null) available.await(); else { Thread thisThread Thread.currentThread(); leader thisThread; try { available.awaitNanos(delay); } finally { if (leader thisThread) leader null; } } } } } finally { if (leader null q.peek() ! null) available.signal(); lock.unlock(); } } public int size() { final ReentrantLock lock this.lock; lock.lock(); try { return q.size(); } finally { lock.unlock(); } } public int drainTo(Collection? super E c, int maxElements) { Objects.requireNonNull(c); if (c this) throw new IllegalArgumentException(); if (maxElements 0) return 0; final ReentrantLock lock this.lock; lock.lock(); try { int n 0; for (E first; n maxElements (first q.peek()) ! null first.getDelay(NANOSECONDS) 0; ) { c.add(first); // In this order, in case add() throws. q.poll(); n; } return n; } finally { lock.unlock(); } } }主要方法轻量级的延迟队列如果一旦采用了LinkedList那么它的入队、出队方法就都变成了O(1)的时间复杂度。在延迟队列中的数据增加时时间复杂度也能维持不变可以说是速度快的连兔子都追不上了。一般在java中put和take方法都是代表阻塞性方法。比如take方法我们可以将其安全的阻塞在某个线程上而不用担心太多的资源浪费。final Thread thread Thread.currentThread(); while (!this.close !thread.isInterrupted()) { Data data q.take(); }这一切都是Condition办到的它和wait、notify的作用是一样的。当我们通过put方法添加新的数据到队列中会通过signal方法来通知等待的线程获取数据。相同的如果take方法发现队列中的数据为空它将进入等待状态。如果有数据也并不是马上把这些数据取出来因为数据还没到期。比如最老的数据还剩下5秒才到期代码也对这种情况进行了处理它会尝试awaitNanos对应的时间。这样我们就可以使用这种简单的轮询方式来实现延迟队列而不需要单独的线程去检测队列中的数据。增加take方法的效率但是这样还不够。当数据量比较大的时候队列的数据可能有多条已经到期。如果我们通过take方法来一条一条获取的话效率自然不如批量获取高。drainTo方法可以一股脑的把到期的数据转移到其他的集合中但它并不是一个阻塞性的方法。我们可以先使用take来阻塞线程然后再批量取出所有数据。下面代码会一次性获取100条数据作为一个批量。final Data takeItem q.take(); final ListData buckets new ArrayList(100); q.drainTo(buckets, 99); buckets.add(takeItem);End实际上我们的某个业务当采用LinkedList来替代PriorityQueue并进行批量操作后CPU的使用直接降低了1/3。Deque是xjjdog最喜欢的一个接口。每当使用offerFirst、offerLast这样精准的API进行操作都会体验到多巴胺的乐趣。LinkedList作为它的儿子自然拥有了这些所有的功能。当我们使用concurrent包里的基本API对这些淳朴的工具进行封装它们就会焕发出新的活力。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

沙元浦做网站的公司软件开发需要什么学历

简介 本文是关于AI Agent记忆的系统性综述,采用"形态-功能-动力学"三维框架分析了200最新论文。提出了新三大记忆形态(Token-level/Parametric/Latent)取代传统二分法,详细探讨了记忆的功能与演化机制,并展望…

张小明 2026/1/6 16:28:58 网站建设

宜春做网站的公司电商网站怎么做权限控制

背景 去年负责的一个订单系统,单表数据量到了8000万,查询开始变慢,写入也受影响。 考虑过几个方案: 归档历史数据:治标不治本,新数据还是会增长换TiDB:改动太大,风险高分库分表&…

张小明 2026/1/6 16:29:04 网站建设

html5网站特点免费企业黄页网站入口

STM32嵌入式开发实战指南:5大创新项目从零到精 【免费下载链接】STM32 项目地址: https://gitcode.com/gh_mirrors/stm322/STM32 想要快速掌握STM32实战项目开发技能?这份嵌入式开发指南将带你从零开始,通过5个精心设计的创新案例&am…

张小明 2026/1/6 2:37:55 网站建设

怎么选择五屏网站建设移动端网站建设的好处

Kotaemon中的Prompt工程实践:模板管理与动态注入 在构建企业级智能问答系统时,一个常见的痛点是:明明模型能力足够强,生成的回答却时常“答非所问”或缺乏依据。问题往往不在于模型本身,而在于我们如何引导它——也就是…

张小明 2025/12/28 3:47:29 网站建设

上海h5网站建设wordpress收不到邮箱验证码

Joy-Con Toolkit终极指南:免费解锁任天堂手柄自定义功能 【免费下载链接】jc_toolkit Joy-Con Toolkit 项目地址: https://gitcode.com/gh_mirrors/jc/jc_toolkit Joy-Con Toolkit是一款专为任天堂Joy-Con手柄设计的免费自定义工具,让你能够轻松调…

张小明 2025/12/28 3:46:54 网站建设

国外专门做童装的网站一站式网站建设用途

引言进程是Linux系统的核心概念之一,理解进程的创建、终止、回收和替换是系统编程的基石。本文将系统性地介绍Linux进程管理的各个方面,包括父子进程关系、写时复制技术、进程终止方式、僵尸进程处理、进程回收机制以及exec函数族的使用。一、父子进程与…

张小明 2026/1/5 15:19:52 网站建设