Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 修剪HashMap的有效方法_Java_Hashmap_Pruning - Fatal编程技术网

Java 修剪HashMap的有效方法

Java 修剪HashMap的有效方法,java,hashmap,pruning,Java,Hashmap,Pruning,我正在用Java创建一个Flyweight,我想确保我不会创建太大的地图。有没有更有效的方法来修剪地图?我没有看到任何可以自动执行此操作的属性(如最大大小构造函数),所以我在代码中执行此操作 以下是我所拥有的,非常基本,但我想确定没有更好的方法: private static void prune() { Iterator<Entry<Integer, Integer[]>> iterator = seeds.entrySet().iterator();

我正在用Java创建一个Flyweight,我想确保我不会创建太大的地图。有没有更有效的方法来修剪地图?我没有看到任何可以自动执行此操作的属性(如最大大小构造函数),所以我在代码中执行此操作

以下是我所拥有的,非常基本,但我想确定没有更好的方法:

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,让我成为一张地图……