Java 修剪HashMap的有效方法
我正在用Java创建一个Flyweight,我想确保我不会创建太大的地图。有没有更有效的方法来修剪地图?我没有看到任何可以自动执行此操作的属性(如最大大小构造函数),所以我在代码中执行此操作 以下是我所拥有的,非常基本,但我想确定没有更好的方法:Java 修剪HashMap的有效方法,java,hashmap,pruning,Java,Hashmap,Pruning,我正在用Java创建一个Flyweight,我想确保我不会创建太大的地图。有没有更有效的方法来修剪地图?我没有看到任何可以自动执行此操作的属性(如最大大小构造函数),所以我在代码中执行此操作 以下是我所拥有的,非常基本,但我想确定没有更好的方法: private static void prune() { Iterator<Entry<Integer, Integer[]>> iterator = seeds.entrySet().iterator();
private static void prune() {
Iterator<Entry<Integer, Integer[]>> iterator = seeds.entrySet().iterator();
int removed = 0;
while(iterator.hasNext()|| removed == pruneLength) {
iterator.next();
iterator.remove();
removed++;
}
}
private static void prune(){
迭代器迭代器=seeds.entrySet().Iterator();
int=0;
while(iterator.hasNext()| | removed==prunelelength){
iterator.next();
iterator.remove();
删除++;
}
}
例如,您是否考虑过使用缓存?它们实现了映射,并以声明的方式设置大小、值存储在磁盘上后的限制等。例如,您考虑过使用缓存吗?它们实现映射,并以声明的方式设置大小和限制,将值存储在磁盘上等。LinkedHashMap可以用作LRU缓存
Map<Integer, Integer[]> map = createLRUMap(128);
public static <K, V> Map<K, V> createLRUMap(final int maxSize) {
return new LinkedHashMap<K,V>(maxSize, 1, true) {
@Override
protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
return size() > maxSize;
}
};
}
Map-Map=createLRUMap(128);
公共静态映射createLRUMap(最终整型maxSize){
返回新LinkedHashMap(maxSize,1,true){
@凌驾
受保护的布尔重构(Map.Entry最早){
返回大小()>maxSize;
}
};
}
LinkedHashMap可用作LRU缓存
Map<Integer, Integer[]> map = createLRUMap(128);
public static <K, V> Map<K, V> createLRUMap(final int maxSize) {
return new LinkedHashMap<K,V>(maxSize, 1, true) {
@Override
protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
return size() > maxSize;
}
};
}
Map-Map=createLRUMap(128);
公共静态映射createLRUMap(最终整型maxSize){
返回新LinkedHashMap(maxSize,1,true){
@凌驾
受保护的布尔重构(Map.Entry最早){
返回大小()>maxSize;
}
};
}
的最新版本中有此功能(在主干上)。它应该在r08,虽然我不知道什么时候会出来
ConcurrentMap<Integer, Integer[]> seeds = new MapMaker()
.maximumSize(maxSize)
.makeMap();
ConcurrentMap seeds=newmapmaker()
.最大尺寸(最大尺寸)
.makeMap();
请注意,这是一个线程安全的并发映射,它似乎很重要,这取决于您如何使用它。的最新版本(在主干上)中有此功能。它应该在r08,虽然我不知道什么时候会出来
ConcurrentMap<Integer, Integer[]> seeds = new MapMaker()
.maximumSize(maxSize)
.makeMap();
ConcurrentMap seeds=newmapmaker()
.最大尺寸(最大尺寸)
.makeMap();
请注意,这是一个线程安全的并发映射,这似乎很重要,具体取决于您如何使用它。数据库世界中的一种可能性是拥有两个(或可能更多的映射)。查找同时使用两个地图。只给一个人写信。当正在写入的映射达到容量时,替换/清除只读映射并切换。数据库世界中的一种可能性是拥有两个(或可能更多)映射。查找同时使用两个地图。只给一个人写信。当正在写入的映射达到容量时,请替换/清除只读映射并切换。您的意思是要避免使用键分布广泛的映射还是?为什么不使用
iterator.remove()
?它反映在地图上。我想限制地图随时间的增长。我不应该经常达到这个限制…不要使用迭代器
并在对活动列表进行迭代时删除(或添加)活动列表中的元素-这会导致迭代器出现未指定的行为。改用迭代器.remove()
方法。(cf.))在我看来不太安全……你的意思是你在试图避免使用键分布广泛的映射还是?为什么不使用iterator.remove()
?它反映在地图上。我想限制地图随时间的增长。我不应该经常达到这个限制…不要使用迭代器
并在对活动列表进行迭代时删除(或添加)活动列表中的元素-这会导致迭代器出现未指定的行为。改用迭代器.remove()
方法。(cf.))对我来说不太安全…我现在正在测试这个。它使用内置/测试的代码,并且它非常简单地实现LRU。哎呀,有点小错误,因为它会在匹配最大大小而不是大于最大大小时删除最后一个元素。我现在正在测试这个。它使用内置/测试的代码,它非常简单地实现了LRU。哎哟,有点小错误,因为当它匹配最大大小时,而不是当它大于最大大小时,它会删除最后一个元素。这是一个非常小的项目,我认为没有必要将它提升到EhCache级别。不过谢谢你的建议。。。我会在将来的项目中记住这一点。ehcache是一个非常好的库。然而,如果可能的话,我总是喜欢简单的开始。这是一个相当小的项目,我不认为有必要将它提升到EhCache级别。不过谢谢你的建议。。。我会在将来的项目中记住这一点。ehcache是一个非常好的库。不过,如果可能的话,我总是喜欢从简单开始。//MapMaker,MapMaker,让我成为一张地图……
//MapMaker,MapMaker,让我成为一张地图……