{"id":1674,"date":"2013-01-30T11:31:20","date_gmt":"2013-01-30T09:31:20","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=1674"},"modified":"2013-01-30T11:31:20","modified_gmt":"2013-01-30T09:31:20","slug":"linkedhashmap-und-lru-implementierungen","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2013\/01\/linkedhashmap-und-lru-implementierungen\/","title":{"rendered":"LinkedHashMap und LRU-Implementierungen"},"content":{"rendered":"<p>Da die Reihenfolge der eingef\u00fcgten Elemente bei einem Assoziatspeicher verloren geht, gibt es mit LinkedHashMap eine Mischung, also ein schneller Assoziativspeicher mit gleichzeitiger Speicherung der Reihenfolge der Objekte. Die Bauart vom Klassename LinkedHashMap macht schon deutlich, dass es eine Map ist, und die Reihenfolge der Objekte liefert ein Iterator; es gibt keine listen\u00e4hnliche Schnittstelle mit get(int). LinkedHashMap ist f\u00fcr Assoziativspeicher das, was LinkedHashSet f\u00fcr HashSet ist.<\/p>\n<p>Im Gegensatz zur normalen HashMap ruft LinkedHashMap immer genau dann die besondere Methode boolean removeEldestEntry(Map.Entry&lt;K,V&gt; eldest) auf, wenn intern ein Element der Sammlung hinzugenommen wird. Die Standardimplementierung dieser Methode liefert immer false, was bedeutet, dass das \u00e4lteste Element nicht gel\u00f6scht werden soll, wen ein neues hinzukommt. Doch bietet das JDK die Methode aus Absicht protected an, denn sie kann von uns \u00fcberschrieben werden, um eine Datenstruktur aufzubauen, die eine maximal Anzahl Elemente hat. So sieht das aus:<\/p>\n<pre class=\"csharpcode\">package com.tutego.insel.util.map;\n\nimport java.util.*;\n\n<span class=\"kwrd\">public<\/span> <span class=\"kwrd\">class<\/span> LRUMap&lt;K,V&gt; extends LinkedHashMap&lt;K, V&gt; {\n  <span class=\"kwrd\">private<\/span> final <span class=\"kwrd\">int<\/span> capacity;\n\n  <span class=\"kwrd\">public<\/span> LRUMap( <span class=\"kwrd\">int<\/span> capacity ) {\n    super( capacity, 0.75f, <span class=\"kwrd\">true<\/span> );\n    <span class=\"kwrd\">this<\/span>.capacity = capacity;\n  }\n\n  @Override\n  <span class=\"kwrd\">protected<\/span> boolean removeEldestEntry( Map.Entry&lt;K, V&gt; eldest ) {\n    <span class=\"kwrd\">return<\/span> size() &gt; capacity;\n  }\n}<\/pre>\n<style type=\"text\/css\">\n.csharpcode, .csharpcode pre\n{\n\tfont-size: small;\n\tcolor: black;\n\tfont-family: consolas, \"Courier New\", courier, monospace;\n\tbackground-color: #ffffff;\n\t\/*white-space: pre;*\/\n}\n.csharpcode pre { margin: 0em; }\n.csharpcode .rem { color: #008000; }\n.csharpcode .kwrd { color: #0000ff; }\n.csharpcode .str { color: #006080; }\n.csharpcode .op { color: #0000c0; }\n.csharpcode .preproc { color: #cc6633; }\n.csharpcode .asp { background-color: #ffff00; }\n.csharpcode .html { color: #800000; }\n.csharpcode .attr { color: #ff0000; }\n.csharpcode .alt \n{\n\tbackground-color: #f4f4f4;\n\twidth: 100%;\n\tmargin: 0em;\n}\n.csharpcode .lnum { color: #606060; }<\/style>\n<p>LinkedHashSet bietet eine vergleichbare Methode removeEldestEntry(\u2026) nicht. Wer dies ben\u00f6tigt, muss eine eigene Mengenklasse auf der Basis von LinkedHashMap realisieren.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Da die Reihenfolge der eingef\u00fcgten Elemente bei einem Assoziatspeicher verloren geht, gibt es mit LinkedHashMap eine Mischung, also ein schneller Assoziativspeicher mit gleichzeitiger Speicherung der Reihenfolge der Objekte. Die Bauart vom Klassename LinkedHashMap macht schon deutlich, dass es eine Map ist, und die Reihenfolge der Objekte liefert ein Iterator; es gibt keine listen\u00e4hnliche Schnittstelle mit [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[11],"tags":[],"class_list":["post-1674","post","type-post","status-publish","format-standard","hentry","category-insel"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1674","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=1674"}],"version-history":[{"count":0,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1674\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=1674"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=1674"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=1674"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}