java - 在 Java 中使用 LinkedHasMap 进行缓存

标签 java hashmap

我刚开始使用哈希表结构。我正在使用 LinkedHashMap(例如:cache = new LinkedHashMap<K,V>(...))来实现我自己的缓存。我有一个关于这个数据结构的问题列表:

  1. 我设置了一个参数 capacity = 100(例如),这意味着桶中的项目数限制为 100。然后如果我将一个新项目插入到这个缓存中(当缓存大小 = 100 时),我我正确地认为驱逐政策将会发生?

  2. 在我的实现中,键是复合对象,包括如下两个项目:

    class Key {
    
     public string a;
     public string b;
         @Override
         public int hashCode() {
            final int prime = 31;
             int result = 1;
             result = prime * result + ((a == null) ? 0 : a.hashCode());
             result = prime * result + ((b == null) ? 0 : b.hashCode());
             return result;
         }
     }
    

    有了这个hashcode() ,假设桶中已经有 100 个项目。当我插入一个新项目时,假设 hashcode()返回与前一个项目的重复键,我的理解是 linkedhashmap 将使用逐出策略删除最老的项目并使用 linkedlist 处理新项目的冲突,因此桶中的项目数将为 99。对吗?

  3. 有什么方法可以识别当前桶中的哪些条目包含句柄冲突链?

最佳答案

回答问题一:

  1. 您需要显式覆盖方法 removeEldest 才能使驱逐生效。

默认实现返回 false,所以它不会删除任何元素:

protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
    return false;
}
  1. 问题二:如果您不重写方法 removeEldest

  2. ,您的案例中不会删除任何内容
  3. 问题三:我认为没有办法处理这种情况。

请阅读这篇有用的文章,以更加熟悉基于 LinkedHahMap 的驱逐算法:

http://javarticles.com/2012/06/lru-cache.html

对于补充讲座,另请阅读有关 LFU 驱逐的信息:http://javarticles.com/2012/06/lfu-cache.html

关于java - 在 Java 中使用 LinkedHasMap 进行缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36543087/

相关文章:

java - 在字符串 Arraylist 中查找和打印重复项

Java - 数百万条记录,HashMap 抛出 OutOfMemoryError

java - java中从文件输入

插入枚举值的 Java 泛型?

java - 如何在android中使用Instrument.sendKeyDownUpSync(int keycode)将小写更改为大写

java - Hashmap get(key) 即使值存在也返回 null

java - Hadoop中最原始方式的数据协调

java - 在Java中交换文本文件中的两行

javafx 8 兼容性问题 - FXML 静态字段或方法

java - 使用字符串键和对象引用值创建映射