我知道这个问题的答案很容易从互联网上获得。我需要知道如果不选择removeEldestEntry会发生什么。下面是我的代码:

package collection;

import java.util.*;

public class MyLinkedHashMap {

   private static final int MAX_ENTRIES = 2;

   public static void main(String[] args) {
      LinkedHashMap lhm = new LinkedHashMap(MAX_ENTRIES, 0.75F, false) {

         protected boolean removeEldestEntry(Map.Entry eldest) {
            return false;
         }
      };
      lhm.put(0, "H");
      lhm.put(1, "E");
      lhm.put(2, "L");
      lhm.put(3, "L");
      lhm.put(4, "O");

      System.out.println("" + lhm);

   }
}

即使我不允许removeEldestEntry,我的代码也可以正常工作。
那么,内部发生了什么?

最佳答案

插入元素后,始终会检查removeEldestEntry。例如,如果重写该方法以始终返回true,则LinkedHashMap将始终为空,因为在每次插入putputAll后,无论如何都将删除最老的元素。 JavaDoc显示了一个关于如何使用它的非常明智的示例:

protected boolean removeEldestEntry(Map.Entry eldest){
    return size() > MAX_SIZE;
}

另外,您可能只想删除不重要的条目:
protected boolean removeEldestEntry(Map.Entry eldest){
    if(size() > MAX_ENTRIES){
       if(isImportant(eldest)){
          //Handle an important entry here, like reinserting it to the back of the list
          this.remove(eldest.getKey());
          this.put(eldest.getKey(), eldest.getValue());
          //removeEldestEntry will be called again, now with the next entry
          //so the size should not exceed the MAX_ENTRIES value
          //WARNING: If every element is important, this will loop indefinetly!
       } else {
           return true; //Element is unimportant
       }
    return false; //Size not reached or eldest element was already handled otherwise
}

10-01 21:45