Java 如何快速实现一个先入先出的缓存(FIFO Cache)?

👆🏻👆🏻👆🏻关注博主,让你的代码变得更加优雅。

前言

Hutool 是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。

官网:https://www.hutool.cn/

推荐说明

FIFO(first in first out) 先进先出策略。元素不停的加入缓存直到缓存满为止,当缓存满时,清理过期缓存对象,清理后依旧满则删除先入的缓存(链表首部对象)。
优点:简单快速
缺点:不灵活,不能保证最常用的对象总是被保留

最佳实践

引入pom


<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <!-- 请查看最新版本 https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
    <version>5.8.26</version>
</dependency>

#使用

Cache<String,String> fifoCache = CacheUtil.newFIFOCache(3);

//加入元素,每个元素可以设置其过期时长,DateUnit.SECOND.getMillis()代表每秒对应的毫秒数,在此为3秒
fifoCache.put("key1", "value1", DateUnit.SECOND.getMillis() * 3);
fifoCache.put("key2", "value2", DateUnit.SECOND.getMillis() * 3);
fifoCache.put("key3", "value3", DateUnit.SECOND.getMillis() * 3);

//由于缓存容量只有3,当加入第四个元素的时候,根据FIFO规则,最先放入的对象将被移除
fifoCache.put("key4", "value4", DateUnit.SECOND.getMillis() * 3);

//value1为null
String value1 = fifoCache.get("key1");

写在最后

给大家推荐一个非常完整的Java项目搭建的最佳实践,也是本文的源码出处,由大厂程序员&EasyExcel作者维护。
github地址:https://github.com/zhuangjiaju/easytools
gitee地址:https://gitee.com/zhuangjiaju/easytools

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 实现一个先进先出FIFO)的队列Queen类,可以采用数组或链表来实现。 如果采用数组实现,可以定义一个数组和两个指针,一个指向队列头部,一个指向队列尾部。当有新元素入队时,将其添加到队列尾部,并将尾部指针向后移动一位;当有元素出队时,将头部指针向后移动一位,并返回队列头部元素。 如果采用链表实现,可以定义一个链表头和一个链表尾指针。当有新元素入队时,将其添加到链表尾部,并将尾部指针指向新元素;当有元素出队时,将头部指针指向下一个元素,并返回队列头部元素。 无论采用哪种实现方式,都需要考虑队列为空和队列已满的情况,并进行相应的处理。 ### 回答2: 先进先出FIFO)的队列,也被称为“先来先服务队列”,是一种基本的数据结构。实现这样一个队列,可以使用数组或链表来存储元素,并设置相应的操作函数。 在设计这个队列类时,我们可以考虑以下几个方面: 1. 队列的基本特性 FIFO 队列的主要操作包括:入列、出列、查看队首元素、获取队列长度等。我们需要先定义这些基本操作,并在实现时充分考虑边界情况,例如当队列为空时出列或查看队首元素会出现何种异常情况等。 2. 队列的数据结构 我们可以使用数组或链表来存储队列元素。使用数组时需要定义数组的大小,如果队列已满,则需要进行元素搬移。使用链表时则不需要定义长度,但需要实现节点间的链接关系。 3. 多线程环境下的安全性 如果该队列需要在多个线程之间进行访问,那么就需要考虑线程安全问题。可以使用锁机制或者CAS(比较和交换操作)等方式确保线程安全。 4. 性能优化 我们可以对队列的实现进行一些优化,例如在队列满时扩展数组的长度,或者使用环形数组以减少数组的搬移次数。此外,还可以考虑使用其他的数据结构,例如循环队列等。 在实现完以上考虑因素后,我们就可以得到一个完整的队列类。在实际使用过程中,我们可以根据具体应用场景来选择数据结构和算法,以达到最佳性能。 ### 回答3: 先进先出FIFO)的队列是一种常见的数据结构,它的特点是在队列尾部添加元素并在队列头部删除元素。在编写队列类时需要用到一些基础的数据结构和方法。 首先需要定义队列类的成员属性,包括队列的长度、头指针和尾指针,以及存储队列元素的数组。在本例中,我们将使用数组来存储元素。 ```python class Queue: def __init__(self, length): self.length = length self.head = 0 self.tail = 0 self.data = [None] * length ``` 接下来,我们需要实现队列类的基本操作:入队、出队、获取队列头部元素和判断队列是否为空。 在入队操作中,需要先判断队列是否已满。若队列已满则无法再添加元素,否则在队列尾部添加一个元素并将尾指针后移一位。 ```python def enqueue(self, item): if self.tail == self.length: return False else: self.data[self.tail] = item self.tail += 1 return True ``` 在出队操作中,需要先判断队列是否为空。若队列为空则无法删除元素,否则删除队列头部的元素并将头指针后移一位。 ```python def dequeue(self): if self.head == self.tail: return None else: item = self.data[self.head] self.data[self.head] = None self.head += 1 return item ``` 获取队列头部元素可以直接返回头指针所指向的元素。 ```python def get_front(self): if self.head == self.tail: return None else: return self.data[self.head] ``` 判断队列是否为空是通过头指针和尾指针是否相等来实现的。 ```python def is_empty(self): return self.head == self.tail ``` 使用这些方法,我们就可以实现一个基本的先进先出FIFO)队列类了。完整代码如下: ```python class Queue: def __init__(self, length): self.length = length self.head = 0 self.tail = 0 self.data = [None] * length def enqueue(self, item): if self.tail == self.length: return False else: self.data[self.tail] = item self.tail += 1 return True def dequeue(self): if self.head == self.tail: return None else: item = self.data[self.head] self.data[self.head] = None self.head += 1 return item def get_front(self): if self.head == self.tail: return None else: return self.data[self.head] def is_empty(self): return self.head == self.tail ``` 在实际使用时,我们可以创建一个队列对象并调用它的方法,例如: ```python q = Queue(5) q.enqueue("A") q.enqueue("B") q.enqueue("C") print(q.get_front()) # 输出 A q.dequeue() print(q.get_front()) # 输出 B print(q.is_empty()) # 输出 False ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

庄家钜Java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值