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 կեշեր իրականացնելու համար։