相关疑难解决方法(0)

在java中使用简单易用的LRU缓存

我知道实现起来很简单,但我想重用已经存在的东西.

我想解决的问题是我为不同的页面,角色加载配置(来自XML,所以我想缓存它们)......所以输入的组合可以增长很多(但99%不会).要处理这个1%,我希望在缓存中有一些最大数量的项目...

直到知道我在apache commons中找到了org.apache.commons.collections.map.LRUMap它看起来很好但是想要检查别的东西.有什么建议?

java caching lru

63
推荐指数
3
解决办法
6万
查看次数

Java中有SoftHashMap吗?

我知道有一个WeakHashMapin java.util,但由于它只使用了WeakReferences,只有这个Map引用,引用的对象将在下一个GC循环中丢失.因此,如果您想要缓存随机数据,这几乎是无用的,这很可能会再次被请求而不会在其余时间进行硬链接.最好的解决方案是使用SoftReferences代替的地图,但我没有在Java RT Package中找到一个.

java weak-references hashmap soft-references

63
推荐指数
2
解决办法
2万
查看次数

Java中的LRU缓存,具有泛型和O(1)操作

这是一个在求职面试中出现的问题.我们的想法是定义一个数据结构,而不是使用Java内置的LinkedHashMap.

LRU高速缓存删除最近最少使用的条目以插入新条目.因此,给出以下场景:

 A - B - C - D - E
Run Code Online (Sandbox Code Playgroud)

如果A是最近最少使用的项目,如果我们要插入F,我们需要删除A.

如果我们通过(键,值)保存带有缓存条目的HashMap以及包含元素的键和使用时间的单独列表,则可以轻松实现这一点.但是,我们需要查询列表以找到最近最少使用的项目,具有潜在的O(n)时间复杂度.

如何在Java中为通用对象和O(1)操作实现此结构?

这与可能的重复不同,因为它侧重于效率(O(1)ops)和实现数据结构本身,而不是扩展Java.

java generics time-complexity data-structures

35
推荐指数
4
解决办法
6万
查看次数

实现LRU缓存的最佳方式

我正在研究LRU缓存实现的这个问题,其中在缓存大小已满之后,弹出最近最少使用的项目并将其替换为新项目.

我有两个实现:

1).创建两个看起来像这样的地图

std::map<timestamp, k> time_to_key
std::map<key, std::pair<timestamp, V>> LRUCache
Run Code Online (Sandbox Code Playgroud)

要插入新元素,我们可以将当前时间戳和值放在LRUCache中.当缓存的大小已满时,我们可以通过查找time _to_ key中存在的最小时间戳并从LRUCache中删除相应的键来逐出最近的元素.插入一个新项是O(1),更新时间戳是O(n)(因为我们需要在时间 _to_ 键中搜索对应于时间戳的k.

2).有一个链表,其中最近最少使用的缓存出现在头部,新项目在尾部添加.当项目到达时已经存在于高速缓存中,与该项目的键对应的节点被移动到列表的尾部.插入一个新项是O(1),更新时间戳再次是O(n)(因为我们需要移动到列表的尾部),删除一个元素是O(1).

现在我有以下问题:

  1. 对于LRUCache,这些实现中哪一个更好.

  2. 有没有其他方法来实现LRU Cache.

  3. 在Java中,我应该使用HashMap来实现LRUCache

  4. 我已经看到了诸如实现通用LRU缓存之类的问题,并且还遇到了诸如实现LRU缓存之类的问题.通用LRU缓存是否与LRU缓存不同?

提前致谢!!!

编辑:

在Java中实现LRUCache的另一种方法(最简单的方法)是使用LinkedHashMap并重写boolean removeEldestEntry(Map.entry eldest)函数.

c++ java caching

14
推荐指数
1
解决办法
3万
查看次数

LRU含咖啡因

我正在尝试使用Caffeine作为LRU缓存,因此首先添加的条目将首先被逐出.跑这段代码:

final Cache<Object, Object> map = Caffeine.newBuilder()
            .maximumSize(10)
            .initialCapacity(10)
            .build();

for (long i=0; i<20;i++) {
        map.put(i, i);
}

map.cleanUp();
System.out.println(map.ge.getAllPresent(map.asMap().keySet()));
Run Code Online (Sandbox Code Playgroud)

哪个印刷品:

{0=0, 1=1, 2=2, 3=3, 4=4, 5=5, 6=6, 7=7, 8=8, 19=19}
Run Code Online (Sandbox Code Playgroud)

但我期待

{10=10, 11=11, 12=12, 13=13, 14=14, 15=15, 16=16, 17=17, 18=18, 19=19}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

java lru caffeine

10
推荐指数
1
解决办法
2430
查看次数

从HashMap中删除最旧的对象以达到一定的大小?

我有一个Java中的哈希映射,我需要限制其大小(50000的顺序).但我应该只删除最旧的项目.项的时间戳存储在条目对象的字段中:

Map<String, MyModel> snapshot = new  HashMap<>();
Run Code Online (Sandbox Code Playgroud)

public class MyModel { 
    private ZonedDateTime createdAt;
    // other fields...
}
Run Code Online (Sandbox Code Playgroud)

我还按时间戳顺序将它们插入到地图中.

完成这种删除最旧条目的最有效方法是什么?请注意,时间"阈值"未知,只有Map的最终大小.

java hashmap java-8 java-stream

9
推荐指数
1
解决办法
6489
查看次数

Java Collection实现了元素的超时

是否有一些集合实现支持元素到期.

例如:

Collection<User> cachedUsers = new ExpirableList<User>(10000);
Run Code Online (Sandbox Code Playgroud)

哪里

public ExpirableList(final long timeout){...}
Run Code Online (Sandbox Code Playgroud)

在给定时间之后(10000ms在此特定示例中),将从集合中移除添加的元素.通过使用它,我们将防止我们的cachedUsers集合溢出.

java collections

8
推荐指数
1
解决办法
1万
查看次数

LRU Cache的LinkedHashMap结构

我对如何使用LinkedHashMap构建LRU缓存感到有点困惑(如何在Java 6中实现LRU缓存?),我想确保我理解它在幕后的内部工作原理.

假设我定义了一个类LRUMap,它扩展了LinkedHashMap并覆盖了removeEldestEntry(final Map.Entry<A, B> eldest)它的方式.

然后我构建数据结构并在地图中插入4个项目

    LRUMap<String,String> map = new LRUMap<String,String>(3); //capacity 3
    map.put("a", "a");
    map.put("b", "b");
    map.put("c", "c");
    map.put("d", "d");
Run Code Online (Sandbox Code Playgroud)

并且通常LinkedHashMap使用被Entry object调用header的起始节点来链接您添加到地图中的所有项目.所以在这种情况下它会

   [header] ->  ["a"] -> ["b"] -> ["c"] -> ["d"] -> [header]
Run Code Online (Sandbox Code Playgroud)

头文件Entry对象既是header.before = header.after = header,也是最初构造时双向链表的开头和结尾.

并且假设地图达到了我想要的最大条目(3项),并且来自

    Entry<K,V> eldest = header.after;
    if (removeEldestEntry(eldest)) {
         removeEntryForKey(eldest.key);
    }
    .....
Run Code Online (Sandbox Code Playgroud)

那么这是否意味着它首先会删除["a"]?
当我们调用get(Object key)它时,重新排列列表顺序,它将该键放在标题节点之前(比如说"b"),所以它变成了

     [header] ->  ["c"] -> ["d"] -> ["b"] -> [header]
Run Code Online (Sandbox Code Playgroud)

只是想澄清一下.

java linkedhashmap

6
推荐指数
1
解决办法
4698
查看次数

列出最大元素

我想在java中创建一个列表,在添加新元素时,将检查是否达到了限制.如果是,删除最旧的元素.

我正在考虑制作ArrayList的子节点并覆盖add(Object).在那里我会做到:

if(size() + 1 > MAX)
    remove(get(0));
super.add(newObject);
Run Code Online (Sandbox Code Playgroud)

有更好的方法吗?

java list arraylist

3
推荐指数
1
解决办法
1441
查看次数

将图像添加到 JavaFX TableView 列中

我是 Java 和 OOP 新手,并且陷入了向 tableview 列添加图像的困境。代码似乎有效,我可以看到学生的姓名正确,但图像未显示在列中。我收到此错误并且无法理解如何使其工作:

javafx.scene.control.cell.PropertyValueFactory getCellDataReflectively
WARNING: Can not retrieve property 'picture' in PropertyValueFactory: javafx.scene.control.cell.PropertyValueFactory@5b0da50f with provided class type: class model.StudentModel
java.lang.IllegalStateException: Cannot read from unreadable property picture
Run Code Online (Sandbox Code Playgroud)

学生型号:

package model;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.image.ImageView;

import java.util.ArrayList;
import java.util.List;

public class StudentModel {

    private ImageView picture;
    private String name;
    private SubjectModel major;
    private SubjectModel minor;
    private String accountPassword;
    public String getAccountPassword()
    {
        return accountPassword;
    }
    public List<LectureModel> lectureModelList = new ArrayList<>();

    public StudentModel(String name, SubjectModel …
Run Code Online (Sandbox Code Playgroud)

java javafx scene imageview

3
推荐指数
1
解决办法
730
查看次数