Ich sah diesen Thread: LinkedHashMap removeEldestEntry: How many elements are removed?LinkedHashMap removeEldestEntry Entfernen von 2 Elementen?
Und es besagt, dass removeEldestEntry nur 1 Element entfernt. Das macht für mich Sinn, aber wenn ich über meinen Code debugge, scheint es 2 Elemente zu entfernen. Ich bin mir nicht sicher warum.
public class LRUCache {
LinkedHashMap<Integer, Integer> LRUMap;
public LRUCache(int capacity) {
LRUMap = new LinkedHashMap<Integer, Integer>() {
@Override
protected boolean removeEldestEntry(Map.Entry<Integer, Integer> eldest) {
return LRUMap.size() > capacity;
}
};
}
public int get(int key) {
if (LRUMap.containsKey(key)) {
int val = LRUMap.remove(key);
LRUMap.put(key, val);
return val;
}
return -1;
}
public void set(int key, int value) {
LRUMap.put(key, value);
}
public static void main(String[] args) {
LRUCache c = new LRUCache(2);
c.set(2,1);
c.set(1,1);
c.set(2,3);
c.set(4,1);
}
}
So kann man daraus ersehen, dass es eingefügt wird: (2,1)
und (1,1)
. Das nächste Element ist, wo die Dinge unordentlich werden. Da der Schlüssel 2 bereits vorhanden ist, wird das Element (2,1)
mit (2,3)
überschrieben. Danach, wenn ich (4,1)
einfügen, habe ich bereits 2 Elemente, so sollte es den ältesten Eintrag entfernen: (1,1)
. Es entfernt jedoch beide (2,3)
und (1,1)
, so dass ich nur mit (4,1)
in der Karte.
Irgendwelche Ideen warum? Ich nehme an, das hat etwas damit zu tun, dass der Schlüssel ersetzt wird und (2,3)
am Anfang der Liste steht, wie es der älteste Eintrag ist, obwohl es nicht sein sollte. Aber ich bin immer noch verwirrt, warum es 2 Elemente entfernen würde.
Nebenbei bemerkt sieht es so aus, als würde es das älteste Element an der Vorderseite des speichern, was uns auch eine konstante Zeitentfernung des ältesten Eintrags geben würde. Ist das wahr?
Nein, es '1,1' nicht entfernen: https://ideone.com/WStVFc –
Hmm, du hast Recht, meine Eclipse zeigt jetzt das gleiche im Debugger. Vielleicht war vorher etwas mit meiner Sonnenfinsternis fehlerhaft. Ok gut danke für die Überprüfung für mich :). – Kevin