gpt4 book ai didi

java - LinkedHashMap removeEldestEntry 和重写删除

转载 作者:行者123 更新时间:2023-12-01 21:51:10 29 4
gpt4 key购买 nike

我有一个扩展 LinkedHashMap 的类,我将其用作缓存。该缓存有一个属性,该属性定义允许缓存存储的最大大小(以字节为单位)。我对存储的对象的大小进行了粗略估计。

我重写 put,以便更新缓存当前存储的总大小。

我还重写了remove,以从总数中减去已删除对象的大小。

目前,我正在检查是否需要从缓存中删除过时的条目,以便在 put 方法中添加新值时释放空间,但是我想移动它removeEldestEntry 方法的实现的功能。

我遇到的问题是,如果我重写的 removeEldestEntry 返回 true,则似乎不会调用我重写的 remove 方法。这会导致一个问题:当 removeEldestEntry 删除过时的条目时,我当前存储的大小变量不会更新。

有谁知道当 removeEldestEntry 返回 true 时采用什么代码路径来删除最旧的条目。我是否可以重写用于删除条目的方法?

LinkedHashMap触发removeEldestEntry上的删除时,我是否可以进行更新计算。

我知道 API 允许您在 removeEldestEntry 方法中进行实际删除,只要您随后返回 false,但是我想在执行此操作之前探索其他选项。我认为这是最后一种情况。

最佳答案

查看source code of LinkedHashMap where removeEldestEntry is called ,它不会调用 remove,而是调用 removeNode - 这也在 remove 的默认实现中调用。

请注意,这是 Fragile Base Class problem 的一个示例,其中您试图依赖基类中的实现细节(即,如果 removeEldestEntry 返回 true,则调用 remove),但实际上并非如此 - 区别在于它已经不是真的,而不是在未来的某个时候变得不是真的。

您可能需要考虑围绕 LinkedHashMap 实现您自己的包装类,它将许多行为委托(delegate)给 LHM,但您可以在其中实现您想要的特定逐出逻辑。

关于java - LinkedHashMap removeEldestEntry 和重写删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35181798/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com