简单的LRU队列kotlin实现

本文介绍了一种最近最少使用(LRU)队列的实现方式,该队列使用了LinkedList和LinkedHashMap来确保高效的元素存取操作。通过覆盖特定API,实现了元素的添加、删除及时间戳更新等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近的项目中貌似需要一个這样的队列,想着实现了一下,后来又没有使用,就没有进行严格的测试.

import java.util.*
import kotlin.concurrent.thread

/**
 * @describe 最近最少使用队列, 只能使用這里override的api哦
 * @author  XQ Yang
 * @date 4/3/2019  3:09 PM
 */
class LRURequestTimeQueue<T>(val maxSize: Int, private val realQueue: LinkedList<T> = LinkedList()):Deque<T> by realQueue {

    val map = linkedMapOf<T,Long>()

    /**
     * 移除队尾元素
     */
    override fun removeLast(): T {
        val last = realQueue.removeLast()
        if (last != null) {
            map.remove(last)
        }
        return last
    }

    /**
     * 如果存在则放到队头,更新访问时间,否则插入,如果队满,则删除队尾元素
     */
    override fun addFirst(e: T) {
        if (contains(e)) {
            map[e] = System.currentTimeMillis()
            return
        }
        if (map.size + 1 > maxSize) {
            removeLast()
        }
        realQueue.addFirst(e)
        map[e] = System.currentTimeMillis()
    }


    /**
     * 如果包含则放到队头
     */
    override fun contains(element: T): Boolean {
        val contains = realQueue.contains(element)
        if (contains) {
            realQueue.remove(element)
            realQueue.addFirst(element)
        }
        return contains
    }

    /**
     * 获取e对应的时间值,如果e不存在则会插入.如果存在则放到队头,更新访问时间
     */
    fun getAndUpdate(e: T): Long {
        if (contains(e)) {
            val old = map[e] ?: 0L
            map[e] = System.currentTimeMillis()
            return old
        } else {
            addFirst(e)
        }
        return 0L
    }

    /**
     * 查看效果
     */
    fun print(){
        forEach {
            println("key=${it.toString()} value = ${map[it]}")
        }
    }

}


fun main() {
    val queue = LRURequestTimeQueue<String>(20)
    val list = mutableListOf<String>()
    for (i in 0..50) {
        list.add("test ${i}")
    }

    thread {
        for (i in 0..30) {
            Thread.sleep(kotlin.random.Random.nextLong(10))
            queue.getAndUpdate(list[kotlin.random.Random.nextInt(49)])
        }
        queue.print()
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值