Sobes.tech
Junior

Vai esat kādreiz strādājis ar LinkedHashMap?

sobes.tech AI

Atbilde no AI

Jā, esmu ar to saskāries. LinkedHashMap Java un Kotlinā ir Map saskarnes realizācija. Tā apvieno HashMap īpašības (ātra piekļuve pēc atslēgas O(1) vidēji) un LinkedList (saglabā elementu ievietošanas kārtību).

Galvenās īpašības:

  • Kārtības saglabāšana: Iterācija caur elementiem notiek to pievienošanas kārtībā.
  • Veiktspēja: Pievieno, dzēš un meklē elementus ar amortizētu konstantiem sarežģītību (O(1)), kā HashMap.
  • Atmiņa: Salīdzinot ar HashMap, LinkedHashMap izmanto nedaudz vairāk atmiņas, lai saglabātu saites starp elementiem.
  • Piekļuves režīms: To var iestatīt uz piekļuves kārtības saglabāšanu (nesen izmantotie elementi tiek pārvietoti uz beigām), kas ir noderīgi īslaicīgo kešatmiņu ar politiku mazāk izmantoto (LRU - Least Recently Used) ieviešanai.

Piemērs LRU kešatmiņai:

// Izveidojam kešatmiņu ar maksimālo izmēru 5
// true konstruktorā ieslēdz piekļuves režīmu
LinkedHashMap<String, String> lruCache = new LinkedHashMap<>(5, 0.75f, true) {
    @Override
    protected boolean removeEldestEntry(Map.Entry<String, String> eldest) {
        // Noņemam vecāko elementu, ja izmērs pārsniedz 5
        return size() > 5;
    }
};

lruCache.put("key1", "value1");
lruCache.put("key2", "value2");
lruCache.put("key3", "value3");
System.out.println(lruCache.get("key1")); // Piekļuve key1, tas tiek pārvietots uz beigām
lruCache.put("key4", "value4");
lruCache.put("key5", "value5");
lruCache.put("key6", "value6"); // Kešatmiņa pārsniedz izmēru, tiek izņemts vecākais (key2, ja bez piekļuves; key3, ja ar piekļuvi pie key1)

System.out.println(lruCache);
// Izveidojam ar piekļuves režīmu (true)
val lruCache = object : LinkedHashMap<String, String>(5, 0.75f, true) {
    override fun removeEldestEntry(eldest: Map.Entry<String, String>?): Boolean {
        // Noņemam vecāko elementu, ja izmērs pārsniedz 5
        return size > 5
    }
}

lruCache["key1"] = "value1"
lruCache["key2"] = "value2"
lruCache["key3"] = "value3"
println(lruCache["key1"]) // Piekļuve key1, tas tiek pārvietots uz beigām
lruCache["key4"] = "value4"
lruCache["key5"] = "value5"
lruCache["key6"] = "value6" // Kešatmiņa pārsniedz izmēru, tiek izņemts vecākais

println(lruCache)

LinkedHashMap ir noderīga, kad ir svarīga iterācijas kārtība, kā arī vienkāršai LRU kešatmiņu īstenošanai.