Sobes.tech
Junior

LinkedHashMap менен иштедиңби?

sobes.tech AI

AIден жооп

Ооба, тааныш болдум. LinkedHashMap Java жана Kotlin'до Map интерфейсинин ишке ашырылышы болуп саналат. Ал HashMapтин өзгөчөлүктөрүн ( ачкыч боюнча тез жетүү O(1) орто эсеп менен) жана LinkedListтин (элементтердин кошулуу тартибин сактоо) бириктирет.

Негизги өзгөчөлүктөрү:

  • Тартипти сактоо: Итерирөө элементтер боюнча кошулган тартипте жүргүзүлөт.
  • Иштөө жөндөмдүүлүгү: Элементтерди кошуу, өчүрүү жана издөө амортизделген константтык татаалдыктай (O(1)), HashMap сыяктуу.
  • Эс тутум: HashMap менен салыштырганда, LinkedHashMap сактоо үчүн аздыр-көптүр көбүрөөк эс тутумду колдонуп турат.
  • Кирүү режими: Тартипти сактоо режимине орнотуулушу мүмкүн (акыркы колдонулган элементтер акыркы орунга жылдырылат), бул эң аз колдонулган (LRU - Least Recently Used) саясатындагы кэштерди ишке ашырууда пайдалуу.

LRU-кэш үчүн колдонуу мисалы:

// Максималдуу өлчөмү 5 болгон кэш түзөбүз
// Конструктордо true режим киргизүү
LinkedHashMap<String, String> lruCache = new LinkedHashMap<>(5, 0.75f, true) {
    @Override
    protected boolean removeEldestEntry(Map.Entry<String, String> eldest) {
        // Эң эски элементти алып салуу, эгер өлчөмү 5тен ашса
        return size() > 5;
    }
};

lruCache.put("key1", "value1");
lruCache.put("key2", "value2");
lruCache.put("key3", "value3");
System.out.println(lruCache.get("key1")); // key1'ге кирүү, ал акыркыга жылат
lruCache.put("key4", "value4");
lruCache.put("key5", "value5");
lruCache.put("key6", "value6"); // Кэш өлчөмү ашып кетет, эң эски элемент алынып салынат (мисалы, key2, эгер кирүү болбосо; key3, эгер кирүү болсо key1)

System.out.println(lruCache);
// Кирүү режиминде (true) кэш түзөбүз
val lruCache = object : LinkedHashMap<String, String>(5, 0.75f, true) {
    override fun removeEldestEntry(eldest: Map.Entry<String, String>?): Boolean {
        // Эски элементти алып салуу, эгер өлчөмү 5тен ашса
        return size > 5
    }
}

lruCache["key1"] = "value1"
lruCache["key2"] = "value2"
lruCache["key3"] = "value3"
println(lruCache["key1"]) // key1'ге кирүү, ал акыркыга жылат
lruCache["key4"] = "value4"
lruCache["key5"] = "value5"
lruCache["key6"] = "value6" // Кэш өлчөмү ашып кетет, эң эски элемент алынып салынат

println(lruCache)

LinkedHashMap маанилүү, эгер итерирөө тартиби маанилүү болсо жана ошондой эле жөнөкөй LRU-кэштерди ишке ашырууда пайдалуу.