我知道实现起来很简单,但我想重用已经存在的东西.
我想解决的问题是我为不同的页面,角色加载配置(来自XML,所以我想缓存它们)......所以输入的组合可以增长很多(但99%不会).要处理这个1%,我希望在缓存中有一些最大数量的项目...
直到知道我在apache commons中找到了org.apache.commons.collections.map.LRUMap它看起来很好但是想要检查别的东西.有什么建议?
我知道有一个WeakHashMapin java.util,但由于它只使用了WeakReferences,只有这个Map引用,引用的对象将在下一个GC循环中丢失.因此,如果您想要缓存随机数据,这几乎是无用的,这很可能会再次被请求而不会在其余时间进行硬链接.最好的解决方案是使用SoftReferences代替的地图,但我没有在Java RT Package中找到一个.
这是一个在求职面试中出现的问题.我们的想法是定义一个数据结构,而不是使用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.
我正在研究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).
现在我有以下问题:
对于LRUCache,这些实现中哪一个更好.
有没有其他方法来实现LRU Cache.
在Java中,我应该使用HashMap来实现LRUCache
我已经看到了诸如实现通用LRU缓存之类的问题,并且还遇到了诸如实现LRU缓存之类的问题.通用LRU缓存是否与LRU缓存不同?
提前致谢!!!
编辑:
在Java中实现LRUCache的另一种方法(最简单的方法)是使用LinkedHashMap并重写boolean removeEldestEntry(Map.entry eldest)函数.
我正在尝试使用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中的哈希映射,我需要限制其大小(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的最终大小.
是否有一些集合实现支持元素到期.
例如:
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集合溢出.
我对如何使用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中创建一个列表,在添加新元素时,将检查是否达到了限制.如果是,删除最旧的元素.
我正在考虑制作ArrayList的子节点并覆盖add(Object).在那里我会做到:
if(size() + 1 > MAX)
remove(get(0));
super.add(newObject);
Run Code Online (Sandbox Code Playgroud)
有更好的方法吗?
我是 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)